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).
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')
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']
>>>
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.
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')]
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