2008-10-08 8 views
5

J'adore Python parce que ça vient avec des piles, et j'utilise beaucoup de fonctions intégrées pour faire le sale boulot pour moi.Os.path: pouvez-vous expliquer ce comportement?

J'ai toujours été en utilisant heureusement le module os.path pour traiter le chemin du fichier, mais récemment, je fini avec des résultats inattendus sur Python 2.5 sous Linux Ubuntu, tout en traitant avec la chaîne qui représentent les fenêtres des chemins de fichiers:

filepath = r"c:\ttemp\FILEPA~1.EXE" 
print os.path.basename(filepath) 
'c:\\ttemp\\FILEPA~1.EXE'] 
print os.path.splitdrive(filepath) 
('', 'c:\ttemp\\FILEPA~1.EXE') 

WTF? Il finit de la même manière avec filepath = u "c: \ ttemp \ FILEPA ~ 1.EXE" et filepath = "c: \ ttemp \ FILEPA ~ 1.EXE".

Avez-vous une idée? Ubuntu utilise UTF8 mais je n'ai pas l'impression que ça a quelque chose à voir avec ça. Peut-être que mon installation de Python est foirée, mais je n'ai pas effectué de réglages particuliers dont je me souvienne.

+0

Vous pourriez vouloir examiner votre réponse acceptée - voir la référence de Moe à ntpath, qui est la bonne manière de faire ceci. –

Répondre

24

Si vous souhaitez manipuler des chemins Windows sur Linux, vous devez utiliser le module ntpath (ce qui est le module qui est importé comme os.path sur les fenêtres - posixpath est importé comme os.path sur linux)

>>> import ntpath 
>>> filepath = r"c:\ttemp\FILEPA~1.EXE" 
>>> print ntpath.basename(filepath) 
FILEPA~1.EXE 
>>> print ntpath.splitdrive(filepath) 
('c:', '\\ttemp\\FILEPA~1.EXE') 
+2

Ceci est une excellente réponse qui mérite d'être acceptée, à mon humble avis.Il est préférable d'utiliser des outils prêts à l'emploi que de créer vos propres expressions rationnelles. –

+1

+1 pour ntpath; c'est la bonne chose à faire – efotinis

+0

Mon gof, c'est génial! –

3

A partir d'une documentation os.path:

os.path.splitdrive (trajet)
de Split le trajet de chemin dans une paire (moteur, queue) où lecteur est soit une spécification d'entraînement ou la chaîne vide. Sur les systèmes qui n'utilisent pas les spécifications du lecteur, le lecteur sera toujours la chaîne vide. Dans tous les cas, drive + tail sera le même que path.

Si vous exécutez ce sous UNIX, il n'utilise pas les spécifications du disque, par conséquent - drive sera une chaîne vide.

Si vous voulez résoudre des chemins de fenêtres sur toute plate-forme, vous pouvez simplement utiliser une expression rationnelle simple:

import re 
(drive, tail) = re.compile('([a-zA-Z]\:){0,1}(.*)').match(filepath).groups() 

drive sera une lettre de lecteur suivie : (par exemple c:, u:.) Ou None, et tail tout le reste :)

+0

Oui, il suffit de réaliser que: le processus de chaîne est basé sur le système d'exploitation, pas sur la syntaxe. Cela ne fait aucune différence entre win et unix, il suffit d'appliquer un algo différent en fonction de votre plateforme. Merde. –

+0

N'utilisez pas d'expressions régulières, utilisez plutôt le module ntpath - voir ma réponse. – Moe

+0

Aucune infraction kender, il a raison :-) –

1

Voir la documentation here, plus précisément:

splitdrive (p) Diviser un chemin d'accès en et le chemin d'accès. Sur Posix, le lecteur est toujours vide.

Cela ne fonctionnera donc pas sur une machine Linux.

Questions connexes