web-dev-qa-db-fra.com

Analyser un fichier délimité par des tabulations dans des listes ou des chaînes séparées

J'essaie de prendre un fichier délimité par des tabulations avec deux colonnes, Name et Age, qui se lit comme suit:

'Nom\tAge\nMarque\t32\nMat\t29\nJohn\t67\nJason\t45\nMat\t12\nFrank\t11\nFrank\t34\nFrank\t65\nFrank\t78\n'

Et créez simplement deux listes, une avec des noms (appelés noms, sans en-tête) et une avec les âges (appelée âges, mais sans âges dans la liste). 

15
user972297

En utilisant le module csv , vous pouvez faire quelque chose comme ceci:

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')
19
unutbu

les données délimitées par des tabulations sont 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)

prétendre que 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 besoin de dire au module csv les en-têtes et le format du délimiteur, ça va s'en sortir

>>> 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']
>>> 
10

J'utiliserais les méthodes split et splitlines de chaînes:

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

Si vous analysiez un format plus complexe, je suggérerais d'utiliser le module csv , qui peut également gérer tsv… Mais il semble que ce serait un peu excessif ici.

4
David Wolever

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

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')]
2
marvin

la réponse de Marvin mais sans lire le fichier en entier deux fois

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

Si vous êtes d'accord avec le fait qu'il s'agisse de tuples, au lieu de deux listes

vous pouvez toujours lire les données dans deux listes en un seul passage et ce serait la réponse de UnuBu

0
StevenWernerCS