Làm cách nào để kiểm tra xem hai đường dẫn tệp có trỏ đến cùng một tệp bằng Python không?Kiểm tra đường dẫn tuyệt đối trong Python
Trả lời
$ touch foo
$ ln -s foo bar
$ python
Python 2.5.1 (r251:54863, Feb 6 2009, 19:02:12)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> help(os.path.samefile)
Help on function samefile in module posixpath:
samefile(f1, f2)
Test whether two pathnames reference the same actual file
>>> os.path.samefile("foo", "bar")
True
Bạn muốn sử dụng os.path.abspath(path)
để chuẩn hóa từng đường dẫn để so sánh.
os.path.abspath(foo) == os.path.abspath(bar)
Một chuỗi đơn giản so sánh nên làm việc:
import os
print os.path.abspath(first) == os.path.abspath(second)
tín dụng đối với Andrew, anh chỉnh bài ban đầu của tôi trong đó bao gồm một cuộc gọi đến os.path.normpath
: đây là không cần thiết vì việc thực hiện os.path.abspath
làm điều đó cho bạn.
Bạn không cần phải gọi 'normpath' trước. –
Andrew: nếu bạn chỉ cần so sánh các chuỗi bạn có thể kết thúc với các đường dẫn khác nhau trỏ đến cùng một tệp trong một số trường hợp. os.abspath không làm bất cứ điều gì thông minh, nó chỉ thêm tiền tố. – jkp
@Andrew: không tôi lấy lại! Bạn đã đúng, cho * nix ít nhất việc triển khai thực hiện điều đó cho bạn. Mỗi ngày là một schoolday :) – jkp
Trên hệ thống Windows, không có chức năng samefile
và bạn cũng phải lo lắng về trường hợp. Chức năng normcase
từ os.path
có thể được kết hợp với abspath
để xử lý trường hợp này.
from os.path import abspath, normcase
def are_paths_equivalent(path1, path2):
return normcase(abspath(path1)) == normcase(abspath(path2))
Điều này sẽ xem "C: \ SPAM \ Eggs.txt" tương đương với "c: \ spam \ eggs.txt" trên Windows.
Lưu ý rằng không giống như samefile
, tất cả các phương pháp dựa trên việc chuẩn hóa và so sánh đường dẫn sẽ không biết các trường hợp đường dẫn hoàn toàn khác nhau tham chiếu đến cùng một tệp. Trên Windows, điều này có nghĩa là nếu bạn sử dụng SUBST, MKLINK hoặc gắn kết chia sẻ mạng để tạo nhiều đường dẫn riêng biệt cho cùng một tệp, không có giải pháp nào trong số này có thể nói "đó là cùng một tệp". Hy vọng rằng đó không phải là quá nhiều của một vấn đề phần lớn thời gian.
Có thể người dùng có thể sử dụng os.path.relpath (path1, path2) làm giải pháp cho os.path.samefile (path1, path2) trên Windows không?
Nếu os.path.relpath (path1, path2) trả về '.' so với điểm path1 và path2 đến cùng một vị trí
Câu trả lời hay. Tôi không biết về phương pháp này! – jkp
Lưu ý rằng đây là tài liệu chỉ có sẵn trên Unix. Nó không có mặt trên Windows, ít nhất là trong Python 2.6. – Weeble
cho các cửa sổ, bạn có thể ước tính hành vi với 'os.stat ('foo') == os.stat ('bar')' – wim