Python:索引以制表符分隔的文件

时间:2010-07-01 17:21:51

标签: python indexing

我有一个以制表符分隔的文本文件,如下所示:

  

1_0 NP_045689 100.00 279 0 0 18 296 18 296 3e-156 539

     

1_0 NP_045688 54.83 259 108 6 45 296 17 273 2e-61 224

我需要解析特定的列,例如第2列。

我尝试过以下代码:

z = open('output.blast', 'r')
for line in z.readlines():
    for col in line:
        print col[1]
z.close()

但是我的索引超出范围错误。

5 个答案:

答案 0 :(得分:6)

z = open('output.blast', 'r')
for line in z.readlines():
    cols = line.split('\t'):
        print cols[1]
z.close()

首先需要split()制表符上的行。

或者,您可以在制表符分隔符模式下使用Python的csv模块。

答案 1 :(得分:5)

结帐the csv module。如果您计划使用制表符分隔文件执行更多操作,那么这对您有很大帮助。一个好处是你可以为各个列分配名称。

答案 2 :(得分:2)

import csv,StringIO
text="""1_0 NP_045689   100.00  279 0   0   18  296 18  296 3e-156  539
1_0 NP_045688   54.83   259 108 6   45  296 17  273 2e-61   224"""

f = csv.reader(StringIO.StringIO(text), delimiter='\t')
for row in f:
    print row[1]

有两点需要注意:

reader方法的delimiter参数告诉csv模块如何拆分文本行。检查reader函数的其他参数以扩展功能(即:quotechar)

我使用StringIO将文本示例包装为文件对象,如果使用文件引用,则不需要它。

前:

f=csv.reader(open('./test.csv'),delimiter='\t')

答案 3 :(得分:2)

这已经得到了解答,但我认为我会在这种情况下共享使用namedtuples,因为它允许愉快的object.attribute类型属性访问。

from collections import namedtuple
import csv
rec = namedtuple('rec', 'col1, col2, col3, col4, col5')
for r in map(rec._make, csv.reader(open("myfile.tab", "rb"), delimiter='\t')):
    print r.col2, r.col5

有关详细信息,请参阅Python collections documentation

答案 4 :(得分:0)

这就是您的代码出错的原因:

for col in line:

将迭代该行中的每个CHARACTER。

    print col[1]

字符是长度为1的字符串,因此col [1]总是会使索引超出范围错误。

正如其他人所说,您需要拆分TAB字符'\t'上的行,或使用csv模块,它将正确处理可能包含制表符或换行符的引用字段。

我还建议避免使用readlines - 它会将整个文件读入内存,如果它非常大,可能会导致问题。您可以一次一行地遍历打开的文件:

z = open('output.blast', 'r')
for line in z:
    ...