j'ouvrir les fichiers qui étaient dans le même répertoire que le script Python en cours d'exécution en utilisant simplement une commande commeComment ouvrir de manière fiable un fichier dans le même répertoire comme un script Python
open("Some file.txt", "r")
Cependant, je a découvert que lorsque le script était exécuté dans Windows en double-cliquant dessus, il essayait d'ouvrir le fichier à partir du mauvais répertoire.
Depuis que j'ai utilisé une commande de la forme
open(os.path.join(sys.path[0], "Some file.txt"), "r")
chaque fois que je voulais ouvrir un fichier. Cela fonctionne pour mon usage particulier, mais je ne suis pas sûr si sys.path[0]
pourrait échouer dans un autre cas d'utilisation. Donc, ma question est: Quelle est la meilleure et la plus fiable façon d'ouvrir un fichier qui se trouve dans le même répertoire que le script Python en cours d'exécution?
Voici ce que je suis en mesure de comprendre à ce jour:
os.getcwd()
etos.path.abspath('')
retourner le « répertoire de travail », pas le répertoire de script.os.path.dirname(sys.argv[0])
etos.path.dirname(__file__)
renvoient le chemin utilisé pour appeler le script, qui peut être relatif ou même vide (si le script est dans le fichier cwd). En outre,__file__
n'existe pas lorsque le script est exécuté dans IDLE ou PythonWin.sys.path[0]
etos.path.abspath(os.path.dirname(sys.argv[0]))
semblent retourner le répertoire du script. Je ne suis pas sûr s'il y a une différence entre ces deux-là.
Edit:
Je viens de réaliser que ce que je veux faire serait mieux décrit comme « ouvrir un fichier dans le même répertoire que le module contenant ». En d'autres termes, si j'importe un module que j'ai écrit dans un autre répertoire, et que ce module ouvre un fichier, je veux qu'il recherche le fichier dans le répertoire du module. Je ne pense pas que tout ce que j'ai trouvé est capable de le faire ...
Si '__file__' ne peut pas être utilisé, alors utilisez' sys.argv [0] 'au lieu de' dirname (__ file __) '. Le reste devrait fonctionner comme prévu. J'aime utiliser '__file__' parce que dans le code de la bibliothèque,' sys.argv [0] 'pourrait ne pas pointer du tout sur votre code, surtout s'il est importé via un script tiers. –
Le problème avec ceci est que cela variera si le fichier en cours d'exécution provient directement de l'interrupteur ou s'il est importé. Voir ma réponse pour les différences entre __file__ et sys.argv [0] – Zimm3r
Alors est-il correct de dire que la variation décrite dans la réponse de Zimm3r est adressée en utilisant 'realpath (join (getcwd(), dirname (__ fichier__)))) décrit ici? – pianoJames