ฉันจะหาเส้นทางแบบเต็มของไดเรกทอรีไฟล์ปัจจุบันได้อย่างไร


801

ฉันต้องการได้รับเส้นทางไดเรกทอรีของไฟล์ปัจจุบัน ฉันเหนื่อย:

>>> os.path.abspath(__file__)
'C:\\python27\\test.py'

แต่ฉันจะดึงเส้นทางของไดเรกทอรีได้อย่างไร

ตัวอย่างเช่น:

'C:\\python27\\'


5
__file__ไม่ได้กำหนดไว้เมื่อคุณเรียกใช้ python เป็นเชลล์แบบโต้ตอบ รหัสชิ้นแรกในคำถามของคุณดูเหมือนว่ามาจากเปลือกโต้ตอบ แต่จริงๆแล้วจะสร้าง a NameErrorอย่างน้อยใน python 2.7.3 แต่คนอื่น ๆ ก็เดาด้วย
drevicko

คำตอบ:


1632

Python 3

สำหรับไดเร็กทอรีของสคริปต์ที่กำลังรัน:

import pathlib
pathlib.Path(__file__).parent.absolute()

สำหรับไดเรกทอรีการทำงานปัจจุบัน:

import pathlib
pathlib.Path().absolute()

Python 2 และ 3

สำหรับไดเร็กทอรีของสคริปต์ที่กำลังรัน:

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

ถ้าคุณหมายถึงไดเรกทอรีการทำงานปัจจุบัน:

import os
os.path.abspath(os.getcwd())

โปรดทราบว่าก่อนและหลังfileเป็นขีดล่างสองอันไม่ใช่เพียงอันเดียว

นอกจากนี้โปรดทราบว่าหากคุณใช้การโต้ตอบหรือโหลดรหัสจากสิ่งอื่นที่ไม่ใช่ไฟล์ (เช่น: ฐานข้อมูลหรือทรัพยากรออนไลน์) __file__อาจไม่สามารถตั้งค่าได้เนื่องจากไม่มีแนวคิดของ "ไฟล์ปัจจุบัน" คำตอบข้างต้นจะถือว่าสถานการณ์ที่พบบ่อยที่สุดของการเรียกใช้สคริปต์หลามที่อยู่ในไฟล์

อ้างอิง

  1. pathlibในเอกสารหลาม
  2. os.path 2.7 , os.path 3.8
  3. os.getcwd 2.7 , os.getcwd 3.8
  4. ตัวแปร __file__ หมายถึงอะไร / ทำอะไร

43
abspath () มีผลบังคับใช้หากคุณไม่ต้องการค้นพบพฤติกรรมแปลก ๆ บน windows โดยที่ dirname ( ไฟล์ ) อาจส่งคืนสตริงว่าง!
โซริน

4
ควรเป็น os.path.dirname (os.path.abspath (OS .__ file__)) หรือไม่
DrBailey

5
@DrBailey: ไม่ไม่มีอะไรพิเศษเกี่ยวกับ ActivePython __file__(โปรดสังเกตว่ามันเป็นเครื่องหมายขีดล่างสองด้านที่ด้านใดด้านหนึ่งของคำ) เป็นส่วนมาตรฐานของงูหลาม ไม่สามารถใช้งานได้ในโมดูลที่ใช้ C ตัวอย่างเช่นควรใช้สคริปต์ python เสมอ
ไบรอัน Oakley

10
ฉันขอแนะนำให้ใช้ realpath แทน abspath เพื่อแก้ไขลิงก์สัญลักษณ์ที่เป็นไปได้
TTimo

12
@ cph2117: วิธีนี้จะใช้ได้เฉพาะเมื่อคุณเรียกใช้ในสคริปต์ ไม่มี__file__หากเรียกใช้จากพรอมต์แบบโต้ตอบ \
ไบรอันโอ๊กเล่ย์

99

การใช้Pathเป็นวิธีที่แนะนำตั้งแต่ Python 3:

from pathlib import Path
print("File      Path:", Path(__file__).absolute())
print("Directory Path:", Path().absolute())  

เอกสาร: pathlib

หมายเหตุ: หากใช้ Jupyter Notebook __file__จะไม่ส่งคืนค่าที่คาดหวังดังนั้นจึงPath().absolute()จำเป็นต้องใช้


17
ฉันต้องทำอย่างไรPath(__file__).parentเพื่อให้ได้โฟลเดอร์ที่มีไฟล์อยู่
YellowPillow

นั่นคือ @YellowPillow ที่ถูกต้องPath(__file__)ทำให้คุณได้รับไฟล์ .parentทำให้คุณได้หนึ่งระดับขึ้นไปเช่นไดเรกทอรีที่มี คุณสามารถเพิ่มมากขึ้น.parentเพื่อที่จะขึ้นไดเรกทอรีมากเท่าที่คุณต้องการ
Ron Kalian

1
ขออภัยฉันควรทำให้ชัดเจนกว่านี้ แต่ถ้าPath().absolute()มีอยู่ในบางโมดูลที่ตั้งอยู่ที่path/to/moduleและคุณกำลังเรียกใช้โมดูลจากสคริปต์ที่อยู่ในตอนpath/to/scriptนั้นจะกลับมาpath/to/scriptแทนpath/to/module
YellowPillow

1
@YellowPillow Path(__file__).cwd()ชัดเจนมากขึ้น
Charles

1
Path(__file__)ตัวอย่างเช่นมันไม่ทำงานเสมอไปมันไม่ทำงานใน Jupyter Notebook Path().absolute()แก้ปัญหานั้น
Ron Kalian

43

ใน Python 3.x ฉัน:

from pathlib import Path

path = Path(__file__).parent.absolute()

คำอธิบาย:

  • Path(__file__) เป็นเส้นทางไปยังไฟล์ปัจจุบัน
  • .parentให้ไดเรกทอรีเป็นไฟล์
  • .absolute()ให้เส้นทางที่สมบูรณ์แบบแก่คุณ

การใช้pathlibเป็นวิธีที่ทันสมัยในการทำงานกับเส้นทาง str(path)หากคุณจำเป็นต้องใช้มันเป็นสตริงในภายหลังด้วยเหตุผลบางอย่างก็ทำ


3
นี่ควรเป็นคำตอบที่ได้รับการยอมรับในปี 2019 สิ่งหนึ่งที่สามารถกล่าวถึงในคำตอบได้เช่นกัน: หนึ่งสามารถเรียกวัตถุ.open()ดังกล่าวได้ทันทีPathในwith Path(__file__).parent.joinpath('some_file.txt').open() as f:
เตฟาน

9
import os
print os.path.dirname(__file__)

21
ขออภัยคำตอบนี้ไม่ถูกต้องคำตอบที่ถูกต้องคือคำตอบของ Bryan `dirname (abspath ( ไฟล์ )) ดูความคิดเห็นเพื่อดูรายละเอียด
sorin

1
มันจะให้/ ผลลัพธ์
Tripathi29

2
@sorin จริง ๆ แล้วบน Python 3.6 พวกมันเหมือนกัน
DollarAkshay

5

คุณสามารถใช้osและos.pathไลบรารีได้อย่างง่ายดายดังต่อไปนี้

import os
os.chdir(os.path.dirname(os.getcwd()))

os.path.dirnameส่งกลับไดเรกทอรีบนจากไดเรกทอรีปัจจุบัน มันช่วยให้เราเปลี่ยนเป็นระดับบนโดยไม่ต้องผ่านอาร์กิวเมนต์ไฟล์ใด ๆ และไม่ทราบเส้นทางที่แน่นอน


7
นี้ไม่ได้ให้ไดเรกทอรีของปัจจุบันไฟล์ จะส่งคืนไดเรกทอรีของไดเรกทอรีการทำงานปัจจุบันซึ่งอาจแตกต่างอย่างสิ้นเชิง สิ่งที่คุณแนะนำจะใช้ได้ก็ต่อเมื่อไฟล์นั้นอยู่ในไดเรกทอรีการทำงานปัจจุบัน
Bryan Oakley


2

ฉันพบว่าคำสั่งต่อไปนี้จะคืนค่าพา ธ เต็มของพาเรนต์ไดเร็กทอรีของสคริปต์ Python 3.6

Python 3.6 Script:

#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-

from pathlib import Path

#Get the absolute path of a Python3.6 script
dir1 = Path().resolve()  #Make the path absolute, resolving any symlinks.
dir2 = Path().absolute() #See @RonKalian answer 
dir3 = Path(__file__).parent.absolute() #See @Arminius answer 

print(f'dir1={dir1}\ndir2={dir2}\ndir3={dir3}')

ลิงก์คำอธิบาย: .resolve () , .absolute () , Path ( ไฟล์ ) .parent (). absolute ()



1

คุณสมบัติเส้นทางที่มีประโยชน์ใน PYTHON:

 from pathlib import Path

    #Returns the path of the directory, where your script file is placed
    mypath = Path().absolute()
    print('Absolute path : {}'.format(mypath))

    #if you want to go to any other file inside the subdirectories of the directory path got from above method
    filePath = mypath/'data'/'fuel_econ.csv'
    print('File path : {}'.format(filePath))

    #To check if file present in that directory or Not
    isfileExist = filePath.exists()
    print('isfileExist : {}'.format(isfileExist))

    #To check if the path is a directory or a File
    isadirectory = filePath.is_dir()
    print('isadirectory : {}'.format(isadirectory))

    #To get the extension of the file
    fileExtension = mypath/'data'/'fuel_econ.csv'
    print('File extension : {}'.format(filePath.suffix))

เอาท์พุท: ทเส้นทาง ABSOLUTE เป็นเส้นทางที่ไฟล์ PYTHON ของคุณถูกวาง

เส้นทางที่ถูกต้อง: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib and seaborn Part2

เส้นทางของไฟล์: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib และซีบรูน Part2 \ data \ fuel_econ.csv

isfileExist: จริง

isadirectory: เท็จ

นามสกุลไฟล์: .csv


1

หากคุณเพียงต้องการที่จะเห็นไดเรกทอรีการทำงานปัจจุบัน

import os
print(os.getcwd)

หากคุณต้องการเปลี่ยนไดเรกทอรีการทำงานปัจจุบัน

os.chdir(path)

path เป็นสตริงที่มีเส้นทางที่ต้องการย้าย เช่น

path = "C:\\Users\\xyz\\Desktop\\move here"

0

IPythonมีคำสั่งวิเศษ%pwdเพื่อรับไดเรกทอรีทำงานปัจจุบัน มันสามารถใช้ในวิธีต่อไปนี้:

from IPython.terminal.embed import InteractiveShellEmbed

ip_shell = InteractiveShellEmbed()

present_working_directory = ip_shell.magic("%pwd")

บน IPython Jupyter Notebook %pwdสามารถใช้งานได้โดยตรงดังต่อไปนี้:

present_working_directory = %pwd

5
คำถามไม่เกี่ยวกับ IPython
Kiro

1
@ Kiro โซลูชันของฉันตอบคำถามโดยใช้ IPython ตัวอย่างเช่นหากบางคนตอบคำถามด้วยวิธีแก้ปัญหาโดยใช้ห้องสมุดใหม่ก็ควรที่จะเป็นคำถามที่เกี่ยวข้อง
Nafeez Quraishi

@NafeezQuraishi โซลูชันของคุณแนะนำห้องสมุดบุคคลที่สามและคลาสที่คุณต้องสร้างอินสแตนซ์เพื่อให้ได้ผลลัพธ์ที่ต้องการ ตัวฉันและฉันคิดว่าคนอื่น ๆ พยายามหลีกเลี่ยงการใช้ห้องสมุดภายนอกด้วยเหตุผลหลายประการและฉันจะลองใช้วิธีแก้ปัญหาของคุณหากไม่มีอะไรทำงาน โชคดีที่มีฟังก์ชั่นในตัวที่คุณสามารถใช้เพื่อให้ได้ผลลัพธ์ที่ต้องการและไม่จำเป็นต้องใช้ห้องสมุดภายนอก
elliotwesoff

@ elli0t เห็นด้วยบางส่วน พิจารณาว่าใครบางคนที่ใช้สมุดบันทึก Jupyter มีคำถามนี้ซึ่งอาจใช้คำสั่ง% pwd magic จะง่ายกว่าและดีกว่าการนำเข้าระบบปฏิบัติการ
Nafeez Quraishi

0

หากต้องการให้ความสอดคล้องในการย้ายข้อมูลข้ามแพลตฟอร์ม (macOS / Windows / Linux) ให้ลอง:

path = r'%s' % os.getcwd().replace('\\','/')

0

ฉันได้ทำฟังก์ชั่นการใช้งานเมื่อใช้งาน python ใน IIS ใน CGI เพื่อรับโฟลเดอร์ปัจจุบัน

import os 
   def getLocalFolder():
        path=str(os.path.dirname(os.path.abspath(__file__))).split('\\')
        return path[len(path)-1]

0

สมมติว่าคุณมีโครงสร้างไดเรกทอรีต่อไปนี้: -

หลัก / fold1 fold2 fold3 ...

folders = glob.glob("main/fold*")

for fold in folders:
    abspath = os.path.dirname(os.path.abspath(fold))
    fullpath = os.path.join(abspath, sch)
    print(fullpath)

-1
## IMPORT MODULES
import os

## CALCULATE FILEPATH VARIABLE
filepath = os.path.abspath('') ## ~ os.getcwd()
## TEST TO MAKE SURE os.getcwd() is EQUIVALENT ALWAYS..
## ..OR DIFFERENT IN SOME CIRCUMSTANCES

2
ไดเร็กทอรีการทำงานปัจจุบันอาจไม่เหมือนกับไดเร็กทอรีของไฟล์ปัจจุบัน วิธีแก้ปัญหาของคุณจะทำงานเฉพาะถ้าไดเรกทอรีการทำงานปัจจุบันเป็นเช่นเดียวกับไดเรกทอรีที่เก็บไฟล์ ซึ่งอาจพบได้บ่อยในระหว่างการพัฒนา แต่โดยปกติแล้วค่อนข้างหายากสำหรับสคริปต์ที่ปรับใช้
ไบรอัน Oakley

ขอบคุณสำหรับข้อมูล. ฉันอัปเดตคำตอบของฉันเพื่อสะท้อนถึงความเป็นไปได้ว่าสิ่งเหล่านี้อาจไม่เทียบเท่ากับการคืนไฟล์พา ธ เดียวกัน นั่นคือเหตุผลที่ฉันยึดมั่นในปรัชญาของการเข้ารหัสที่เรียกว่า "การเขียนโปรแกรมส่วนเพิ่ม" การทดสอบและการเรียกฟังก์ชัน print () จำนวนมากเพื่อทดสอบผลลัพธ์และ / หรือค่าที่ส่งคืนในแต่ละขั้นตอน ฉันหวังว่ารหัสของฉันตอนนี้จะสะท้อนความเป็นจริงของ os.path.abspath () และ os.getcwd () ได้ดีขึ้นเนื่องจากฉันไม่ได้อ้างว่ารู้ทุกอย่าง อย่างไรก็ตามคุณจะเห็นว่าฉันใส่ os.getcwd () ในความคิดเห็นไม่ใช่วิธีการแก้ปัญหาหลัก แต่เป็นรหัสชิ้น alt มูลค่าการจดจำและตรวจสอบ
โปรแกรมเมอร์กรุงเยรูซาเล็ม

ป.ล. ฉันคิดว่ามีคนแก้ไขและลบคำตอบส่วนใหญ่ของฉันที่ฉันโพสต์ที่นี่ ... :( คนดังกล่าวท้อแท้จากการเข้าร่วมหากคำตอบของพวกเขาจะถูกเซ็นเซอร์และสับ
โปรแกรมเมอร์กรุงเยรูซาเล็ม

1
คุณเป็นคนเดียวที่จะแก้ไขคำตอบนี้ นอกจากนี้การแก้ไขของคุณยังไม่สามารถตอบคำถามได้อย่างถูกต้อง คำถามนี้ถามเกี่ยวกับเส้นทางไปยังไดเรกทอรีของไฟล์โดยเฉพาะและคำตอบของคุณกล่าวถึงการรับไดเรกทอรีปัจจุบันเท่านั้น นั่นไม่ใช่คำตอบที่ถูกต้องเนื่องจากไดเรกทอรีปัจจุบันมักจะไม่เหมือนกับไดเรกทอรีที่สคริปต์ใช้อยู่สิ่งนี้ไม่เกี่ยวข้องกับสิ่งabspathใด
ไบรอัน Oakley

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