2009-07-30 1 views

risposta

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

Bella risposta. Non sapevo di questo metodo! – jkp

+3

Si noti che questo è documentato come disponibile solo su Unix. Non è presente su Windows, almeno in Python 2.6. – Weeble

+2

per Windows, è possibile approssimare il comportamento con 'os.stat ('foo') == os.stat ('bar')' – wim

6

Si desidera utilizzare os.path.abspath(path) per normalizzare ogni percorso per il confronto.

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

una semplice stringa confrontare dovrebbe funzionare:

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

credito ad Andrew, ha corretto il mio post iniziale che comprendeva una chiamata a os.path.normpath: questo è non necessari perché l'implementazione di os.path.abspath fa per voi.

+1

Non è necessario chiamare prima 'normpath'. –

+0

Andrew: se si andavano a confrontare le stringhe, in alcuni casi si potrebbero trovare percorsi diversi che puntano allo stesso file. os.abspath non fa nulla di intelligente, aggiunge solo un prefisso. – jkp

+0

@Andrew: no lo riprendo! Avevi ragione, almeno per * nix l'implementazione lo fa per te. Ogni giorno è uno schoool :) – jkp

0

Sui sistemi Windows, non esiste la funzione samefile e si deve anche preoccuparsi del caso. La funzione normcase da os.path può essere combinata con abspath per gestire questo caso.

from os.path import abspath, normcase 

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

Ciò in considerazione "C: \ SPAM \ Eggs.txt" essere equivalente a "c: \ Spam \ eggs.txt" su Windows.

Nota che a differenza di samefile, tutti i metodi basati sulla normalizzazione e sul confronto dei percorsi non saranno a conoscenza dei casi in cui percorsi completamente diversi si riferiscono allo stesso file. Su Windows, questo significa che se si utilizzano SUBST, MKLINK o condivisioni di rete montate per creare più percorsi distinti sullo stesso file, nessuna di queste soluzioni sarà in grado di dire "è lo stesso file". Spero che questo non sia un problema per la maggior parte del tempo.

0

Potrebbe essere possibile utilizzare os.path.relpath (percorso1, percorso2) come soluzione alternativa per os.path.samefile (percorso1, percorso2) su Windows?

Se os.path.relpath (percorso1, percorso2) restituisce '.' che path1 e path2 puntano allo stesso punto