2009-07-30 7 views

Répondre

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

Bonne réponse. Je ne savais pas à propos de cette méthode! – jkp

+3

Notez que ceci est documenté comme étant uniquement disponible sous Unix. Il n'est pas présent sur Windows, au moins en Python 2.6. – Weeble

+2

pour Windows, vous pouvez approximer le comportement avec 'os.stat ('foo') == os.stat ('bar')' – wim

6

Vous souhaitez utiliser os.path.abspath(path) pour normaliser chaque chemin à des fins de comparaison.

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

Une chaîne simple comparaison devrait fonctionner:

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

crédit à Andrew, il a corrigé mon post initial qui comprenait un appel à os.path.normpath: cela est inutile parce que la mise en œuvre de os.path.abspath fait pour vous.

+1

Vous n'avez pas besoin d'appeler 'normpath' en premier. –

+0

Andrew: si vous vouliez juste comparer les chaînes, vous pouvez vous retrouver avec des chemins différents pointant vers le même fichier dans certains cas. os.abspath ne fait rien d'intelligent, il ajoute seulement un préfixe. – jkp

+0

@Andrew: non je le reprends! Vous aviez raison, pour * nix au moins l'implémentation le fait pour vous. Chaque jour est un jour d'école :) – jkp

0

Sur les systèmes Windows, il n'y a pas de fonction samefile et vous devez également vous soucier de la casse. La fonction normcase de os.path peut être combinée avec abspath pour gérer ce cas.

from os.path import abspath, normcase 

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

Cette examinera "C: \ SPAM \ Eggs.txt" équivalent à "c: \ Spam \ eggs.txt" sous Windows.

Notez que contrairement à samefile, toutes les méthodes basées sur la normalisation et la comparaison des chemins ne seront pas au courant des cas où des chemins complètement différents se réfèrent au même fichier. Sous Windows, cela signifie que si vous utilisez SUBST, MKLINK ou des partages réseau montés pour créer plusieurs chemins distincts vers le même fichier, aucune de ces solutions ne pourra dire "c'est le même fichier". J'espère que ce n'est pas trop un problème la plupart du temps.

0

Peut-on utiliser os.path.relpath (path1, path2) comme solution de contournement pour os.path.samefile (path1, path2) sous Windows?

Si os.path.relpath (chemin1, chemin2) renvoie '.' que path1 et path2 pointent vers le même endroit

Questions connexes