ตรวจสอบว่ามีไดเรกทอรีอยู่หรือไม่และสร้างถ้าจำเป็น?
คำตอบตรงนี้คือสมมติว่าสถานการณ์ง่าย ๆ ที่คุณไม่คาดหวังให้ผู้ใช้หรือกระบวนการอื่น ๆ ทำกับไดเรกทอรีของคุณ:
if not os.path.exists(d):
os.makedirs(d)
หรือถ้าการทำไดเร็กตอรี่นั้นขึ้นอยู่กับสภาพการแข่งขัน (เช่นถ้าหลังจากตรวจสอบเส้นทางแล้ว, มีอย่างอื่นที่ทำให้มันเรียบร้อย) ทำสิ่งนี้:
import errno
try:
os.makedirs(d)
except OSError as exception:
if exception.errno != errno.EEXIST:
raise
แต่บางทีวิธีที่ดีกว่าคือการหลีกเลี่ยงปัญหาการช่วงชิงทรัพยากรโดยใช้ไดเรกทอรีชั่วคราวผ่านtempfile
:
import tempfile
d = tempfile.mkdtemp()
นี่คือสิ่งจำเป็นจากเอกสารออนไลน์:
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: pathlib.Path
ด้วยexist_ok
มีPath
วัตถุใหม่(จาก 3.4) ด้วยวิธีการมากมายที่เราต้องการใช้กับเส้นทาง - ซึ่งหนึ่งในนั้นคือmkdir
หนึ่งในนั้นคือ
(สำหรับบริบทฉันกำลังติดตามตัวแทนรายสัปดาห์ของฉันด้วยสคริปต์นี่คือส่วนต่าง ๆ ของรหัสที่เกี่ยวข้องจากสคริปต์ที่ให้ฉันหลีกเลี่ยงการกดปุ่ม Stack Overflow มากกว่าหนึ่งครั้งต่อวันสำหรับข้อมูลเดียวกัน)
ก่อนนำเข้าที่เกี่ยวข้อง:
from pathlib import Path
import tempfile
เราไม่ต้องจัดการกับos.path.join
ตอนนี้ - เพียงเข้าร่วมส่วนเส้นทางด้วย/
:
directory = Path(tempfile.gettempdir()) / 'sodata'
จากนั้นฉันให้แน่ใจว่า idempotently ไดเรกทอรีอยู่ - exist_ok
อาร์กิวเมนต์ที่แสดงใน Python 3.5:
directory.mkdir(exist_ok=True)
นี่คือส่วนที่เกี่ยวข้องของเอกสาร :
หากexist_ok
เป็นจริงFileExistsError
ข้อยกเว้นจะถูกละเว้น (พฤติกรรมเช่นเดียวกับPOSIX mkdir -p
คำสั่ง) แต่เฉพาะในกรณีที่องค์ประกอบเส้นทางสุดท้ายไม่ใช่ไฟล์ที่ไม่ใช่ไดเรกทอรีที่มีอยู่
นี่เป็นสคริปต์อีกเล็กน้อย - ในกรณีของฉันฉันไม่อยู่ภายใต้เงื่อนไขการแข่งขันฉันมีเพียงกระบวนการเดียวที่คาดว่าจะมีไดเรกทอรี (หรือไฟล์ที่มีอยู่) และฉันไม่มีอะไรพยายามลบ ไดเรกทอรี
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
วัตถุจะต้องถูกบีบบังคับstr
ก่อนที่ API อื่นที่คาดว่าstr
จะสามารถใช้พา ธ เหล่านั้นได้
บางที Pandas ควรได้รับการปรับปรุงเพื่อยอมรับอินสแตนซ์ของคลาสฐานนามธรรม, os.PathLike
.