Bir dizinin mevcut olup olmadığını kontrol edin ve gerekiyorsa oluşturun?
Bunun doğrudan cevabı, diğer kullanıcıların veya işlemlerin dizininizle uğraşmasını beklemediğiniz basit bir durum olduğunu varsayar:
if not os.path.exists(d):
os.makedirs(d)
veya dizini yapmak yarış koşullarına tabi ise (yani, yolu kontrol ettikten sonra, başka bir şey zaten yapmış olabilir) bunu yapın:
import errno
try:
os.makedirs(d)
except OSError as exception:
if exception.errno != errno.EEXIST:
raise
Ancak belki de daha iyi bir yaklaşım, geçici dizinleri kullanarak kaynak çekişme sorununu ortadan kaldırmaktır tempfile
:
import tempfile
d = tempfile.mkdtemp()
Online dokümanın temel bilgileri:
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.
Python 3.5 yenilikler: pathlib.Path
ileexist_ok
Biri Path
yollarla kullanmak isteyecek birçok yöntem içeren yeni bir nesne (3.4'ten itibaren) var mkdir
.
(Bağlam için, haftalık temsilcimi bir komut dosyasıyla izliyorum. İşte, aynı veri için günde bir kereden fazla Stack Overflow'a çarpmama izin veren koddaki ilgili kod parçaları.)
İlk olarak ilgili ithalatlar:
from pathlib import Path
import tempfile
os.path.join
Şimdi uğraşmak zorunda değiliz - sadece yol parçalarına aşağıdakilerle katılın /
:
directory = Path(tempfile.gettempdir()) / 'sodata'
Sonra idempotently dizini var sağlamak - exist_ok
argüman Python 3.5 görünür:
directory.mkdir(exist_ok=True)
İşte belgelerin ilgili kısmı :
exist_ok
True olursa , FileExistsError
istisnalar yok sayılır ( POSIX mkdir -p
komutla aynı davranış ), ancak yalnızca son yol bileşeni varolan bir dizin dışı dosya değilse.
İşte senaryo biraz daha - benim durumumda, bir yarış koşuluna tabi değilim, sadece dizinin (veya içerdiği dosyaları) orada olmasını bekleyen bir işlemim var ve kaldırmaya çalışan bir şeyim yok Rehber.
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
nesnelerin, yolları kullanabilmelerini str
bekleyen diğer API'lerden önce zorlanmaları str
gerekir.
Belki de Pandalar soyut temel sınıfın örneklerini kabul edecek şekilde güncellenmelidir os.PathLike
.