在 Python 中解析制表符分隔的文件

parsing a tab-separated file in Python

提问人:zzzbbx 提问时间:6/16/2012 更新时间:8/1/2021 访问量:129461

问:

我正在尝试解析 Python 中的制表符分隔文件,其中将 k 个制表符放在行开头之外的数字应该放入第 k 个数组中。

除了逐行读取并执行朴素的解决方案将执行的所有明显处理之外,是否有内置函数或更好的方法可以做到这一点?

制表符 io

评论

4赞 Scott Prive 6/21/2017
有时很容易忘记,但习惯上接受问题的答案。

答:

7赞 dawg 6/16/2012 #1

喜欢这个:

>>> s='1\t2\t3\t4\t5'
>>> [x for x in s.split('\t')]
['1', '2', '3', '4', '5']

对于文件:

# create test file:
>>> with open('tabs.txt','w') as o:
...    s='\n'.join(['\t'.join(map(str,range(i,i+10))) for i in [0,10,20,30]])
...    print >>o, s

#read that file:
>>> with open('tabs.txt','r') as f:
...    LoL=[x.strip().split('\t') for x in f]
... 
>>> LoL
[['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], 
 ['10', '11', '12', '13', '14', '15', '16', '17', '18', '19'], 
 ['20', '21', '22', '23', '24', '25', '26', '27', '28', '29'], 
 ['30', '31', '32', '33', '34', '35', '36', '37', '38', '39']]
>>> LoL[2][3]
23

如果要转置输入:

>>> with open('tabs.txt','r') as f:
...    LoT=zip(*(line.strip().split('\t') for line in f))
... 
>>> LoT[2][3]
'32'

或者(更好的是)在默认发行版中使用 csv 模块......

71赞 Gareth Latty 6/16/2012 #2

您可以使用 csv 模块轻松解析制表符分隔的值文件。

import csv

with open("tab-separated-values") as tsv:
    for line in csv.reader(tsv, dialect="excel-tab"): #You can also use delimiter="\t" rather than giving a dialect.
        ... 

其中 是每次迭代的当前行上的值列表。line

编辑:如下所述,如果您想按列而不是按行阅读,那么最好的办法是使用内置的:zip()

with open("tab-separated-values") as tsv:
    for column in zip(*[line for line in csv.reader(tsv, dialect="excel-tab")]):
        ...
15赞 martineau 6/16/2012 #3

我不认为目前的任何答案都真正做到了你所说的你想要的。(更正:我现在看到 @Gareth Latty / @Lattyware 已将我的答案作为接近结尾的“编辑”合并到他自己的答案中。

无论如何,这是我的看法:

假设这些是输入文件中的制表符分隔值:

1   2   3   4   5
6   7   8   9   10
11  12  13  14  15
16  17  18  19  20

那么这个:

with open("tab-separated-values.txt") as inp:
    print( list(zip(*(line.strip().split('\t') for line in inp))) )

将产生以下内容:

[('1', '6', '11', '16'), 
 ('2', '7', '12', '17'), 
 ('3', '8', '13', '18'), 
 ('4', '9', '14', '19'), 
 ('5', '10', '15', '20')]

如您所见,它将每行的第 k 个元素放入第 k 个数组中。

1赞 Alauddin Sabari 8/1/2021 #4

你可以通过python pandas pd.read_csv('file_name.tsv', sep='\t')


[注意:需要使用此命令 pip install pandas 安装 pandas]