我正在尝试读取多个文件并根据比较其范围并尝试将它们附加到新文件中的单个列(以逗号分隔)中提取特定列。
比如说,10个文件中的所有第5和第8列,并将它们附加在用逗号分隔的单个文件中。 (所有文件的第4列用逗号分隔,所有文件的第7列用逗号分隔,第4和第7列用制表符分隔)。
我收到索引错误,指出索引超出了以下行的范围
x2 = field_split[3] + "," + x
x3 = field_split[4] + "," + x1
我不明白这里的错误。任何人都可以向我解释它(我知道索引错误是什么,但为什么在这种情况下我收到一个)。
我在这里附上了代码。
import bz2
import sys
import linecache
in_F=open(sys.argv[1], 'r')
Temp=inputFile.read().splitlines()
Out_F=open("outFile.tsv", "w+")
i=0
n=0
for files in Temp:
if files.endswith("bz2"):
file=bz2.BZ2File(files, 'r')
else:
file=open(files, 'r')
l=0
i=i+1
for line in file:
field=line.split()
if len(field) > 9:
l=l+1
if (field[1] == str(n) and field[2] == str(n+5000)):
x = field[4]
x1 = field[7]
n=n+5000
else:
x = field[4]
x1 = field[7]
n = field[1] + str(5000)
if (i == 1):
Out_F.write(field[0]+"\t"+field[1]+"\t"+field[2]+"\t"+x+"\t"+x1+"\n")
else:
lines=linecache.getline("outFile.tsv", l).rstrip('\n')
field_split = lines.split()
x2 = field_split[3] + "," + x
x3 = field_split[4] + "," + x1
Out_F.write(field_split[0]+"\t"+field_split[1]+"\t"+field_split[2]+"\t"+x2+"\t"+x3+"\n")
Out_F.seek(0,0)
in_F.close()
Out_F.close()
答案 0 :(得分:0)
我认为你的lines=linecache.getline("outFile.tsv", l).rstrip('\n')
行试图在python将任何内容刷新到文件之前读入outFile.tsv
。尝试在Out_F.flush()
之后添加Out_F.write()
。
答案 1 :(得分:0)
来自 linecache.getline 的linechace dcumentation:
此函数永远不会引发异常 - 它将返回错误
我认为您尝试读取不属于该文件的行l
。
来自 linecache 文档:
linecache模块允许用户从任何文件获取任何行,同时尝试使用缓存进行内部优化
线路缓存可能会创建文件的缓存,因此无法读取您编写线路的文件的当前版本。
您可以在getline之前使用 checkcache 来确保您的缓存是最新的。 clearcache 可用于强制阅读文件的最新版本。
我认为(虽然我不确定linecache的确切实现)这里不需要使用linecache,因为linecache优于本机fileIO的主要好处似乎是缓存文件。显然,如果您更改文件,缓存没有任何好处。
我的建议:将所有内容读入字典或列表,只在读取所有输入后创建输出文件(假设输入文件不是很大)