2009-07-30 22 views

cevap

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

Güzel cevap. Bu yöntemi bilmiyordum! – jkp

+3

Bunun yalnızca Unix'te mevcut olduğu belgelenmiştir. Windows'da, en azından Python 2.6'da mevcut değildir. Pencereler için – Weeble

+2

, 'os.stat (' foo ') == os.stat (' bar ') ' – wim

6

Karşılaştırma için her yolu normalleştirmek için os.path.abspath(path) kullanmak istiyorsunuz. Karşılaştırmak

os.path.abspath(foo) == os.path.abspath(bar) 
3

Basit dize çalışması gerekir: os.path.abspath uygulanması sizin için yapar, çünkü bu gereksiz geçerli:

import os 
print os.path.abspath(first) == os.path.abspath(second) 

Kredi Andrew, o os.path.normpath bir çağrı dahil benim ilk yazı düzeltildi.

+1

Önce "normpath" çağırmanıza gerek yoktur. –

+0

Andrew: Sadece dizeleri karşılaştıracak olsaydınız, bazı durumlarda aynı dosyaya işaret eden farklı yollarla sonuçlanabilirdiniz. os.abspath akıllıca bir şey yapmaz, sadece bir önek ekler. – jkp

+0

@Andrew: hayır onu geri alıyorum! Haklıydınız, * nix için en azından uygulama sizin için bunu yapıyor. Her gün bir okul günüdür :) – jkp

0

Windows sistemlerinde, samefile işlevi yoktur ve ayrıca durum hakkında endişelenmeniz de gerekir. Bu davayı işlemek için os.path işlevini abspath ile birleştirebilirsiniz. Windows üzerinde: "\ Spam \ eggs.txt c" ile eşdeğer olarak:

from os.path import abspath, normcase 

def are_paths_equivalent(path1, path2): 
    return normcase(abspath(path1)) == normcase(abspath(path2)) 

Bu "\ SPAM \ Eggs.txt C" dikkate alınacaktır.

samefile'dan farklı olarak, yolları normalleştirme ve karşılaştırmaya dayanan tüm yöntemler, tamamen farklı yolların aynı dosyaya başvurduğu durumların farkında olmayacaktır. Windows'da, bu, aynı dosyaya birden çok farklı yol oluşturmak için SUBST, MKLINK veya bağlı ağ paylaşımları kullanırsanız, bu çözümlerin hiçbirinin "aynı dosya" olduğunu söyleyemeyeceğiniz anlamına gelir. Umarım çoğu zaman bir problem değildir.

0

Windows'da os.path.relpath (yol1, yol2) için os.path.samefile (yol1, yol2) için geçici çözüm olarak kullanılabilir mi?

Eğer os.path.relpath (yol1, yol2) 'i döndürürse. yol1 ve yol2 aynı yere işaret eder