Cách nhận đường dẫn tệp tuyệt đối trong Python


Câu trả lời:


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

Cũng hoạt động 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'

29
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.txtkhông dưới os.getcwd(), đường dẫn tuyệt đối không phải là đường dẫn thực sự .
coanor

32
@coanor? Nếu không có một gốc rõ ràng, thì mydir/myfile.txtngầm định đề cập đến 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 định nhập, nhưng có vẻ như đó là cách giải thích chính xác về con đường mà tôi có thể nói. Bạn có thể giải thích?
jpmc26

2
@ jpmc26 Tôi không theo dõi chính xác coanor, nhưng tôi sẽ nói rằng (trái với những gì tôi đoán), không có mối liên hệ nào giữa đối số với abspathhàm và tệp thực. Bạn có thể cung cấp cho bất kỳ tập tin và các tập tin thừa kế thư mục không tồn tại - và abspath sẽ đơn giản giải quyết các bit của đường dẫn (bao gồm cả ..phần tử " " thư mục mẹ ) và trả về một chuỗi. Đây chỉ là một chuỗi được tính toán từ thư mục hiện tại; bất kỳ mối tương quan với một tập tin thực tế là tình cờ, dường như. Hãy thử os.path.abspath("/wow/junk/../blha/hooey"). Nó hoạt động.
Mike S

2
@MikeS Tôi thực sự không chắc tại sao đó lại là hành vi bất ngờ. Đó là đường dẫn tuyệt đối , không phải tệp hoặc thư mục tuyệt đối. Nếu bạn muốn kiểm tra sự tồn tại, hãy gọi os.path.exists. Ngược lại, các hệ thống như PowerShell nhấn mạnh vào đường dẫn hiện có với chức năng phân giải đường dẫn tiêu chuẩn là một điều khó sử dụng.
jpmc26

1
@ jpmc26 Giả sử rằng một đường dẫn chỉ là một chuỗi trông giống như một tên đường dẫn hoàn toàn không rõ ràng và đi ngược lại với cách tôi đã suy nghĩ và nói về tên đường dẫn trong nhiều năm. Tôi trích dẫn các tài liệu Python 3 cho abspath: "Trả về một phiên bản tuyệt đối hóa đã chuẩn hóa của đường dẫn tên đường dẫn ." Không phải là "... phiên bản của đường dẫn chuỗi ". Một tên đường dẫn, như được định nghĩa bởi Posix, là "Một chuỗi được sử dụng để xác định một tệp." Các tài liệu Python rõ ràng về : "hệ thống tập tin không được truy cập để xác nhận sự tồn tại hoặc bản chất của ". Nếu đối số ở đây là rõ ràng, tại sao phải rõ ràng cho ? relpathpathrelpath
Mike S

77

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 sử dụng pip install pathlib.) Các tác giả đã viết : "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 lớp học để đường dẫn xử lý hệ thống tập tin và các hoạt động thông thường người dùng làm qua 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'

Tài liệu ở đây: https://docs.python.org/3/l Library / pathlib.html


4
Rất hữu ích. Việc sử dụng os.path.abspath()đã cho tôi một lỗi : AttributeError: 'NoneType' object has no attribute 'startswith', sử dụng Path().resolve()không có cùng filepath tương đối. (Linux và Python3.4)
NuclePeon

23

Vẫn tốt hơn, cài đặt mô-đun (tìm thấy trên PyPI), nó bao bọc tất cả các os.pathhàm và các hàm liên quan khác thành các phương thức trên một đối tượng có thể được sử dụng ở bất cứ 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á tệ, họ không bao giờ có một mô-đun trừu tượng tên tệp thích hợp vào stdlib.
Torsten Marek

1
@Torsten Marek: đó là một thiếu sót đau đớn và lâu dài.
chảy

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

Có yypose trong câu trả lời này. Nó sẽ là from path import Pathsau đóPath('mydir/myfile.txt').abspath()
frakman1

Không có lỗi chính tả, bạn có thể đã sử dụng một pathmô-đun khác . Các mô-đun liên kết sử dụng một lớp có tên path.
Tom


10

Cập nhật cho Python 3.4+ pathlibthực sự trả lời câu hỏi:

from pathlib import Path

relative = Path("mydir/myfile.txt")
absolute = relative.absolute()  # absolute is a Path object

Nếu bạn chỉ cần một chuỗi tạm thời, hãy nhớ rằng bạn có thể sử dụng Pathcác đối tượng với tất cả các hàm có liên quan os.path, bao gồm tất nhiên abspath:

from os.path import abspath

absolute = abspath(relative)  # absolute is a str object

9
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))

Lưu ý rằng expandusercần thiết (trên Unix) trong trường hợp biểu thức đã cho cho tên và vị trí của tệp (hoặc thư mục) có thể chứa một hàng đầu ~/(dấu ngã đề cập đến thư mục chính của người dùng) và expandvarsquan tâm đến bất kỳ biến môi trường nào khác (như $HOME).


6

Điều này luôn lấy đúng tên tệp của tập lệnh hiện tại, ngay cả khi nó được gọi từ bên trong tập lệnh khác. Nó đặc biệt hữu ích khi sử dụng subprocess.

import sys,os

filename = sys.argv[0]

từ đó, bạn có thể nhận được đường dẫn đầy đủ của tập lệnh với:

>>> os.path.abspath(filename)
'/foo/bar/script.py'

Nó cũng giúp điều hướng các thư mục dễ dàng hơn bằng cách chỉ thêm /..nhiều lần bạn muốn 'tăng' trong hệ thống phân cấp của thư mục.

Để có được cwd:

>>> os.path.abspath(filename+"/..")
'/foo/bar'

Đối với đường dẫn cha mẹ:

>>> os.path.abspath(filename+"/../..")
'/foo'

Bằng cách kết hợp "/.."với các tên tệp khác, bạn có thể truy cập bất kỳ tệp nào trong hệ thống.


Đây không phải là những gì đã được yêu cầu. Họ đã hỏi về một đường dẫn liên quan đến thư mục làm việc hiện tại, không giống với thư mục script, mặc dù đôi khi chúng có thể có cùng giá trị.
Nguyên tố sáng tạo

3

Module oscung cấp một cách để tìm đường dẫn abs.

NHƯNG hầu hết các đường dẫn trong Linux bắt đầu bằng ~(dấu ngã), không cho kết quả khả quan.

vì vậy bạn có thể sử dụng srblibcho điều đó.

>>> import os
>>> os.path.abspath('~/hello/world')
'/home/srb/Desktop/~/hello/world'
>>> from srblib import abs_path
>>> abs_path('~/hello/world')
'/home/srb/hello/world'

cài đặt nó bằng cách sử dụng python3 -m pip install srblib

https://pypi.org/project/srblib/


1

Tôi thích sử dụng toàn cầu

Dưới đâ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à cách liệt kê tất cả (ví dụ) các tệp .txt trong thư mục hiện tại của bạn:

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

Dưới đây là cách liệt kê tất cả các loại tệp trong 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


2
Bạn dường như đang trả lời một câu hỏi khác nhau. Đó không phải là "Làm thế nào để tôi có một con đường?", Mà là "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 nào globcung cấp cho hai trường hợp đầu tiên của bạn ...
NichtJens

1

nếu bạn đang ở trên máy mac

import os
upload_folder = os.path.abspath("static/img/users")

điều này sẽ cung cấp cho bạn một đường dẫn đầy đủ:

print(upload_folder)

sẽ hiển thị đường dẫn sau:

>>>/Users/myUsername/PycharmProjects/OBS/static/img/user

1

Trong trường hợp ai đó đang sử dụng python và linux và tìm đường dẫn đầy đủ đến tệp:

>>> path=os.popen("readlink -f file").read()
>>> print path
abs/path/to/file
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.