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

15 投票
5 回答
64350 浏览
提问于 2025-04-17 03:24

我想处理一个用制表符分隔的文件,这个文件有两列,分别是名字和年龄,内容看起来是这样的:

'名字\t年龄\n马克\t32\n马特\t29\n约翰\t67\n杰森\t45\n马特\t12\n弗兰克\t11\n弗兰克\t34\n弗兰克\t65\n弗兰克\t78\n'

我想简单地创建两个列表,一个是名字的列表(叫做 names,没有标题),另一个是年龄的列表(叫做 ages,但列表里不包含年龄)。

5 个回答

5

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

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

如果你要解析一个更复杂的格式,我建议使用 csv模块,它也可以处理制表符分隔的文件……不过在这里用这个可能有点多余。

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)

假设 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']
>>> 
20

使用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')

撰写回答