Check if a directory exists and create it if necessary?
คำตอบโดยตรงสำหรับสิ่งนี้คือ สมมติว่าเป็นสถานการณ์ง่ายๆ ที่คุณไม่ได้คาดหวังให้ผู้ใช้หรือกระบวนการอื่นมายุ่งกับไดเรกทอรีของคุณ:
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'
จากนั้นฉันก็แน่ใจว่ามีไดเร็กทอรีอยู่ - exist_ok
อาร์กิวเมนต์แสดงใน Python 3.5:
directory.mkdir(exist_ok=True)
นี่คือส่วนที่เกี่ยวข้องของเอกสารประกอบ :
If exist_ok
is true, FileExistsError
exceptions will be ignored (same behavior as the POSIX mkdir -p
command), but only if the last path component is not an existing non-directory file.
นี่เป็นสคริปต์เพิ่มเติมเล็กน้อย - ในกรณีของฉัน ฉันไม่ได้อยู่ภายใต้เงื่อนไขการแข่งขัน ฉันมีกระบวนการเดียวที่คาดว่าไดเรกทอรี (หรือไฟล์ที่มีอยู่) จะอยู่ที่นั่น และฉันไม่มีอะไรพยายามลบ ไดเร็กทอรี
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
.