2011-09-30 4 views
13

Estoy tratando de tener un archivo delimitado lengüeta con dos columnas, nombre y edad, que lee en como esta:análisis de un archivo delimitado lengüeta en listas o cuerdas separadas

'Nombre \ Tage \ nMark \ t32 \ nMatt \ t29 \ nJohn \ t67 \ nJason \ t45 \ nMatt \ t12 \ nFrank \ t11 \ nFrank \ t34 \ nFrank \ t65 \ nFrank \ t78 \ n '

Y simplemente cree dos listas, una con nombres (llamados nombres, sin encabezado) y uno con las edades (llamadas edades, pero sin edades en la lista).

Respuesta

4

me gustaría utilizar los split y splitlines métodos de cadenas:

names = [] 
ages = [] 
for name_age in input.splitlines(): 
    name, age = name_age.strip().split("\t") 
    names.append(name) 
    ages.append(age) 

Si fue analizar un formato más complejo, se recomienda usar the csv module, que también puede manejar TSV ... Pero parece que sería un poco exagerado aquí.

17

Utilizando el csv module, que podría hacer algo como esto:

import csv 

names=[] 
ages=[] 
with open('data.csv','r') as f: 
    next(f) # skip headings 
    reader=csv.reader(f,delimiter='\t') 
    for name,age in reader: 
     names.append(name) 
     ages.append(age) 

print(names) 
# ('Mark', 'Matt', 'John', 'Jason', 'Matt', 'Frank', 'Frank', 'Frank', 'Frank') 
print(ages) 
# ('32', '29', '67', '45', '12', '11', '34', '65', '78') 
10

delimitado por tabuladores de datos está dentro del dominio del módulo csv:

>>> corpus = 'Name\tAge\nMark\t32\nMatt\t29\nJohn\t67\nJason\t45\nMatt\t12\nFrank\t11\nFrank\t34\nFrank\t65\nFrank\t78\n' 
>>> import StringIO 
>>> infile = StringIO.StringIO(corpus) 

pretender infile fue sólo un habitual file ..

>>> import csv 
>>> r = csv.DictReader(infile, 
...     dialect=csv.Sniffer().sniff(infile.read(1000))) 
>>> infile.seek(0) 

que ni siquiera tiene que decirle al módulo csv sobre los títulos y el formato de delimitador, que va a averiguar por su propia

>>> names, ages = [],[] 
>>> for row in r: 
...  names.append(row['Name']) 
...  ages.append(row['Age']) 
... 
>>> names 
['Mark', 'Matt', 'John', 'Jason', 'Matt', 'Frank', 'Frank', 'Frank', 'Frank'] 
>>> ages 
['32', '29', '67', '45', '12', '11', '34', '65', '78'] 
>>> 
1

respuesta de Unutbu comprimido usando una lista por comprensión:

names = [x[0] for x in csv.reader(open(filename,'r'),delimiter='\t')] 
ages = [x[1] for x in csv.reader(open(filename,'r'),delimiter='\t')] 
Cuestiones relacionadas