Daugiau
Kaip saugiai sukurti įterptinį katalogą?
Koks elegantiškiausias būdas patikrinti, ar katalogas, į kurį ketinama įrašyti failą, egzistuoja, o jei ne, sukurti katalogą naudojant "Python"? Štai ką bandžiau:
import os
file_path = "/my/directory/filename.txt"
directory = os.path.dirname(file_path)
try:
os.stat(directory)
except:
os.mkdir(directory)
f = file(filename)
Kažkaip nepastebėjau os.path.exists
(ačiū kanja, Blair ir Douglas). Štai ką turiu dabar:
def ensure_dir(file_path):
directory = os.path.dirname(file_path)
if not os.path.exists(directory):
os.makedirs(directory)
Ar yra "open" vėliavėlė, kad tai įvyktų automatiškai?
3872
3
Matau du atsakymus su geromis savybėmis ir po nedidelį trūkumą, todėl pateiksiu savo požiūrį:
Išbandykite
os.path.exists
ir apsvarstykiteos.makedirs
sukūrimui.Kaip pažymėta komentaruose ir kitur, yra lenktynių sąlyga; jei katalogas sukuriamas tarp
os.path.exists
iros.makedirs
iškvietimų,os.makedirs
nepavyks suOSError
. Deja, visuotinisOSError
fiksavimas ir tęsimas nėra patikimas, nes bus ignoruojamas nesėkmingas katalogo sukūrimas dėl kitų veiksnių, pavyzdžiui, nepakankamų leidimų, pilno disko ir t. t.Viena iš galimybių būtų gaudyti
OSError
ir nagrinėti įterptą klaidos kodą (žr. skyrių Is there there a cross-platform way of getting information from Python's OSError):Arba gali būti antrasis
os.path.exists
, bet tarkime, kad kitas sukūrė katalogą po pirmojo patikrinimo, o paskui jį pašalino prieš antrąjį – mes vis tiek galime būti apgauti.Priklausomai nuo taikomosios programos, vienu metu atliekamų operacijų pavojus gali būti didesnis arba mažesnis nei pavojus, kurį kelia kiti veiksniai, pavyzdžiui, failų leidimai. Kūrėjas, prieš pasirinkdamas realizaciją, turėtų daugiau sužinoti apie konkrečią kuriamą taikomąją programą ir numatomą jos aplinką.
Šiuolaikinėse Python versijose šis kodas yra gerokai patobulintas, nes jame atsirado
FileExistsError
(3.3+ versijoje)......ir leidžiant raktinį
os.makedirs
argumentą, vadinamąexist_ok
(3.2+ versijoje).Patikrinkite
os.makedirs
: (Įsitikinama, kad visas kelias egzistuoja.) Kad būtų atsižvelgta į tai, jog katalogas gali egzistuoti, sugaunamaOSError
. (Jeiexist_ok
yraFalse
(numatytoji reikšmė), jei tikslinis katalogas jau egzistuoja, iškeliamaOSError
.)Išbandykite funkciją
os.path.exists