10
votes

Vérifiez les chemins absolus en python

Comment puis-je vérifier si deux chemins de fichiers pointent sur le même fichier de Python?


0 commentaires

5 Réponses :


6
votes

Vous souhaitez utiliser os.path.abspath (chemin) code > pour normaliser chaque chemin de comparaison.

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


0 commentaires

3
votes

Une simple chaîne Comparer devrait fonctionner:

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


4 commentaires

Vous n'avez pas besoin d'appeler normpath 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)).



26
votes
$ 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

4 commentaires

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


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.



0
votes

sur les systèmes Windows, il n'y a pas de la fonction et vous devez également vous inquiéter de cas. La fonction normes de OS.Path peut être combinée avec abspath pour gérer ce cas. XXX

Ceci Sera considérer "c: \ spam \ oeufs.txt" pour être équivalent à "c: \ spam \ oeufs.txt" sous Windows.

Notez que contrairement à le mêmefile , 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.


0 commentaires

0
votes

Peut être l'une peut utiliser OS.Path.RelPath (path1, chemin2) comme solution de contournement pour OS.Path.Samefile (chemin1, chemin2) sur Windows?

Si OS.Path.Relpath (chemin1, chemin2) retourne '.' que le chemin1 et le chemin2 point sur le même endroit


0 commentaires