os.mkdir(sti) returnerer OSError når mappen eksisterer ikke

Jeg ringer til os.mkdir til at oprette en mappe med et bestemt sæt af data genereret. Men selv om den vej, jeg angiver, er ikke blevet skabt, os.mkdir(sti) rejser en OSError, at den sti, der allerede eksisterer.

For eksempel, jeg kalder:

os.mkdir(test)

Dette opkald resultater i OSError: [Errno 17] File exists: 'test' selv om jeg ikke har en test mappe eller en fil med navnet test hvor som helst.

BEMÆRK: den faktiske sti navn jeg bruger, er ikke “test”, men noget mere uklar, at jeg er sikker på ikke er nævnt nogen steder.

Hjælp please?

OriginalForfatteren Quanquan Liu | 2013-09-24

8 svar

  1. 34

    Greg ‘ s svar er korrekte, men som ikke går langt nok. OSError har sub-fejl betingelser, og du ikke ønsker at undertrykke dem alle hver gang. Det er klogt at fælde bare forventes OS fejl.

    Gøre en ekstra kontrol af, før du beslutter dig for at undertrykke den undtagelse, som denne:

    import errno
    import os
    
    try:
        os.mkdir(dirname)
    except OSError as exc:
        if exc.errno != errno.EEXIST:
            raise
        pass

    Du sandsynligvis ikke ønsker at undertrykke errno.EACCES (Permission denied), errno.ENOSPC (No space left on device), errno.EROFS
    (Skrivebeskyttet filsystem) osv. Eller måske du ønsker at — men der skal være en bevidst beslutning baseret på den specifikke logik om, hvad du bygger.

    Greg kode undertrykker alle OS fejl; det er usikkert, ligesom except Exception er usikre.

    Dette er det eneste rigtige svar. “Se før du spring” – tilgang, ved hjælp os.stien.findes som andre har foreslået, skaber en ” race condition: det er fuldt ud muligt for den fil/dir til at være skabt mellem de eksisterer, og mkdir/makedirs opkald, der ville generere en ikke-afviklet undtagelse.
    Dette er ikke “rigtige svar”, da den “race condition” er ikke et relevant problem i alle (måske endda de fleste) tilfælde af brug.
    når den rigtige måde er lige så nemt eller nemmere end at gøre det på den forkerte måde, at ikke gøre det på den rigtige måde hver gang, er uansvarligt. Hvis du gør det på den rigtige måde hver gang, behøver du ikke at spilde tid & energi på at tænke over det. Gode udviklere fokus på at udvikle sunde vaner.
    sandt, men i dette tilfælde “så let” er tvivlsom i form af læsbarhed. Den rette balance mellem disse forskellige aspekter, afhænger af dine use case. Ofre læsbarhed for modstand til race betingelser, der aldrig ske i dit miljø er for tidlig optimering.
    hvad viste jeg er den normale tilgang til en Python-udvikler. Hvis det ikke kan læses, så uanset hvem der har læst den ikke forstår Python meget godt. Medmindre du kører på en single-threaded OS, potentialet for denne særlige race-tilstand altid er til stede.

    OriginalForfatteren Chris Johnson

  2. 21

    Bare kontrollere, om stien eksisterer. hvis ikke skabe det

    if not os.path.exists(test):
            os.makedirs(test)
    Dette svar er forkert og farligt. Det skaber en “race condition”, da biblioteket kunne være skabt af en anden proces efter exists opkald, og før de makedirs opkald. Se mit svar til en ordentlig løsning.
    hehe, hvor mange miliseconds tror du, der vil være mellem de to udsagn 🙂 men ja, du har ret 🙂
    Det vil ske lige ofte nok til at drive dig til vanvid forsøger at fejlsøge det 🙂
    i form af miljøet du arbejder? og hvor mange processer er der?
    En berømt person engang sagde: en én ud af En million chance er næste tirsdag.

    OriginalForfatteren lordkain

  3. 14

    I Python 3.2 og derover, kan du bruge:

    os.makedirs(path, exist_ok=True)

    at undgå at få en undtagelse, hvis den mappe, der allerede eksisterer. Dette vil stadig rejse en undtagelse, hvis path eksisterer, og det er ikke en mappe.

    Hjælp exist_ok=True i makedirs vil stadig rejse FileExistsError hvis target sti eksisterer, og det er ikke en mappe (fil -, blok-enhed, …) 🙁
    Det er en god pointe, at dette ikke er en drop-in erstatning for at fange FileExistsError, selv om der ofte du ønsker en undtagelse, når du forsøger at oprette en mappe på toppen af en fil.

    OriginalForfatteren 1”

  4. 3

    Jeg har også stået over for det samme problem, specielt, når strengen ‘test’ indeholder flere mappe navn.
    Så når ‘test’, der indeholder den mappe –

    if not os.path.exists(test):
    try:
        os.makedir(test)
    except:
        raise OSError("Can't create destination directory (%s)!" % (test))  

    Hvis ‘test’ indeholder flere bibliotek som ‘\kat1\kat2’ så –

    if not os.path.exists(test):
    try:
        os.makedirs(test)
    except:
        raise OSError("Can't create destination directory (%s)!" % (test))  
    Den if tjener intet formål.
    Dette if erklæring beskytter mod overskrivning af den eksisterende mappe med samme navn.
    Nej det gør det ikke. Operativsystemet vil forhindre overskrivning af, om du tjekke, før eller ej. Medmindre du kører på en single-threaded operativsystem, en anden proces kan skabe biblioteket efter den tid du kontrollere den mappe ikke findes, og den tid, du forsøger at oprette det. Hele pointen med at fange undtagelsen er at beskæftige sig med, hvad der sker, hvis den mappe, der allerede eksisterer, hvad enten det kom i stand i sidste uge eller 1 mikrosekund siden. Den if tjener intet formål. Den try/except er den eneste pålidelige metode.

    OriginalForfatteren Anupam Bera

  5. 1

    Jeg kender ikke detaljerne i dit filsystem. Men hvis du virkelig ønsker at komme omkring dette måske bruge en prøve/bortset fra klausul?

    try:
        os.mkdir(test)
    except OSError:
        print "test already exists"

    Du kan altid gøre nogle form for debugging i mellemtiden.

    Fejlmeddelelsen er forkert. Den OSError undtagelse kan ske af mange grunde, fx utilstrækkelige tilladelser eller en skrivebeskyttet fil system. Du kan ikke konkludere, at den mappe, der allerede eksisterer. Du er nødt til at kontrollere værdien af exc.errno for at fastslå årsagen til undtagelsen.

    OriginalForfatteren Greg

  6. 1

    Du har en fil med det navn,test. Du kan ikke lave en mappe med præcis samme navn.

    OriginalForfatteren CT Zhu

  7. 1

    Er sket for mig på Windows, måske dette er tilfældet:

    Ligesom dig, at jeg forsøgte at :

    os.mkdir(dirname)

    og fik OSError: [Errno 17] File exists: '<dirname>'.
    Når jeg løb:

    os.path.exists(dirname)

    Jeg fik falsk, og det drev mig til vanvid, for en stund 🙂

    Problemet var: I et bestemt vindue, jeg var i en specifik mappe. Selvom det ikke eksisterer på det tidspunkt (jeg har fjernet det fra linux). Løsningen blev at lukke vinduet \ navigere til et andet sted.
    Skammeligt, jeg kender …

    OriginalForfatteren Omer Dagan

  8. 0

    Kan være at der er en skjult mappe navn test i kataloget.Ind Manuelt, hvis det eksisterer.

    ls -a

    Opret kun, hvis det ikke findes

    if not os.path.exists(test):
        os.makedirs(test)
    Dette svar er forkert og farligt. Det skaber en “race condition”, da biblioteket kunne være skabt af en anden proces efter exists opkald, og før de makedirs opkald. Se mit svar til en ordentlig løsning.
    Hvis det er skjult, det kan umuligt blive kaldt test, højre? Det skal være .test, som er et anderledes streng

    OriginalForfatteren Tabraiz Ali

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *