Periksa apakah ada direktori dan buat jika perlu?
Jawaban langsung untuk ini adalah, dengan asumsi situasi sederhana di mana Anda tidak mengharapkan pengguna lain atau proses untuk mengacaukan direktori Anda:
if not os.path.exists(d):
os.makedirs(d)
atau jika membuat direktori tunduk pada kondisi balapan (yaitu jika setelah memeriksa jalur ada, sesuatu yang lain mungkin telah membuatnya) lakukan ini:
import errno
try:
os.makedirs(d)
except OSError as exception:
if exception.errno != errno.EEXIST:
raise
Tapi mungkin pendekatan yang lebih baik adalah menghindari masalah pertentangan sumber daya, dengan menggunakan direktori sementara melalui tempfile
:
import tempfile
d = tempfile.mkdtemp()
Inilah hal-hal penting dari dokumen online:
mkdtemp(suffix='', prefix='tmp', dir=None)
User-callable function to create and return a unique temporary
directory. The return value is the pathname of the directory.
The directory is readable, writable, and searchable only by the
creating user.
Caller is responsible for deleting the directory when done with it.
Baru dalam Python 3.5: pathlib.Path
denganexist_ok
Ada Path
objek baru (pada 3.4) dengan banyak metode yang ingin digunakan dengan path - salah satunya mkdir
.
(Untuk konteksnya, saya sedang melacak perwakilan mingguan saya dengan sebuah skrip. Inilah bagian kode yang relevan dari skrip yang memungkinkan saya menghindari memukul Stack Overflow lebih dari sekali sehari untuk data yang sama.)
Pertama impor yang relevan:
from pathlib import Path
import tempfile
Kami tidak harus berurusan dengan os.path.join
sekarang - cukup gabungkan bagian-bagian jalur dengan /
:
directory = Path(tempfile.gettempdir()) / 'sodata'
Lalu saya yakin memastikan direktori itu ada - exist_ok
argumen muncul di Python 3.5:
directory.mkdir(exist_ok=True)
Inilah bagian yang relevan dari dokumentasi :
Jika exist_ok
benar, FileExistsError
pengecualian akan diabaikan (perilaku yang sama dengan POSIX mkdir -p
perintah), tetapi hanya jika komponen jalur terakhir bukan file non-direktori yang ada.
Berikut ini sedikit lebih banyak skrip - dalam kasus saya, saya tidak tunduk pada kondisi balapan, saya hanya memiliki satu proses yang mengharapkan direktori (atau file yang terkandung) berada di sana, dan saya tidak memiliki apa pun yang mencoba untuk menghapus direktori.
todays_file = directory / str(datetime.datetime.utcnow().date())
if todays_file.exists():
logger.info("todays_file exists: " + str(todays_file))
df = pd.read_json(str(todays_file))
Path
objek harus dipaksa str
sebelum API lain yang mengharapkan str
jalur dapat menggunakannya.
Mungkin Panda harus diperbarui untuk menerima contoh dari kelas dasar abstrak os.PathLike
,.