OVH Cloud OVH Cloud

importation de fichiers

6 réponses
Avatar
Sébastien V.
Bonjour,

Je souhaiterais faire la chose suivante :

for fichier in [LISTE DE FICHIERS]:
import fichier

Mon but est d'importer un nombre inconnu à la base de fichiers. Comment
peut-on faire cela ?

Sébastien

6 réponses

Avatar
Jerome
Sébastien V. wrote:
Bonjour,

Je souhaiterais faire la chose suivante :

for fichier in [LISTE DE FICHIERS]:
import fichier

Mon but est d'importer un nombre inconnu à la base de fichiers. Comment
peut-on faire cela ?

Sébastien


Bonjour,


Tu peux faire


for filename in ['string', 'math']:
exec('import %s' % (filename))

print dir(string)
print dir(math)


Jérôme

Avatar
F. Petitjean
Bonjour,

Je souhaiterais faire la chose suivante :

for fichier in [LISTE DE FICHIERS]:
import fichier

Mon but est d'importer un nombre inconnu à la base de fichiers. Comment
peut-on faire cela ?
Regardez du côté de __import__, par exemple

modules = [ __import__(nom) for nom in liste ]
Dans ce cas tous les fichiers-modules sont importés, mais vous n'obtenez
que les modules eux-mêmes. Si on a
modules = [ __import__(nom) for nom in ('sys', 're') ]
modules[0] correspond au module sys
sys = modules[0]
re = modules[1]
et pour effectuer ces assignations, vous pouvez lorgner du côté de exec,
eval() ou même setattr(me, nom, module) si vous arrivez à avoir dans
'me' une référence au module courant : (non testé)
me = __import__(__name__)
for nom in ListeOfNoms:
setattr(me, nom, __import__(nom))
del me # un cycle en moins pour gc

A la base, je mets en doute l'intérêt de passer par ces acrobaties.

Pourriez-vous nous donner un peu plus de détails sur ce que vous voulez
réellement faire ?
Sébastien


Avatar
Yermat
Jerome wrote:
Sébastien V. wrote:

Bonjour,

Je souhaiterais faire la chose suivante :

for fichier in [LISTE DE FICHIERS]:
import fichier

Mon but est d'importer un nombre inconnu à la base de fichiers. Comment
peut-on faire cela ?

Sébastien


Bonjour,


Tu peux faire


for filename in ['string', 'math']:
exec('import %s' % (filename))

print dir(string)
print dir(math)


ou mieux :

for module in ["string", "math"]:
__import__(module)

--
Yermat


Avatar
Sébastien V.
F. Petitjean wrote:
# un cycle en moins pour gc

A la base, je mets en doute l'intérêt de passer par ces acrobaties.

Pourriez-vous nous donner un peu plus de détails sur ce que vous
voulez réellement faire ?


En fait j'ai un petit outil qui prend en entrée des données (dans un fichier
plat pour le moment). L'idée de départ est de proposer de nouvelles entrées
de données (XML et base de données pour le moment) en ajoutant un fichier
dans un répertoire. Ce fichier contiendrait juste l'interface permettant de
lire les données.

D'ou mon besoin de pouvoir importer autant de modules qu'il y a de fichiers.


Sébastien


Avatar
Do Re Mi chel La Si Do
Bonjour !


En plus des méthodes citées, ce petit code, tiré de la doc Python (il permet
d'appeler un module par son nom_string, mais il permet aussi de choisir le
nom du module, dans Python) :



import imp,sys

def importAs(name):
try:
return sys.modules[name]
except KeyError:
pass

fp, pathname, description = imp.find_module(name)
try:
return imp.load_module(name, fp, pathname, description)
finally:
if fp:
fp.close()


toto=importAs('string')
print toto.upper('abcd') # ==> ABCD





Michel Claveau
Avatar
Do Re Mi chel La Si Do
Re !

Et, comme rien n'interdit d'utiliser un dictionnaire, on peut très bien
faire :

mtext='string'
toto={}
toto[mtext]=importAs(mtext)
print toto[mtext].upper('abcd')

Ce qui permet de connaître, à tout moment, l'ensemble des modules chargés
par cette méthode.
Je me sers de ça, dans un programme, où les utilisateurs peuvent importer
leurs propres modules. Cela me permet d'éviter les conflits, entre les
modules utilisateurs, et les modules standard-au-logiciel. Et j'ai, en plus,
l'information.

@-salutations

Michel Claveau