【发布时间】:2012-06-19 00:54:57
【问题描述】:
我正在尝试在 Python 中解析一个制表符分隔的文件,其中一个数字将 k 个制表符与行的开头分开,应该放置到第 k 个数组中。
除了逐行读取并执行简单解决方案会执行的所有明显处理之外,是否有内置函数或更好的方法来执行此操作?
【问题讨论】:
-
有时很容易忘记,但习惯上接受您问题的答案..
-
@Bob 不要让我们悬而未决。
我正在尝试在 Python 中解析一个制表符分隔的文件,其中一个数字将 k 个制表符与行的开头分开,应该放置到第 k 个数组中。
除了逐行读取并执行简单解决方案会执行的所有明显处理之外,是否有内置函数或更好的方法来执行此操作?
【问题讨论】:
您可以使用the csv module 轻松解析制表符分隔值文件。
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")]):
...
【讨论】:
file 问题最少,尤其是。因为它甚至在 3 中都不存在。当你从我冰冷的死手上撬开它时,你们都可以拥有“for file in files:`!;^)
file。好点,但是。已编辑。
我认为当前的任何答案都不能真正做到你所说的你想要的。 (更正:我现在看到@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 个数组中。
【讨论】:
像这样:
>>> 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 模块...
【讨论】:
[x.split('\t') for f.split('\n')] 毫无意义。没有x 并且文件对象没有split() 方法。
您可以通过 python pandas pd.read_csv ('file_name.tsv', sep='\t') 轻松做到这一点
[注意:需要用这个命令安装pandaspip install pandas]
【讨论】: