2010-05-08 4 views
2
Parsing

Mon fichier d'entrée va être quelque chose comme çafichiers avec python

key "value" 
key "value" 
... the above lines repeat 

Ce que je fais est lu le contenu du fichier, remplir un objet avec les données et le retourner. Il n'y a qu'un nombre défini de clés pouvant être présentes dans le fichier. Depuis que je suis un débutant en python, je sens que mon code pour lire le fichier est pas bon

Mon code est quelque chose comme ça

ObjInstance = CustomClass() 
fields = ['key1', 'key2', 'key3'] 

    for field in fields: 
     for line in f: 
      if line.find(field) >= 0: 
       if pgn_field == 'key1': 
        objInstance.DataOne = get_value_using_re(line) 
       elif pgn_field == 'key2': 
        objInstance.DataTwo = get_value_using_re(line) 

return objInstance; 

La fonction « get_value_using_re » est très simple, il recherche une chaîne entre les guillemets et le renvoie.

Je crains d'avoir plusieurs instructions if elif et je ne sais pas si c'est la bonne ou non.

Est-ce que je fais la bonne chose ici?

+0

La bonne chose est d'utiliser si possible le format de fichier existant tel que INI (lu par ConfigParser) ou JSON (lu par json). – jfs

+0

Mon fichier ne sera pas un fichier de configuration, mais un fichier que l'utilisateur téléchargera. – iJK

+0

La liste des paires clé/valeur de chaîne peut être représentée à l'aide des formats INI, JSON, YAML que vous appeliez le fichier de configuration ou non. Ne réinventez pas la roue. – jfs

Répondre

4

Une approche normale en Python serait quelque chose comme:

for line in f: 
    mo = re.match(r'^(\S+)\s+"(.*?)"\s*$',line) 
    if not mo: continue 
    key, value = mo.groups() 
    setattr(objInstance, key, value) 

Si le key n'est pas le droit nom d'attribut, dans la dernière ligne de la ligne au lieu de key vous pouvez utiliser quelque chose comme translate.get(key, 'other') pour certains dict approprié translate.

+0

belle :) Merci – iJK

+0

pourquoi est-ce l'approche normale? À mon avis, l'analyse syntaxique n'est pas un ensemble de regexp. – dzen

+0

@dzen, pour des tâches d'analyse syntaxique relativement simples Les RE sont les pyjamas du chat: rapides, compacts, pratiques. 'pyparsing' et d'autres outils sont bien quand plus de puissance est nécessaire (par exemple, pour correspondre à des parenthèses imbriquées), mais seraient ici exagérés, donc, pas l'approche normale; Les opérations de chaînes étendues (appels 'find', tranchage, etc.) sont souvent plus lentes et plus verbeuses. –

2

Je suggère de regarder l'analyseur YAML pour python. Il peut commodément lire un fichier très similaire à celui-ci et l'entrer dans un dictionnaire python. Avec l'analyseur YAML:

import yaml 
map = yaml.load(file(filename)) 

Ensuite, vous pouvez y accéder comme un dictionnaire normale sur la carte [key] Valeur de retour. Les fichiers yaml ressembleraient à ceci:

key1: 'value' 
key2: 'value' 

Cela nécessite que toutes les clés soient uniques.

+0

Je ne pense pas que l'analyseur YAML fonctionnera pour moi, car le fichier peut contenir un certain texte qui n'a pas de clé. – iJK

Questions connexes