我有一个以制表符分隔的文本文件,如下所示:
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()
但是我的索引超出范围错误。
答案 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:
...