ฉันเคยเปิดไฟล์ที่อยู่ในไดเรกทอรีเดียวกันกับสคริปต์ Python ที่กำลังรันอยู่โดยใช้คำสั่งเช่น
open("Some file.txt", "r")
อย่างไรก็ตามฉันค้นพบว่าเมื่อสคริปต์รันใน Windows โดยการดับเบิลคลิกมันจะพยายามเปิดไฟล์จากไดเรกทอรีที่ไม่ถูกต้อง
ตั้งแต่นั้นมาฉันใช้คำสั่งของแบบฟอร์ม
open(os.path.join(sys.path[0], "Some file.txt"), "r")
เมื่อใดก็ตามที่ฉันต้องการเปิดไฟล์ สิ่งนี้ใช้ได้กับการใช้งานเฉพาะของฉัน แต่ฉันไม่แน่ใจว่าsys.path[0]
อาจล้มเหลวในกรณีการใช้งานอื่น ๆ
ดังนั้นคำถามของฉันคือวิธีที่ดีที่สุดและน่าเชื่อถือที่สุดในการเปิดไฟล์ที่อยู่ในไดเรกทอรีเดียวกับสคริปต์ Python ที่กำลังทำงานอยู่คืออะไร?
นี่คือสิ่งที่ฉันสามารถเข้าใจได้:
os.getcwd()
และos.path.abspath('')
ส่งคืน "ไดเรกทอรีทำงานปัจจุบัน" ไม่ใช่ไดเรกทอรีสคริปต์os.path.dirname(sys.argv[0])
และos.path.dirname(__file__)
คืนค่าพา ธ ที่ใช้เรียกสคริปต์ซึ่งอาจสัมพันธ์หรือแม้แต่ว่างเปล่า (หากสคริปต์อยู่ใน cwd) นอกจากนี้__file__
จะไม่มีอยู่เมื่อรันสคริปต์ใน IDLE หรือ PythonWinsys.path[0]
และos.path.abspath(os.path.dirname(sys.argv[0]))
ดูเหมือนจะส่งคืนไดเรกทอรีสคริปต์ ฉันไม่แน่ใจว่ามีความแตกต่างระหว่างสองสิ่งนี้หรือไม่
แก้ไข:
ฉันเพิ่งรู้ว่าสิ่งที่ฉันต้องการจะอธิบายได้ดีกว่าว่า "เปิดไฟล์ในไดเรกทอรีเดียวกันกับโมดูลที่มี" กล่าวอีกนัยหนึ่งถ้าฉันนำเข้าโมดูลที่ฉันเขียนนั้นอยู่ในไดเรกทอรีอื่นและโมดูลนั้นเปิดไฟล์ฉันต้องการให้ค้นหาไฟล์ในไดเรกทอรีของโมดูล ฉันไม่คิดว่าจะพบสิ่งใดที่ฉันสามารถทำได้ ...
__file__
ไม่สามารถนำมาใช้แล้วใช้แทนsys.argv[0]
dirname(__file__)
ส่วนที่เหลือควรทำงานตามที่คาดไว้ ฉันชอบใช้__file__
เพราะในรหัสห้องสมุดsys.argv[0]
อาจไม่ชี้ไปที่รหัสของคุณเลยโดยเฉพาะถ้านำเข้าผ่านสคริปต์ของบุคคลที่สาม