2008-09-09 67 views
455

Được cung cấp đường dẫn như "mydir/myfile.txt", làm cách nào để tìm tệp dẫn tuyệt đối liên quan đến thư mục làm việc hiện tại bằng Python? Ví dụ. trên Windows, tôi có thể kết thúc với:Cách lấy đường dẫn tệp tuyệt đối bằng Python

"C:/example/cwd/mydir/myfile.txt" 
+0

Câu hỏi tương tự: https://stackoverflow.com/questions/7165 749/open-file-in-a-relative-location-in-python – Raj

Trả lời

641
>>> import os 
>>> os.path.abspath("mydir/myfile.txt") 
'C:/example/cwd/mydir/myfile.txt' 

Cũng làm việc nếu nó đã là một đường dẫn tuyệt đối:

>>> import os 
>>> os.path.abspath("C:/example/cwd/mydir/myfile.txt") 
'C:/example/cwd/mydir/myfile.txt' 
+16

Lưu ý: Trên hầu hết các nền tảng, điều này tương đương với việc gọi hàm 'normpath()' như sau: 'normpath (join (os.getcwd(), path)) '. Vì vậy, nếu 'mydir/myfile.txt' không nằm trong' os.getcwd() ', đường dẫn tuyệt đối là __not đường dẫn thực'. – coanor

+23

@coanor? Nếu không có một gốc rõ ràng, 'mydir/myfile.txt' ngầm ám chỉ một đường dẫn bên trong thư mục làm việc hiện tại, do đó tương đương với'./Mydir/myfile.txt'. Đó có thể không phải là con đường bạn dự định đầu vào, nhưng nó có vẻ giống như việc giải thích chính xác con đường xa như tôi có thể nói. Bạn có thể xây dựng? – jpmc26

47
>>> import os 
>>> os.path.abspath('mydir/myfile.txt') 
'C:\\example\\cwd\\mydir\\myfile.txt' 
>>> 
21

Vẫn còn tốt hơn, cài đặt các module path.py, nó kết thúc tốt đẹp tất cả các hàm os.path và các hàm liên quan khác vào các phương thức trên một đối tượng có thể được sử dụng ở bất kỳ nơi nào sử dụng chuỗi:

>>> from path import path 
>>> path('mydir/myfile.txt').abspath() 
'C:\\example\\cwd\\mydir\\myfile.txt' 
>>> 
+2

Quá xấu họ không bao giờ có một mô-đun trừu tượng tên tập tin thích hợp vào stdlib. –

+1

@Torsten Marek: đó là một thiếu sót đau và lâu đời. – flow

+4

Bây giờ họ đã làm cho Python 3.4: 'pathlib'. Xem câu trả lời của tôi trong chủ đề này. – twasbrillig

42

Bạn có thể sử dụng thư viện Python 3.4 mới pathlib. (Bạn cũng có thể lấy nó cho Python 2.6 hoặc 2.7 bằng cách sử dụng pip install pathlib.) Các tác giả wrote: "Mục đích của thư viện này là cung cấp một hệ thống phân cấp đơn giản của các lớp để xử lý đường dẫn hệ thống tập tin và người dùng hoạt động phổ biến trên chúng."

Để có được một đường dẫn tuyệt đối trong Windows:

>>> from pathlib import Path 
>>> p = Path("pythonw.exe").resolve() 
>>> p 
WindowsPath('C:/Python27/pythonw.exe') 
>>> str(p) 
'C:\\Python27\\pythonw.exe' 

Hoặc trên UNIX:

>>> from pathlib import Path 
>>> p = Path("python3.4").resolve() 
>>> p 
PosixPath('/opt/python3/bin/python3.4') 
>>> str(p) 
'/opt/python3/bin/python3.4' 

Documents đang ở đây: https://docs.python.org/3/library/pathlib.html

+3

Rất hữu ích. Sử dụng 'os.path.abspath()' đã cho tôi một lỗi: đối tượng 'AttributeError: 'NoneType' không có thuộc tính 'startswith'', sử dụng' Path(). Resolve() 'không có cùng filepath tương đối. (Linux và Python3.4) – NuclearPeon

3

Tôi thích sử dụng glob

đây là cách liệt kê tất cả các loại tệp trong thư mục hiện tại của bạn:

import glob 
for x in glob.glob(): 
    print(x) 

ở đây là làm thế nào để liệt kê tất cả (ví dụ) file .txt trong thư mục hiện tại của bạn:

import glob 
for x in glob.glob('*.txt'): 
    print(x) 

ở đây là làm thế nào để liệt kê tất cả các loại tập tin trong một thư mục đã chọn:

import glob 
for x in glob.glob('C:/example/hi/hello/'): 
    print(x) 

hy vọng điều này đã giúp bạn

+0

Bạn dường như đang trả lời một câu hỏi khác. Nó không phải là "Làm thế nào để tôi có được một con đường?", Nhưng "một con đường tuyệt đối". Người ta có thể áp dụng câu trả lời đúng ('os.path.abspath()') cho bất kỳ đường dẫn tương đối 'glob' nào cung cấp cho hai trường hợp đầu tiên của bạn ... – NichtJens

-2
filePath = os.path.abspath(directoryName) 
filePathWithSlash = filePath + "\\" 
filenameWithPath = os.path.join(filePathWithSlash, filename) 
+0

Câu hỏi không phải là, cách đổi tên hình ảnh hoặc một cái gì đó như thế này. Nó chỉ được yêu cầu cho dòng thứ 5 của bạn 'filePath = os.path ...' – derM

+0

derM có bạn là đúng, tôi đã nhìn vào cái gì khác khi tôi đăng đó. Tôi đã xóa nội dung không liên quan đến câu hỏi trên trang này. –

Các vấn đề liên quan