Mikä on tyylikkäin tapa tarkistaa, onko hakemisto, johon tiedosto kirjoitetaan, olemassa, ja jos ei, luoda hakemisto Pythonilla? Kokeilin seuraavaa:
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)
Jotenkin missasin os.path.exists
(kiitos kanja, Blair ja Douglas). Tämä on mitä minulla on nyt:
def ensure_dir(file_path):
directory = os.path.dirname(file_path)
if not os.path.exists(directory):
os.makedirs(directory)
Onko "open" -lippua, joka saa tämän tapahtumaan automaattisesti?
Näen kaksi vastausta, joilla on hyviä ominaisuuksia ja joissa kummassakin on pieni puute, joten annan oman näkemykseni asiasta:
1], ja harkitse os.makedirs
luomista varten.
import os
if not os.path.exists(directory):
os.makedirs(directory)
Kuten kommenteissa ja muualla on todettu, on olemassa kilpailuehto – jos hakemisto luodaan os.path.exists
- ja os.makedirs
-kutsujen välillä, os.makedirs
epäonnistuu OSError
-ilmoituksella. Valitettavasti OSError
-virheen kattava havaitseminen ja jatkaminen ei ole täysin varmaa, koska se ei huomioi hakemiston luomisen epäonnistumista muiden tekijöiden, kuten riittämättömien oikeuksien, täyden levyn jne. takia.
Yksi vaihtoehto olisi pyydystää OSError
ja tutkia sen sisältämä virhekoodi (ks. Onko olemassa alustarajat ylittävä tapa saada tietoa Pythonin OSErrorista):
import os, errno
try:
os.makedirs(directory)
except OSError as e:
if e.errno != errno.EEXIST:
raise
Vaihtoehtoisesti voisi olla toinen os.path.exists
, mutta oletetaan, että joku muu loi hakemiston ensimmäisen tarkistuksen jälkeen ja poisti sen sitten ennen toista tarkistusta – meitä voitaisiin silti huijata.
Sovelluksesta riippuen samanaikaisten toimintojen vaara voi olla suurempi tai pienempi kuin muiden tekijöiden, kuten tiedostojen käyttöoikeuksien, aiheuttama vaara. Kehittäjän olisi tiedettävä enemmän kehitettävästä sovelluksesta ja sen odotetusta ympäristöstä ennen toteutuksen valintaa.
Nykyaikaiset Python-versiot parantavat tätä koodia melkoisesti, sekä paljastamalla FileExistsError
(3.3+:ssa)...
try:
os.makedirs("path/to/directory")
except FileExistsError:
# directory already exists
pass
...ja sallimalla avainsana-argumentti os.makedirs
:lle nimeltä exist_ok
(3.2+).
os.makedirs("path/to/directory", exist_ok=True) # succeeds even if directory exists.
Tarkista os.makedirs
: (Se varmistaa, että koko polku on olemassa.)
Käsittele sitä, että hakemisto saattaa olla olemassa, nappaa OSError
.
(Jos exist_ok
on False
(oletusarvo), syntyy OSError
, jos kohdehakemisto on jo olemassa.))
import os
try:
os.makedirs('./path/to/somewhere')
except OSError:
pass
Kokeile funktiota os.path.exists
.
if not os.path.exists(dir):
os.mkdir(dir)