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