Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中解析选项卡分隔的文件_Python_Tabs_Io - Fatal编程技术网

在Python中解析选项卡分隔的文件

在Python中解析选项卡分隔的文件,python,tabs,io,Python,Tabs,Io,我试图在Python中解析一个以制表符分隔的文件,在这个文件中,除了行的开头之外放置了k个制表符的数字,应该放置在第k个数组中 除了逐行读取并执行原始解决方案将执行的所有明显处理之外,是否有内置函数或更好的方法来执行此操作?如下所示: >>> s='1\t2\t3\t4\t5' >>> [x for x in s.split('\t')] ['1', '2', '3', '4', '5'] 对于文件: # create test file: >>

我试图在Python中解析一个以制表符分隔的文件,在这个文件中,除了行的开头之外放置了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模块…

您可以使用它轻松解析选项卡分隔的值文件

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()
builtin:

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

我不认为现在的答案真的符合你的要求。(更正:我现在看到@Gareth Latty/@Lattyware将我的答案作为结尾处的“编辑”并入了他的答案。)

无论如何,我的看法是:

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

12345
6   7   8   9   10
11  12  13  14  15
16  17  18  19  20
那么这个,

打开(“tab separated values.txt”)作为inp:
打印(列表(zip(*(inp中的行的line.strip().split('\t'))))
将产生以下结果:

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

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

在Python中,创建空列表然后附加值是一种反模式。这就是列表理解的作用。@Lattyware:我个人并不觉得第一种形式很难阅读,但你是对的——嵌套列表理解可能更像python。已编辑。@drewk:
[x.split('\t')用于f.split('\n')]
毫无意义。没有
x
,文件对象也没有
split()
方法。@martineau:为什么要使用csv模块的完美例子,不是吗?打字错误修正。我测试了it@drewk:嗯,不太可能……很可能是后一件事每当缺少一个元素时,就会有两个连续的选项卡。那行吗?@Bob你为什么不试试看呢?(但会的)。@Lattyware:您使用“file”作为变量名是不允许的…)@martineau:在所有要重新绑定的默认内置名称中,
文件
是问题最少的,尤其是因为它甚至不存在于3中。你们都可以用“文件中的文件:`当你们从我冰冷、死气沉沉的手上撬开它时!;^)@martineau我是一个Python 3.x人,所以我有时会忘记这是在2.x中粉碎
文件
。然而,这很好。编辑。有时很容易忘记,但习惯上接受你们问题的答案。@Bob不要让我们绞死。