Python错误-将多个文件中的数据写入一个索引错误
我正在尝试读取多个文件,并在比较其范围的基础上提取特定列,并尝试将它们附加到新文件的单个列中(用逗号分隔) 例如,从10个文件中删除所有第5列和第8列,并将它们附加到单个文件中,以逗号分隔。(所有文件的第4列用逗号分隔,所有文件的第7列用逗号分隔,第4列和第7列用制表符分隔) 我得到一个索引错误,表示索引超出了下一行的范围Python错误-将多个文件中的数据写入一个索引错误,python,Python,我正在尝试读取多个文件,并在比较其范围的基础上提取特定列,并尝试将它们附加到新文件的单个列中(用逗号分隔) 例如,从10个文件中删除所有第5列和第8列,并将它们附加到单个文件中,以逗号分隔。(所有文件的第4列用逗号分隔,所有文件的第7列用逗号分隔,第4列和第7列用制表符分隔) 我得到一个索引错误,表示索引超出了下一行的范围 x2 = field_split[3] + "," + x x3 = field_split[4] + "," + x1 我不明白这里的错误。任何人都可以向我解释一下(我知
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()
我认为您的
line=linecache.getline(“outFile.tsv”,l).rstrip('\n')
行试图在python将任何内容刷新到文件之前读取outFile.tsv
。尝试在Out\u F.write()
缓存缓存文件后添加Out\u F.flush()
从linecache.getline的linechace数据计算中:
此函数永远不会引发异常-出现错误时将返回“”
我想你试着读一行不在文件中的l
从linecache文档中:
linecache模块允许用户从任何文件中获取任何行,同时尝试使用缓存进行内部优化
linecache可能会创建文件的缓存,因此不会读取写入行的文件的当前版本
您可以在getline之前使用检查缓存,以确保缓存是最新的clearcache可用于强制读取文件的最新版本
我认为(尽管我不确定linecache的具体实现)使用linecache在这里是不必要的,因为linecache相对于本机fileIO的主要好处似乎是缓存文件。显然,如果更改文件,缓存没有任何好处
我的建议是:将所有内容读入字典或列表,并在读取所有输入后创建输出文件(假设您的输入文件不是很大)您假设
行
至少有5个项目以空格分隔;如果文件中的内容少于这些内容(或者是一个空行),那么您将得到一个例外。您能否大致了解一下您的输出应该是什么?一个常见的问题是,文件中有一个空行。我添加了一个输出格式的示例。谢谢。您确定您的代码生成了所需的输出吗?对我来说,它看起来像是在outfile中附加了与以前从同一文件中读取的行相同的字段[0]、[1]和[2],从而创建了多个具有相同开始和结束的条目……谢谢Joe的建议。我尝试了flush()方法,但在我的例子中它不起作用。