将制表符分隔文件解析为单独的列表或字符串

use*_*297 15 python tabs parsing delimited

我正在尝试使用带有两个列的制表符分隔文件,名称和年龄,其中读取如下:

'名称\踏歌\nMark\T32 \nMatt\T29 \nJohn\T67 \nJason\T45 \nMatt\T12 \nFrank\T11 \nFrank\T34 \nFrank\T65 \nFrank\T78 \n'

只需创建两个列表,一个名称(称为名称,不带标题),另一个列出年龄(称为年龄,但列表中没有年龄).

unu*_*tbu 19

使用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')
Run Code Online (Sandbox Code Playgroud)


Sin*_*ion 10

制表符分隔的数据位于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)
Run Code Online (Sandbox Code Playgroud)

假装infile只是一个常规file......

>>> import csv
>>> r = csv.DictReader(infile, 
...                    dialect=csv.Sniffer().sniff(infile.read(1000)))
>>> infile.seek(0)
Run Code Online (Sandbox Code Playgroud)

你甚至不必告诉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']
>>> 
Run Code Online (Sandbox Code Playgroud)


Dav*_*ver 5

我将使用字符串的splitsplitlines方法:

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

如果您解析的是更复杂的格式,我建议您使用csv模块,该模块也可以处理tsv…。但是似乎在这里有点过头了。