2009-07-30 39 views

Trả lời

24
$ 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 
+0

Câu trả lời hay. Tôi không biết về phương pháp này! – jkp

+3

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

+2

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

6

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) 
3

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.

+1

Bạn không cần phải gọi 'normpath' trước. –

+0

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

+0

@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

0

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.

0

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ác vấn đề liên quan