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

Bob*_*Bob 29 python io tabs

我试图在Python中解析一个以制表符分隔的文件,其中一个数字与行的开头相距k个标签,应该放在第k个数组中.

是否有内置函数来执行此操作,或者更好的方式,除了逐行阅读并执行一个天真的解决方案将执行的所有明显处理?

Gar*_*tty 54

您可以使用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.
        ... 
Run Code Online (Sandbox Code Playgroud)

line每次迭代的当前行的值列表在哪里.

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

with open("tab-separated-values") as tsv:
    for column in zip(*[line for line in csv.reader(tsv, dialect="excel-tab")]):
        ...
Run Code Online (Sandbox Code Playgroud)

  • @Bob为什么不试试看?(但是,它会). (5认同)
  • @Lattyware:你使用"file"作为变量名称是禁止的......;) (3认同)
  • @martineau:在所有要重新绑定的默认内置名称中,“file”是问题最少的,尤其是。因为它在 3 中根本不存在。当你从我冰冷、死气沉沉的手中撬开它时,你们都可以拥有“for file in files:`”!;^) (2认同)

mar*_*eau 11

我认为目前的答案中没有任何一个真正符合您的要求.(更正:我现在看到@Gareth Latty/@Lattyware已将我的答案合并到他自己的"编辑"附近.)

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

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

1   2   3   4   5
6   7   8   9   10
11  12  13  14  15
16  17  18  19  20
Run Code Online (Sandbox Code Playgroud)

这个:

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

会产生以下结果:

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

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


daw*_*awg 7

像这样:

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

对于一个文件:

# 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
Run Code Online (Sandbox Code Playgroud)

如果您希望输入转调:

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

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