További
Hogyan hozhatok létre biztonságosan egy beágyazott könyvtárat?
Mi a legelegánsabb módja annak, hogy ellenőrizzük, hogy létezik-e a könyvtár, ahová egy fájlt írunk, és ha nem, akkor hozzuk létre a könyvtárat Python segítségével? Itt van, amit megpróbáltam:
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)
Valahogy kimaradt az os.path.exists
(köszönöm kanja, Blair és Douglas). Ez az, ami most van:
def ensure_dir(file_path):
directory = os.path.dirname(file_path)
if not os.path.exists(directory):
os.makedirs(directory)
Van olyan flag a "open" -hoz, ami ezt automatikusan megtörténteti?
3872
3
Két jó tulajdonságokkal rendelkező választ látok, mindkettőnek van egy-egy apró hibája, ezért elmondom a véleményemet:
path.exists
][1], és fontolja meg a [
os.makedirs`]2 létrehozását.Amint azt a megjegyzésekben és máshol is megjegyeztük, van egy versenyfeltétel – ha a könyvtár az
os.path.exists
és azos.makedirs
hívások között jön létre, azos.makedirs
egyOSError
hibával fog sikertelenül működni. Sajnos azOSError
általános fogása és a folytatás nem bolondbiztos, mivel figyelmen kívül hagyja a könyvtár létrehozásának más tényezők miatti sikertelenségét, például elégtelen jogosultságok, tele lemez stb. miatt.Az egyik lehetőség az
OSError
csapdába ejtése és a beágyazott hibakód vizsgálata lenne (lásd Is there a cross-platform way of getting information from Python's OSError):Alternatív megoldás lehet egy második
os.path.exists
, de tegyük fel, hogy egy másik létrehozta a könyvtárat az első ellenőrzés után, majd eltávolította a második ellenőrzés előtt – még mindig becsaphatnak minket.Az alkalmazástól függően az egyidejű műveletek veszélye nagyobb vagy kisebb lehet, mint az egyéb tényezők, például a fájljogosultságok által jelentett veszély. A fejlesztőnek többet kellene tudnia az adott fejlesztendő alkalmazásról és annak várható környezetéről, mielőtt kiválasztja a megvalósítást.
A Python modern verziói elég sokat javítanak ezen a kódon, mind a
FileExistsError
(a 3.3+ verzióban), mind aFileExistsError
[5][6][7][7][7][7][7]......és azáltal, hogy lehetővé teszi az
os.makedirs
kulcsszavas argumentumát, azexist_ok
-t (a 3.2+ verzióban).Ellenőrizze
os.makedirs
: (Biztosítja, hogy a teljes elérési útvonal létezik.) Annak kezelésére, hogy a könyvtár esetleg létezik, aOSError
fogása. (Ha azexist_ok
értékeFalse
(alapértelmezett), akkorOSError
jelzést kap, ha a célkönyvtár már létezik.)Próbálja ki az
os.path.exists
függvényt.