繁体   English   中英

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

[英]Python: Indexing a file that is tab delimited

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

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

但我得到索引超出范围错误。

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

您需要先在制表符上split()行。

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

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

这已经得到了回答,但我认为我会在这种情况下共享使用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 集合文档

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')

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

for col in line:

将遍历行中的每个CHARACTER。

    print col[1]

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM