os.path.dirname (__ file__) ส่งคืนค่าว่าง


165

ฉันต้องการรับพา ธ ของไดเรกทอรีปัจจุบันภายใต้ไฟล์. py ที่ถูกเรียกใช้งาน

ตัวอย่างเช่นไฟล์อย่างง่ายD:\test.pyพร้อมรหัส:

import os

print os.getcwd()
print os.path.basename(__file__)
print os.path.abspath(__file__)
print os.path.dirname(__file__)

มันแปลกที่ผลลัพธ์คือ:

D:\
test.py
D:\test.py
EMPTY

ฉันคาดหวังว่าผลเดียวกันจากและgetcwd()path.dirname()

ให้os.path.abspath = os.path.dirname + os.path.basenameไว้ทำไม

os.path.dirname(__file__)

ผลตอบแทนที่ว่างเปล่า?

คำตอบ:


257

เพราะos.path.abspath = os.path.dirname + os.path.basenameไม่ถือ เราค่อนข้างมี

os.path.dirname(filename) + os.path.basename(filename) == filename

ทั้งสองอย่างdirname()และbasename()แยกชื่อไฟล์ที่ส่งผ่านเป็นส่วนประกอบเท่านั้นโดยไม่คำนึงถึงไดเรกทอรีปัจจุบัน หากคุณต้องการพิจารณาไดเรกทอรีปัจจุบันคุณต้องทำอย่างชัดเจน

ในการรับ dirname ของพา ธ สัมบูรณ์ให้ใช้

os.path.dirname(os.path.abspath(__file__))

3
สวัสดี Sven คุณพูดถูกต้องมันควรเป็น os.path.dirname (os.path.abspath ( ไฟล์ )) ขอบคุณ! เพียงแค่ FYI คุณจะได้รับตัวพิมพ์เล็ก ๆ ในบรรทัดสุดท้าย
เกล็ด

11
ทราบว่าความคิดเห็นข้างต้นมีตัวหนาที่ควรจะขีดเส้นใต้ทั้งสองด้านเนื่องจากการจัดรูปแบบเครื่องหมาย คำตอบเดิมเปลี่ยนไปอย่างถูกต้อง
watsonic

1
โปรดทราบว่าเราไม่เคยมีos.path.dirname(filename) + os.path.basename(filename) == filenameเนื่องจากตัวแยกไดเรกทอรีหายไป เราควรมี:os.path.join(os.path.dirname(filename), os.path.basename(filename)) == filename
Jean Paul

ฉันสับสนคุณควรออกจาก basedir = os.path.abspath (os.path.dirname ( ไฟล์ )) ในโปรแกรมของคุณหรือไม่ หรือสิ่งที่คุณแทนที่หรือที่คุณจะเปลี่ยนเส้นทางของคุณเช่น C: \ Users \ Test \ app.db
0004

@ pes04 __file__ขยายเป็นชื่อของไฟล์ปัจจุบันดังนั้นคุณสามารถใช้สำเนาคำต่อคำของรหัสจากคำตอบนี้
Sven Marnach



6
os.path.split(os.path.realpath(__file__))[0]

os.path.realpath(__file__)คืนค่า abspath ของสคริปต์ปัจจุบัน os.path.split (abspath) [0] คืนค่า dir ปัจจุบัน


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.