Comment puis-je vérifier si deux chemins de fichiers pointent sur le même fichier de Python? P>
5 Réponses :
Vous souhaitez utiliser os.path.abspath (chemin) code >
pour normaliser chaque chemin de comparaison.
os.path.abspath(foo) == os.path.abspath(bar)
Une simple chaîne Comparer devrait fonctionner:
import os print os.path.abspath(first) == os.path.abspath(second)
Vous n'avez pas besoin d'appeler normpath code> d'abord.
Andrew: Si vous alliez simplement comparer les chaînes, vous risquez de vous retrouver avec différents chemins pointant vers le même dossier dans certains cas. Os.Abspath ne fait rien d'intelligent, il n'ajoute qu'un préfixe.
@Andrew: Non, je le reprends! Vous aviez raison, car * Nix au moins la mise en œuvre le fait pour vous. Chaque jour est un schoolday :)
Je ne suis pas d'accord, de docs.python.org/library/os.path.htmlled/a >: Renvoie une version absolutilisée normalisée du chemin d'accès. Sur la plupart des plates-formes, cela équivaut à Normpath (joindre (OS.GETCWD (), chemin)).
$ 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
Bonne réponse. Je ne connaissais pas cette méthode!
Notez que cela est documenté uniquement disponible sur UNIX. Il n'est pas présent sur Windows, au moins en Python 2.6.
Pour Windows, vous pouvez approximer le comportement avec os.stat ('foo') == os.stat ('bar') code>
Remarque: Cela semble seulement fonctionner si le fichier existe réellement. Lorsqu'ils sont hypothétiques (par exemple, vérifier si une destination cible existe déjà avant de copier un fichier), une comparaison Abspath est leur chemin à parcourir.
sur les systèmes Windows, il n'y a pas de Ceci Sera considérer "c: \ spam \ oeufs.txt" pour être équivalent à "c: \ spam \ oeufs.txt" sous Windows. p> Notez que contrairement à la fonction code> et vous devez également vous inquiéter de cas. La fonction
normes code> de
OS.Path code> peut être combinée avec
abspath code> pour gérer ce cas.
le mêmefile code>, toutes les méthodes Basé sur la normalisation et la comparaison des chemins ne seront pas au courant des cas où des chemins complètement différents font référence au même fichier. Sous Windows, cela signifie que si vous utilisez des actions réseau SST, MKLink ou montées pour créer plusieurs chemins distincts dans le même fichier, aucune de ces solutions ne pourra dire "c'est le même fichier". Espérons que ce n'est pas trop de problème la plupart du temps. P> p>
Peut être l'une peut utiliser OS.Path.RelPath (path1, chemin2) comme solution de contournement pour OS.Path.Samefile (chemin1, chemin2) sur Windows? P>
Si OS.Path.Relpath (chemin1, chemin2) retourne '.' que le chemin1 et le chemin2 point sur le même endroit p>