Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python错误-将多个文件中的数据写入一个索引错误_Python - Fatal编程技术网

Python错误-将多个文件中的数据写入一个索引错误

Python错误-将多个文件中的数据写入一个索引错误,python,Python,我正在尝试读取多个文件,并在比较其范围的基础上提取特定列,并尝试将它们附加到新文件的单个列中(用逗号分隔) 例如,从10个文件中删除所有第5列和第8列,并将它们附加到单个文件中,以逗号分隔。(所有文件的第4列用逗号分隔,所有文件的第7列用逗号分隔,第4列和第7列用制表符分隔) 我得到一个索引错误,表示索引超出了下一行的范围 x2 = field_split[3] + "," + x x3 = field_split[4] + "," + x1 我不明白这里的错误。任何人都可以向我解释一下(我知

我正在尝试读取多个文件,并在比较其范围的基础上提取特定列,并尝试将它们附加到新文件的单个列中(用逗号分隔)

例如,从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()

我认为您的
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()方法,但在我的例子中它不起作用。