Làm cách nào để có được đường dẫn đầy đủ của thư mục của tệp hiện tại?


804

Tôi muốn có được đường dẫn thư mục của tập tin hiện tại. Tôi đã thử:

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

Nhưng làm thế nào tôi có thể lấy đường dẫn của thư mục?

Ví dụ:

'C:\\python27\\'

4
có thể trùng lặp thư mục Tìm thư mục và tệp hiện tại
user2284570

5
__file__không được xác định khi bạn chạy python như một vỏ tương tác. Đoạn mã đầu tiên trong câu hỏi của bạn trông giống như từ một vỏ tương tác, nhưng thực sự sẽ tạo ra một NameError, ít nhất là trên python 2.7.3, nhưng những người khác cũng vậy.
drevicko

Câu trả lời:


1634

Con trăn 3

Đối với thư mục của tập lệnh đang được chạy:

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

Đối với thư mục làm việc hiện tại:

import pathlib
pathlib.Path().absolute()

Con trăn 2 và 3

Đối với thư mục của tập lệnh đang được chạy:

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

Nếu bạn có nghĩa là thư mục làm việc hiện tại:

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

Lưu ý rằng trước và sau filelà hai dấu gạch dưới, không chỉ một.

Cũng lưu ý rằng nếu bạn đang chạy tương tác hoặc đã tải mã từ một thứ khác ngoài tệp (ví dụ: cơ sở dữ liệu hoặc tài nguyên trực tuyến), __file__ có thể không được đặt vì không có khái niệm "tệp hiện tại". Câu trả lời ở trên giả sử kịch bản phổ biến nhất là chạy tập lệnh python có trong tệp.

Người giới thiệu

  1. con đường trong tài liệu python.
  2. os.path 2.7 , os.path 3.8
  3. os.getcwd 2.7 , os.getcwd 3.8
  4. Biến __file__ có nghĩa là gì / làm gì?

43
abspath () là bắt buộc nếu bạn không muốn khám phá các hành vi kỳ lạ trên windows, trong đó dirname ( tệp ) có thể trả về một chuỗi trống!
sorin

4
nên là os.path.dirname (os.path.abspath (os .__ file__))?
DrBailey

5
@DrBailey: không, không có gì đặc biệt về ActivePython. __file__(lưu ý rằng đó là hai dấu gạch dưới ở hai bên của từ) là một phần tiêu chuẩn của trăn. Chẳng hạn, nó không có sẵn trong các mô-đun dựa trên C, nhưng nó phải luôn có sẵn trong tập lệnh python.
Bryan Oakley

10
Tôi sẽ khuyên bạn nên sử dụng realpath thay vì abspath để giải quyết một liên kết tượng trưng có thể.
TTimo

12
@ cph2117: điều này sẽ chỉ hoạt động nếu bạn chạy nó trong một tập lệnh. Không có __file__nếu chạy từ một dấu nhắc tương tác. \
Bryan Oakley

99

Sử dụng Pathlà cách được đề xuất kể từ Python 3:

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

Tài liệu: pathlib

Lưu ý: Nếu sử dụng Jupyter Notebook, __file__không trả về giá trị mong đợi, do đó Path().absolute()phải được sử dụng.


17
Tôi đã phải làm Path(__file__).parentđể có được thư mục chứa tệp
YellowPvel

Đó là chính xác @YellowPvel, Path(__file__)giúp bạn có được tệp. .parentgiúp bạn một cấp trên tức là thư mục chứa. Bạn có thể thêm nhiều hơn .parentvào đó để đi lên nhiều thư mục như bạn yêu cầu.
Ron Kalian

1
Xin lỗi tôi đã làm cho điều này rõ ràng hơn, nhưng nếu Path().absolute()tồn tại trong một số mô-đun được đặt tại path/to/modulevà bạn đang gọi mô-đun từ một số tập lệnh được đặt tại path/to/scriptđó sẽ quay lại path/to/scriptthay vìpath/to/module
YellowP giác

1
@YellowPirl Path(__file__).cwd()rõ ràng hơn
Charles

1
Path(__file__)không phải lúc nào cũng hoạt động, ví dụ, nó không hoạt động trong Jupyter Notebook. Path().absolute()giải quyết vấn đề đó
Ron Kalian

43

Trong Python 3.x tôi làm:

from pathlib import Path

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

Giải trình:

  • Path(__file__) là đường dẫn đến tập tin hiện tại.
  • .parentcung cấp cho bạn thư mục mục tập tin.
  • .absolute()cung cấp cho bạn đường dẫn tuyệt đối đầy đủ đến nó.

Sử dụng pathliblà cách hiện đại để làm việc với các đường dẫn. Nếu bạn cần nó như một chuỗi sau này vì một số lý do, chỉ cần làm str(path).


3
Đây phải là câu trả lời được chấp nhận vào năm 2019. Một điều có thể được đề cập trong câu trả lời là: người ta có thể gọi ngay .open()một Pathđối tượng như trongwith Path(__file__).parent.joinpath('some_file.txt').open() as f:
stefanct

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

21
Xin lỗi nhưng câu trả lời này không chính xác, câu trả lời đúng là câu được tạo bởi Bryan `dirname (abspath ( file )). Xem ý kiến ​​để biết chi tiết.
sorin

1
Nó sẽ cung cấp / dưới dạng đầu ra
Tripathi29

2
@sorin Trên thực tế trên Python 3.6, cả hai đều giống nhau
DollarAkshay

5

Bạn có thể sử dụng osos.paththư viện dễ dàng như sau

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

os.path.dirnametrả về thư mục trên từ cái hiện tại Nó cho phép chúng tôi thay đổi lên mức cao hơn mà không cần chuyển bất kỳ đối số tệp nào và không biết đường dẫn tuyệt đối.


7
Điều này không cung cấp cho thư mục của tập tin hiện tại . Nó trả về thư mục của thư mục làm việc hiện tại có thể hoàn toàn khác nhau. Những gì bạn đề xuất chỉ hoạt động nếu tập tin nằm trong thư mục làm việc hiện tại.
Bryan Oakley


2

Tôi đã tìm thấy tất cả các lệnh sau đây sẽ trả về đường dẫn đầy đủ của thư mục mẹ của tập lệnh Python 3.6.

Tập lệnh Python 3.6:

#!/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}')

Liên kết giải thích: .resolve () , .absolute () , Path ( file ) .parent (). Absol ()


2

Hệ thống: MacOS

Phiên bản: Python 3.6 w / Anaconda

import os

rootpath = os.getcwd()

os.chdir(rootpath)

1

TÍNH CHẤT TUYỆT VỜI HIỆU QUẢ TẠI 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))

ĐẦU RA: TUYỆT VỜI TUYỆT VỜI LÀ ĐƯỜNG Ở ĐÂU FY PONTHON CỦA BẠN ĐƯỢC TẠO

Đường dẫn tuyệt đối: D: \ Học \ Học máy \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib và Seaborn Part2

Đường dẫn tệp: D: \ Học \ Học máy \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib và seaborn Part2 \ data \ Fuel_econ.csv

isfileExist: Đúng

isadirectory: Sai

Phần mở rộng tệp: .csv


1

Nếu bạn chỉ muốn xem thư mục làm việc hiện tại

import os
print(os.getcwd)

Nếu bạn muốn thay đổi thư mục làm việc hiện tại

os.chdir(path)

đường dẫn là một chuỗi chứa đường dẫn cần thiết được di chuyển. ví dụ

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

0

IPythoncó một lệnh ma thuật %pwdđể có được thư mục làm việc hiện tại. Nó có thể được sử dụng theo cách sau:

from IPython.terminal.embed import InteractiveShellEmbed

ip_shell = InteractiveShellEmbed()

present_working_directory = ip_shell.magic("%pwd")

Trên IPython Jupyter Notebook %pwdcó thể được sử dụng trực tiếp như sau:

present_working_directory = %pwd

5
Câu hỏi không phải là về IPython
Kiro

1
@Kiro, giải pháp của tôi trả lời câu hỏi bằng IPython. Ví dụ: Nếu ai đó trả lời một câu hỏi bằng một giải pháp bằng thư viện mới thì imho nó vẫn là một câu trả lời thích hợp cho câu hỏi.
Nafeez Quraishi

@NafeezQuraishi giải pháp của bạn giới thiệu thư viện của bên thứ ba và một lớp mà bạn phải khởi tạo để đạt được kết quả mong muốn. Bản thân tôi và tôi nghĩ nhiều người khác cố gắng tránh sử dụng các thư viện bên ngoài vì một số lý do và tôi sẽ chỉ thử giải pháp của bạn nếu không có gì khác hiệu quả. May mắn thay, có một loạt các chức năng tích hợp mà bạn có thể sử dụng để có được kết quả mong muốn và không cần thư viện bên ngoài.
elliotwesoff

@ elli0t, đồng ý một phần. Hãy xem xét ai đó sử dụng máy tính xách tay Jupyter có câu hỏi này cho ai có lẽ sử dụng lệnh ma thuật% pwd sẽ dễ dàng và thích hợp hơn so với nhập os.
Nafeez Quraishi

0

Để giữ tính nhất quán di chuyển trên các nền tảng (macOS / Windows / Linux), hãy thử:

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

0

Tôi đã tạo một hàm để sử dụng khi chạy python trong IIS trong CGI để lấy thư mục hiện tại:

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

0

Giả sử bạn có cấu trúc thư mục sau: -

chính / 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
Thư mục làm việc hiện tại có thể không giống với thư mục của tệp hiện tại. Giải pháp của bạn sẽ chỉ hoạt động nếu thư mục làm việc hiện tại giống với thư mục chứa tệp. Điều đó có thể khá phổ biến trong quá trình phát triển, nhưng thường khá hiếm đối với một tập lệnh được triển khai.
Bryan Oakley

Cảm ơn bạn về thông tin. Tôi đã cập nhật câu trả lời của mình để phản ánh khả năng những điều này có thể không tương đương trả lại cùng một filepath. Đó là lý do tại sao tôi tuân thủ triết lý mã hóa được gọi là "lập trình gia tăng", thử nghiệm và rất nhiều lệnh gọi hàm print () để kiểm tra đầu ra và / hoặc giá trị trả về ở mỗi bước. Tôi hy vọng mã của tôi bây giờ phản ánh tốt hơn thực tế của os.path.abspath () so với os.getcwd () vì tôi không yêu cầu biết mọi thứ. Tuy nhiên, bạn có thể thấy rằng tôi đặt os.getcwd () trong các bình luận không phải là giải pháp chính, mà là một đoạn mã thay thế đáng để ghi nhớ và kiểm tra.
Lập trình viên Jerusalem

PS Tôi nghĩ rằng ai đó chỉnh sửa và xóa phần lớn các câu trả lời của tôi mà tôi được đăng ở đây ... :( không khuyến khích như vậy người tham gia nếu câu trả lời của họ sẽ được kiểm duyệt và cắt nhỏ.
Jerusalem Programmer

1
Bạn là người duy nhất đã chỉnh sửa câu trả lời này. Ngoài ra, các chỉnh sửa của bạn vẫn không trả lời đúng câu hỏi. Câu hỏi đặc biệt hỏi về đường dẫn đến thư mục của tệp và câu trả lời của bạn chỉ đề cập đến việc nhận thư mục hiện tại. Đó không phải là một câu trả lời đúng, vì thư mục hiện tại rất thường không giống với thư mục mà tập lệnh nằm trong. Điều này không liên quan gì abspath.
Bryan Oakley

Chắc chắn là mã tôi đã chia sẻ cung cấp đường dẫn đến thư mục của tệp nếu chạy từ thư mục và / hoặc tệp từ nơi bạn muốn biết đường dẫn tệp tuyệt đối. Chắc chắn đó là một câu trả lời đúng. Xin đừng là một kẻ troll.
Lập trình viên Jerusalem
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.