La meilleure façon de récupérer les valeurs variables d'un fichier texte-Python-Json

se référant à cette question , j'ai un problème similaire-mais pas le même..

Sur mon chemin, je vais avoir un fichier texte, structuré comme:

var_a: 'home'
var_b: 'car'
var_c: 15.5

et j'ai besoin que python lise le fichier et crée ensuite une variable appelée var_a avec la valeur 'home', et ainsi de suite.

exemple:

#python stuff over here
getVarFromFile(filename) #this is the function that im looking for
print var_b
#output: car, as string
print var_c
#output 15.5, as number.

est-ce possible, je veux dire, même garder le type var?

Notez que j'ai la pleine liberté de la structure du fichier texte, je peux utiliser le format que j'aime si celui que j'ai proposé n'est pas le meilleur.

EDIT : le ConfigParser peut être une solution, mais je ne l'aime pas tellement, parce que dans mon script je vais devoir alors faire référence aux variables dans le fichier avec

config.get("set", "var_name")

mais ce que j'aimerai c'est faire référence à la variable directement, comme je l'ai déclaré dans le script python...

il y a un moyen d'importer le fichier comme un dictionnaire python?

Oh, dernière chose, gardez à l'esprit que je ne sais pas exactement combien de variables que j'ai dans le fichier texte.

Edit 2 : je suis très intéressé par la solution JSON de stephan, parce que de cette façon le fichier texte pourrait être lu simplement avec d'autres langues (PHP, puis via AJAX JavaScript, par exemple), mais je échoue dans quelque chose tout en agissant cette solution:

#for the example, i dont load the file but create a var with the supposed file content
file_content = "'var_a': 4, 'var_b': 'a string'"
mydict = dict(file_content)
#Error: ValueError: dictionary update sequence element #0 has length 1; 2 is required
file_content_2 = "{'var_a': 4, 'var_b': 'a string'}"
mydict_2 = dict(json.dump(file_content_2, True))
#Error:
#Traceback (most recent call last):
#File "<pyshell#5>", line 1, in <module>
#mydict_2 = dict(json.dump(file_content_2, True))
#File "C:Python26libjson__init__.py", line 181, in dump
#fp.write(chunk)
#AttributeError: 'bool' object has no attribute 'write'

dans quel genre de questions puis-je tomber avec le format JSON? Et, comment puis-je lire un tableau JSON dans un fichier texte, et le transformer en dict python?

P. S: I don't like the solution using .fichiers py, je préfère .txt,.Inc. ,tout ce qui n'est pas restrictif pour une langue.

32
demandé sur Community 2009-05-29 10:48:30

9 réponses

Chargez votre fichier avec JSON ou PyYAML dans un dictionnaire the_dict (voir doc pour JSON ou PyYAML pour cette étape, les deux peuvent stocker le type de données) et ajouter le dictionnaire à votre dictionnaire mondial, par exemple en utilisant globals().update(the_dict) .

Si vous le voulez dans un dictionnaire au lieu (p. ex. à l'intérieur d'une fonction), vous pouvez le faire comme ceci:

for (n, v) in the_dict.items():
    exec('%s=%s' % (n, repr(v)))

dans la mesure où il est sûr d'utiliser exec . Si ce n', vous pouvez utiliser le dictionnaire directement.

14
répondu stephan 2013-10-20 11:16:47

mais ce que j'aimerai c'est faire référence à la variable direclty, comme je l'ai déclaré dans le script python..

en supposant que vous êtes heureux de changer légèrement votre syntaxe, utilisez juste python et importez le module "config".

# myconfig.py:

var_a = 'home'
var_b = 'car'
var_c = 15.5

Puis faites

from myconfig import *

et vous pouvez les référencer par leur nom dans votre contexte actuel.

57
répondu hbn 2009-05-29 07:54:55

Utiliser ConfigParser.

votre config:

[myvars]
var_a: 'home'
var_b: 'car'
var_c: 15.5

votre code python:

import ConfigParser

config = ConfigParser.ConfigParser()
config.read("config.ini")
var_a = config.get("myvars", "var_a")
var_b = config.get("myvars", "var_b")
var_c = config.get("myvars", "var_c")
24
répondu Igor Krivokon 2009-05-29 08:25:36

vous pouvez traiter votre fichier texte comme un module python et le charger dynamiquement en utilisant imp.load_source :

import imp
imp.load_source( name, pathname[, file]) 

exemple:

// mydata.txt
var1 = 'hi'
var2 = 'how are you?'
var3 = { 1:'elem1', 2:'elem2' }
//...

// In your script file
def getVarFromFile(filename):
    import imp
    f = open(filename)
    global data
    data = imp.load_source('data', '', f)
    f.close()

# path to "config" file
getVarFromFile('c:/mydata.txt')
print data.var1
print data.var2
print data.var3
...
17
répondu Nick Dandoulakis 2016-03-28 20:02:21

les autres solutions postées ici n'ont pas fonctionné pour moi, parce que:

  • j'ai juste besoin de paramètres à partir d'un fichier normal d'un script
  • import * n'a pas fonctionné pour moi, car j'ai besoin d'un moyen de les outrepasser En choisissant un autre fichier
  • juste un fichier avec un dict n'était pas très bien, car j'avais besoin de commentaires à ce sujet.

donc j'ai fini par utiliser Configparser et globals().update()

fichier Test:

#File parametertest.cfg:
[Settings]
#Comments are no Problem
test= True
bla= False    #Here neither

#that neither

et c'est mon script de démo:

import ConfigParser

cfg = ConfigParser.RawConfigParser()
cfg.read('parametertest.cfg')       # Read file

#print cfg.getboolean('Settings','bla') # Manual Way to acess them

par=dict(cfg.items("Settings"))
for p in par:
    par[p]=par[p].split("#",1)[0].strip() # To get rid of inline comments

globals().update(par)  #Make them availible globally

print bla

C'est juste pour un fichier avec un article aujourd'hui, mais qui sera facile à adopter.

l'Espoir qu'il sera utile pour quelqu'un :)

5
répondu SolarSimon 2012-08-03 16:21:55

supposons que vous ayez un fichier appelé "test".txt":

a=1.251
b=2.65415
c=3.54
d=549.5645
e=4684.65489

et vous voulez trouver une variable (a,b,c,D ou e):

ffile=open('test.txt','r').read()

variable=raw_input('Wich is the variable you are looking for?\n')

ini=ffile.find(variable)+(len(variable)+1)
rest=ffile[ini:]
search_enter=rest.find('\n')
number=float(rest[:search_enter])

print "value:",number
3
répondu JorgeGarza 2012-03-22 03:43:22

votre format est-il fiable? Si le seperateur est toujours exactement":", les travaux suivants. Si ce n'est pas le cas, une regex relativement simple devrait faire l'affaire.

tant que vous travaillez avec des types de variables assez simples, la fonction eval de Python rend les variables persistantes aux fichiers étonnamment faciles.

(ci-dessous vous donne un dictionnaire, btw, que vous avez mentionné était l'une de vos solutions préférées).

def read_config(filename):
    f = open(filename)
    config_dict = {}
    for lines in f:
        items = lines.split(': ', 1)
        config_dict[items[0]] = eval(items[1])
    return config_dict
2
répondu mavnn 2009-05-29 10:48:19

ce que vous voulez apparemment vouloir est le suivant, mais c'est non recommandé :

>>> for line in open('dangerous.txt'):
...     exec('%s = %s' % tuple(line.split(':', 1)))
... 
>>> var_a
'home'

cela crée un comportement quelque peu similaire à register_globals de PHP et a donc les mêmes problèmes de sécurité. En outre, l'utilisation de exec que j'ai montré permet l'exécution de code arbitraire. Seulement utilisez cette option que si vous êtes absolument sûr que le contenu du fichier texte peut être de confiance en toutes les circonstances.

vous devriez vraiment envisager de lier les variables non pas à la portée locale, mais à un objet, et utiliser une bibliothèque qui analyse le contenu du fichier de telle sorte qu'aucun code ne soit exécuté. Donc: aller avec l'une des autres solutions proposées ici.

(veuillez noter: j'ai ajouté cette réponse non pas comme une solution, mais comme une non-solution .)

1
répondu Stephan202 2009-05-29 07:55:57

la réponse de hbn ne fonctionnera pas si le fichier à charger est dans un sous-répertoire ou est nommé avec des tirets .

dans ce cas, vous pouvez considérer cette alternative:

exec open(myconfig.py).read()

ou le plus simple mais déprécié en python3:

execfile(myconfig.py)

je suppose que L'avertissement de Stephan202 s'applique aux deux options, bien que, et peut-être la boucle sur les lignes est plus sûr.

0
répondu Skippy le Grand Gourou 2017-05-23 12:34:33