Анализ файла с разделителями табуляции на отдельные списки или строки - PullRequest
15 голосов
/ 30 сентября 2011

Я пытаюсь взять файл с разделителями табуляции с двумя столбцами, «Имя» и «Возраст», который выглядит следующим образом:

Имя \ Tage \ nMark \ t32 \ nMatt \ t29 \ nJohn \ T67 \ nJason \ t45 \ nMatt \ t12 \ nFrank \ t11 \ nFrank \ t34 \ nFrank \ T65 \ nFrank \ T78 \ п '

И просто создайте два списка, один с именами (называемыми именами, без заголовка) и один с возрастами (называемыми возрастами, но без возрастов в списке).

Ответы [ 5 ]

19 голосов
/ 30 сентября 2011

Используя CSV-модуль , вы можете сделать что-то вроде этого:

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 голосов
/ 30 сентября 2011

Данные с разделителями табуляции находятся в домене модуля 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)

притворяйся infile был просто обычным file ...

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

вам даже не нужно сообщать модулю csv о заголовках и формате разделителя, он сам разберется с этим

>>> 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']
>>> 
5 голосов
/ 30 сентября 2011

Я бы использовал split и splitlines методы строк:

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

Если бы вы анализировали более сложный формат, я бы предложил использовать модуль csv ,который также может обрабатывать TSV ... Но, похоже, здесь было бы немного излишним.

2 голосов
/ 22 апреля 2015

Ответ Unutbu сжат с использованием понимания списка:

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')]
0 голосов
/ 24 августа 2018

ответ Марвина, но без чтения всего файла дважды

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

Если вы согласны с тем, что это кортежи, а не два списка

вы все равно можете прочитать данные в два списка за один проход, и это будет ответом unubtu

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...