2012-12-29 7 views
0

Je crée un script simple pour mixer et j'ai besoin d'un peu d'aide pour obtenir des données à partir du fichier i ont créé avant via python.Lire les données du fichier dans différents tableaux en python

Ce fichier a la structure comme ci-dessous:

name first morph 
values -1.0000 1.0000 
data 35 0.026703 0.115768 -0.068769 
data 36 -0.049349 0.015188 -0.029470 
data 37 -0.042880 -0.045805 -0.039931 
data 38 0.000000 0.115775 -0.068780 
name second morph 
values -0.6000 1.2000 
data 03 0.037259 -0.046251 -0.020062 
data 04 -0.010330 -0.046106 -0.019890 
… 

etc lignes plus 2k, p

Ce que j'ai besoin est de créer une boucle qui a lu pour moi les lignes de données par ligne et mettre les valeurs en trois Tableaux différents: noms [] valeurs [] et données [] selon le premier mot de la ligne de fichier.

Manualy it should be like that: 
names.append('first morph') 
values.append((-1.0000,1.0000)) 
data.append((35, 0.026703, 0.115768, -0.068769)) 
data.append((36, -0.049349, 0.015188, -0.029470)) 
data.append((37, -0.042880, -0.045805, -0.039931)) 
data.append((38, 0.000000, 0.115775, -0.068780)) 
names.append('second morph') 
values.append((-0.6000,1.2000)) 
… 

Je ne sais pas pourquoi mes atempts de créer ce genre de « pour la ligne dans le fichier: » boucle créer plus d'erreurs que les données complètes, je ne sais pas pourquoi va hors de portée, ou ne pas obtenir les données appropriées

Veuillez aider à automatiser ce processus au lieu d'écrire manuellement chaque ligne puisque j'ai déjà exporté les paramètres nécessaires dans un fichier.

+3

Poster ce que vous avez maintenant. – Blender

Répondre

2
names = [] 
values = [] 
data = [] 
with open('yourfile') as lines: 
    for line in lines: 
     first, rest = line.split(' ', 1) 

     if first == 'name': 
      names.append(rest) 

     elif first == 'values': 
      floats = map(float, rest.split()) 
      values.append(tuple(floats)) 

     elif first == 'data': 
      int_str, floats_str = rest.split(' ', 1) 
      floats = map(float, floats_str.split()) 
      data.append((int(int_str),) + tuple(floats)) 

Pourquoi en avez-vous besoin comme ça? Comment saurez-vous où le nom suivant commence dans vos listes de données et de valeurs?

+0

Je vais établir une connexion entre le nom et l'index de tableau de valeur. Pour le tableau de données, j'ajouterai peut-être un paramètre de plus à l'index actuel dans le tableau de noms qui augmentera chaque fois qu'un 'nom' apparaîtra dans le fichier. – regg

+0

Êtes-vous sûr de ne pas vouloir une liste d'objets de morphing (ou de simples tuples), avec des noms, des valeurs et des attributs de données? –

0

Voici un python simple "pour la ligne dans" solution ... vous pouvez simplement appeler processed.py ...

fp = open("data1.txt", "r") 

data = fp.readlines() 
fp1 = open("processed.py", "w") 

fp1.write("names = []\nvalues=[]\ndata=[]\n") 

for line in data: 
    s = "" 
    if "name" in line: 
     s = "names.append('" + line[5:].strip() + "')" 
    elif "values" in line: 
     s = "values.append((" + ", ".join(line[7:].strip().split(" ")) + "))" 
    elif "data" in line: 
     s = "data.append((" + ", ".join(line[5:].strip().split(" ")) + "))" 

    fp1.write(s + "\n"); 

fp1.close() 
fp.close() 
Questions connexes