2012-10-31 1 views
19

Je crée une application qui stocke des fichiers blob sur le disque dur, mais ce script doit s'exécuter dans Linux et Windows, le problème est que je veux lui donner un chemin absolu depuis la racine du système de fichiers et non celle relative aux fichiers du projet, ceci parce que j'utilise git et que je ne veux pas m'occuper de l'exclusion de tous ces fichiers de la synchronisation.Utilisation de chemins unix absolus dans Windows avec python

Donc je voudrais avoir quelque chose comme ceci:

path = '/var/lib/blob_files/' 
file = open(path+'myfile.blob', 'w') 

et obtenir un fichier unix à:

/var/lib/blob_files/myfile.blob 

et dans les fenêtres à:

C:\var\lib\blob_files\myfile.blob 

il pourrait aussi être relatif au dossier de départ de l'utilisateur (/ home/user dans unix et C:/Users/User dans Windows) mais je suppose que le problème est très similaire.

Comment puis-je y parvenir? Y at-il une bibliothèque ou une fonction qui peut m'aider à convertir ces chemins de façon transparente sans avoir à demander dans quelle plateforme le script fonctionne-t-il tout le temps?

Parmi mes deux options, absolues à partir de la racine ou relatives à partir du dossier de départ, laquelle recommandez-vous d'utiliser?

Merci à l'avance pour tout conseil sur ce

+0

double possible de [les chemins de fichier Plate-forme indépendante?] (Http://stackoverflow.com/questions/6036129/platform-independent-file-paths) – dm03514

+7

Pas un doublon. Allez les gars, donnez une pause aux nouveaux. –

+1

Je ne suis pas sûr pourquoi vous pensez que vous avez besoin d'un chemin absolu "parce que im utilisant git et ne veux pas faire face à l'exclusion de tous ces fichiers". Comment cela se passe-t-il?Quoi qu'il en soit, il semble que le relatif à la maison a plus de sens ici, parce que les utilisateurs de Windows n'auront pas de répertoire appelé C: \ var \ lib \ ', donc créer C: \ var \ lib \ blob_files sera bizarre , mais créer l'équivalent Windows de '~/.blob_files' est parfaitement raisonnable. – abarnert

Répondre

27

Utilisez os.path.abspath(), et aussi os.path.expanduser() pour les fichiers relatifs au répertoire de l'utilisateur:

print os.path.abspath("/var/lib/blob_files/myfile.blob") 
>>> C:\var\lib\blob_files\myfile.blob 

print os.path.abspath(os.path.expanduser("~/blob_files/myfile.blob")) 
>>> C:\Users\jerry\blob_files\myfile.blob 

Ceux-ci "feront le bon choix" pour les chemins Windows et POSIX.

expanduser() ne changera pas le chemin s'il n'y a pas de ~, donc vous pouvez l'utiliser en toute sécurité avec tous les chemins. Ainsi, vous pouvez facilement écrire une fonction wrapper:

import os 
def fixpath(path): 
    return os.path.abspath(os.path.expanduser(path)) 

Notez que la lettre de lecteur utilisé sera le lecteur spécifié par le répertoire de travail courant du processus Python, généralement le répertoire de votre script est (si le lancement à partir de Windows Explorer, et en supposant que votre script ne le change pas). Si vous voulez forcer à être C: toujours que vous pouvez faire quelque chose comme ceci:

import os 
def fixpath(path): 
    path = os.path.normpath(os.path.expanduser(path)) 
    if path.startswith("\\"): return "C:" + path 
    return path 
+0

merci beaucoup c'est exactement ce que je cherchais – jeruki

+3

Vous n'avez pas besoin de 'abspath' ici; vous avez besoin de 'normpath'. Il est vrai que 'abspath' appelle implicitement' normpath', mais vous devriez appeler la bonne fonction pour le travail, et non celle qui arrive à fonctionner par accident. Aussi, est-ce que ça va être sur C: ', ou sur le disque actuel? (Et lequel est approprié pour l'utilisation de l'OP?) – abarnert

+0

J'ai choisi 'abspath()' intentionnellement puisque 'normpath()' n'ajoute pas la lettre de lecteur au chemin retourné. Ce n'était pas un accident. La lettre de lecteur sera celle sur le répertoire courant où le script Python vit (je mettrai à jour ma réponse en conséquence). – kindall

0

Ok, je suis une réponse par moi-même.

os.path.exists(os.path.abspath(filePath)) 

Peut-être qu'il sera utile pour tout le monde

Questions connexes