2009-07-30 12 views

答えて

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

ニースの答え。私はこの方法について知らなかった! – jkp

+3

これはUnix上でのみ利用可能であると書かれていることに注意してください。少なくともPython 2.6では、Windowsでは存在しません。 – Weeble

+2

は、Windowsの場合は、あなたが 'はos.stat(「FOO」)==はos.stat(「バー」)との動作を近似することができる' – wim

6

あなたは比較のために、それぞれのパスを正規化するためにos.path.abspath(path)を使用したいです。

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

単純な文字列比較動作するはずです:os.path.abspathの実装は、あなたのためにそれをしないので、これは不要である:アンドリューへ

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

クレジット、彼はos.path.normpathへの呼び出しを含め、私の最初の記事を修正しました。 Windowsシステムで

+1

にパス1とパス2点よりもまず 'normpath'を呼び出す必要はありません。 –

+0

Andrew:文字列を比較しようとしていただけで、場合によっては同じファイルを指している別のパスで終わることがあります。 os.abspathは巧妙なことをしません。接頭辞を追加するだけです。 – jkp

+0

@Andrew:いいえ、私はそれを取り戻す!あなたは正しかった、* nixのために、少なくとも実装はあなたのためにそれを行います。毎日はスクロールです:) – jkp

0

、そこにはsamefile機能はありません、あなたはまた、ケースを心配する必要があります。この場合、normcaseの機能をos.pathと組み合わせてabspathと組み合わせることができます。

from os.path import abspath, normcase 

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

これは、 "C:\ SPAM \ Eggs.txt" を検討する:Windows上の "\スパム\ eggs.txt C" に相当します。 samefile異なり、パスを正規化し、比較に基づいて、すべての方法は完全に異なるパスが同じファイルを参照するケースの認識ではないこと

注。 Windowsでは、これは、SUBST、MKLINK、またはマウントされたネットワーク共有を使用して同じファイルへの複数の異なるパスを作成する場合、これらのソリューションでは「それは同じファイル」とは言えません。うまくいけば、それはほとんどの場合、あまり問題にはならない。

0

は1つが、Windows上os.path.samefile(パス1、パス2)のための回避策としてos.path.relpath(パス1、パス2)を使用することができますことができますか?

os.path.relpath(パス1、パス2)が返された場合は ''同じ場所