[英]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.