Đưa ra một đường dẫn như "mydir/myfile.txt"
, làm cách nào để tìm đường dẫn tuyệt đối của tệp so với thư mục làm việc hiện tại trong Python? Ví dụ: trên Windows, tôi có thể kết thúc bằng:
"C:/example/cwd/mydir/myfile.txt"
Đưa ra một đường dẫn như "mydir/myfile.txt"
, làm cách nào để tìm đường dẫn tuyệt đối của tệp so với thư mục làm việc hiện tại trong Python? Ví dụ: trên Windows, tôi có thể kết thúc bằng:
"C:/example/cwd/mydir/myfile.txt"
Câu trả lời:
>>> 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'
normpath()
như sau : normpath(join(os.getcwd(), path))
. Vì vậy, nếu mydir/myfile.txt
không dưới os.getcwd()
, đường dẫn tuyệt đối không phải là đường dẫn thực sự .
mydir/myfile.txt
ngầ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?
abspath
hà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.
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.
relpath
path
relpath
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
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)
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.path
hà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'
>>>
pathlib
. Xem câu trả lời của tôi trong chủ đề này.
from path import Path
sau đóPath('mydir/myfile.txt').abspath()
path
mô-đun khác . Các mô-đun liên kết sử dụng một lớp có tên path
.
Hôm nay bạn cũng có thể sử dụng unipath
gói dựa trên path.py
: http://sluggo.scrapping.cc/python/unipath/
>>> from unipath import Path
>>> absolute_path = Path('mydir/myfile.txt').absolute()
Path('C:\\example\\cwd\\mydir\\myfile.txt')
>>> str(absolute_path)
C:\\example\\cwd\\mydir\\myfile.txt
>>>
Tôi sẽ khuyên bạn nên sử dụng gói này vì nó cung cấp giao diện sạch cho các tiện ích os.path thông thường .
Cập nhật cho Python 3.4+ pathlib
thự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 Path
cá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
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))
Lưu ý rằng expanduser
cầ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à expandvars
quan tâm đến bất kỳ biến môi trường nào khác (như $HOME
).
Đ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.
Module os
cung 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 srblib
cho đ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
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
os.path.abspath()
) cho bất kỳ đường dẫn tương đối nào glob
cung cấp cho hai trường hợp đầu tiên của bạn ...
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