web-dev-qa-db-fra.com

Analyser les paires clé-valeur dans un fichier texte

Je suis un débutant avec Python et je cherche comment analyser un fichier .txt. Mon fichier .txt est une liste de noms avec des informations de calcul du type:

myfile.txt

var0 = 16
var1 = 1.12434E10
var2 = -1.923E-3
var3 = 920

Comment lire les valeurs et les mettre dans myvar0, myvar1, myvar2, myvar3 en python?

14
Vincent

Je suggère de stocker les valeurs dans un dictionnaire plutôt que dans des variables locales distinctes:

myvars = {}
with open("namelist.txt") as myfile:
    for line in myfile:
        name, var = line.partition("=")[::2]
        myvars[name.strip()] = float(var)

Maintenant, accédez-y en tant que myvars["var1"]. Si les noms sont tous des noms de variables python valides, vous pouvez indiquer ceci ci-dessous:

names = type("Names", [object], myvars)

et accédez aux valeurs comme par ex. names.var1.

45
Lauritz V. Thaulow

Essayez le module standard Python configparser

11
kev

J'ai personnellement résolu ce problème en créant un fichier .py contenant uniquement tous les paramètres sous forme de variables - puis:

include PARAMETERS.py

dans les modules du programme qui ont besoin des paramètres.

C'est un peu moche, mais TRÈS simple et facile à travailler.

4
John Bailey

Comme @kev le suggère, le module configparser est la voie à suivre.

Cependant, dans certains scénarios (un peu moche, je l’avoue), mais le moyen le plus simple et le plus efficace consiste à renommer myfile.txt en myfile.py et à effectuer un from myfile import * (après avoir corrigé la typo var 0 -> var0).

Cependant, c'est très peu sûr , donc si le fichier provient d'une source externe ou peut être écrit par un attaquant malveillant, utilisez quelque chose qui valide les données au lieu de les exécuter à l'aveuglette.

1
Kimvais

S'il y a plusieurs valeurs séparées par des virgules sur une seule ligne, voici le code pour l'analyser:

    res = {}                                                                                                                                                                                             

    pairs = args.split(", ")                                                                                                                                                                             
    for p in pairs:                                                                                                                                                                                      
        var, val = p.split("=")                                                                                                                                                                          
        res[var] = val                                                                                                                                                                                   
0
Lana Nova

Utilisez pandas.read_csv lorsque le format du fichier devient plus sophistiqué (comme les commentaires). 

val = u'''var0 = 16
var1 = 1.12434E10
var2 = -1.923E-3
var3 = 920'''
print(pandas.read_csv(StringIO(val), # or read_csv('myfile.txt',
            delimiter='\s*=\s*',
            header=None,
            names=['key','value'],
            dtype=dict(key=numpy.object,value=numpy.object), # or numpy.float64
            index_col=['key']).to_dict()['value'])
# prints {u'var1': u'1.12434E10', u'var0': u'16', u'var3': u'920', u'var2': u'-1.923E-3'}
0
rwitzel

Les compréhensions dictées ( PEP 274 ) peuvent être utilisées pour une expression plus courte (60 caractères):

d = {k:float(v) for k, v in (l.split('=') for l in open(f))}

EDIT: réduit de 72 à 60 caractères grâce à la suggestion de @jmb (éviter .readlines()).

0