web-dev-qa-db-fra.com

Comment importer un fichier dans python avec des espaces dans le nom?

Dois-je dois supprimer tous les espaces du nom de fichier pour l'importer, ou existe-t-il un moyen de dire à import qu'il y a des espaces?

35
lilfrost

Vous devez supprimer les espaces du nom de fichier. Parce que le nom de fichier est utilisé comme identifiant pour les modules importés (c'est-à-dire foo.py sera importé en tant que foo) et Python ne peuvent pas avoir d'espaces, cela n'est pas pris en charge par l'instruction import.

Si vous vraiment devez le faire pour une raison quelconque, vous pouvez utiliser le __import__ fonction:

foo_bar = __import__("foo bar")

Cela importera foo bar.py comme foo_bar. Cela se comporte un peu différemment de l'instruction import et vous devez l'éviter.

50
Jeremy Banks

Si vous voulez faire quelque chose comme from foo_bar import * (mais avec un espace au lieu d'un trait de soulignement), vous pouvez utiliser execfile (docs ici ):

execfile("foo bar.py")

bien qu'il soit préférable d'éviter les espaces dans les noms de fichiers source.

8
drevicko

Vous pouvez aussi utiliser importlib.import_module, qui est un wrapper autour de __import__.

foo_bar_mod = importlib.import_module("foo bar")

ou

foo_bar_mod = importlib.import_module("path.to.foo bar")

Plus d'informations: https://docs.python.org/2/library/importlib.html

1
TBirkulosis

Juste pour ajouter à la réponse de Banks, si vous importez un autre fichier que vous n'avez pas enregistré dans l'un des répertoires Python vérifie l'importation de répertoires, vous devez ajouter le répertoire à votre chemin avec

import sys
sys.path.append("absolute/filepath/of/parent/directory/of/foo/bar")

avant d'appeler

foo_bar = __import__("foo bar")

ou

foo_bar = importlib.import_module("foo bar")

C'est quelque chose que vous n'avez pas à faire si vous l'importiez avec import <module>, où Python vérifiera le répertoire courant du module. Si vous importez un module du même répertoire, par exemple, utilisez

import os,sys
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
foo_bar = __import__('foo_bar')

J'espère que cela permettra à quelqu'un d'autre d'essayer d'importer son propre fichier au nom étrange ou un fichier Python qu'il a téléchargé manuellement quelque temps :)

0
Anonymous