web-dev-qa-db-fra.com

Utiliser des chemins Unix absolus dans les fenêtres avec python

Je crée une application qui stocke des fichiers blob sur le disque dur, mais ce script doit s'exécuter à la fois sur Linux et Windows, le problème est que je veux lui donner un chemin absolu à partir de la racine du système de fichiers et non un relatif aux fichiers de projet , car j'utilise git et je ne veux pas m'occuper d'exclure tous ces fichiers de la synchronisation.

Je voudrais donc avoir quelque chose comme ça:

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

et obtenez un fichier sous unix à:

/var/lib/blob_files/myfile.blob

et dans les fenêtres à:

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

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

Comment puis-je atteindre cet objectif? Existe-t-il une bibliothèque ou une fonction qui peut m'aider de manière transparente à convertir ces chemins sans avoir à demander dans quelle plate-forme le script s'exécute tout le temps?

De mes deux options, absolue de la racine ou relative du dossier de départ, laquelle recommandez-vous d'utiliser?

Merci d'avance pour tout conseil à ce sujet

26
jeruki

Utilisez os.path.abspath(), et également os.path.expanduser() pour les fichiers relatifs au répertoire personnel 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 la bonne chose" pour les chemins Windows et POSIX.

expanduser() ne changera pas le chemin s'il ne contient pas de ~, vous pouvez donc 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ée sera le lecteur spécifié par le répertoire de travail actuel du processus Python, généralement le répertoire dans lequel se trouve votre script (si vous le lancez à partir de l'Explorateur Windows et en supposant que votre script ne fonctionne pas) Si vous voulez le forcer à toujours être C:, 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
32
kindall

D'accord, j'ai obtenu une réponse par moi-même.

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

Peut-être que cela sera utile à n'importe qui

2
Snorlax

De la réponse de Blenders à Chemins de fichiers indépendants de la plateforme?

>>> import os
>>> os.path.join('app', 'subdir', 'dir', 'filename.foo')
'app/subdir/dir/filename.foo'
1
dm03514