2011-09-30 1 views
13

Je suis en train de prendre un onglet fichier délimité par deux colonnes, le nom et l'âge, qui se lit dans ce type:Parsing un onglet fichier délimité dans des listes séparées ou des chaînes

« Nom \ TAGE \ Nmark \ t32 \ nMatt \ t29 \ nJohn \ t67 \ nJason \ t45 \ nMatt \ t12 \ nFrank \ t11 \ nFrank \ t34 \ nFrank \ t65 \ nFrank \ t78 \ n '

Et créer simplement deux listes, une avec des noms (appelés noms, sans titre) et un avec les âges (appelés âges, mais sans âges dans la liste).

Répondre

4

J'utiliser les split et splitlines méthodes de cordes:

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

Si vous analysez un format plus complexe, je suggère d'utiliser the csv module, qui peut aussi manipuler TSV ... Mais il semble que ce serait un peu exagéré ici.

17

Utilisation du csv module, vous pourriez faire quelque chose comme ceci:

données
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

de tabulation est dans le domaine du module 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) 

faire semblant infile était juste un file régulier ..

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

vous n'avez même pas dire le module csv sur les rubriques et le format de délimiteur, il va comprendre sur son propre

>>> 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

réponse de Unutbu compressé à l'aide d'une compréhension de la liste:

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')] 
Questions connexes