一个py脚本运行时报错,python3 test.py data1.csv data2.tab data3.txt output.txt,如何解决?

一个py脚本运行时报错,
python3 test.py data1.csv data2.tab data3.txt output.txt

nr[line[2]] = [line[6]]
IndexError: list index out of range

test.py如下:

import sys
 
nr_cog = sys.argv[1]
cog_tab = sys.argv[2]
blast = sys.argv[3]
output = sys.argv[4]
 
#读取 NR 和 COG 映射关系
nr = {}
 
nr_cog = open(nr_cog, 'r')
for line in nr_cog:
    line = line.split(',')
    if line[2] not in nr:
        nr[line[2]] = [line[6]]
    elif line[6] not in nr[line[2]]:
        nr[line[2]].append(line[6])
 
nr_cog.close()
 
#读取 COG 功能和分类描述
cog = {}
 
cog_tab = open(cog_tab, 'r')
for line in cog_tab:
    line = line.split('\t')
    cog[line[0]] = '\t'.join(line[0:3])
 
cog_tab.close()
 
#读取 blast 比对结果,根据 NR id,将 COG id、描述、分类等信息匹配在后方
output = open(output, 'w')
blast = open(blast, 'r')
print(f'{blast.readline().strip()}\tCOG_name\tCOG_class\tCOG_description', file = output)
 
for line in blast:
    line = line.strip()
    id = line.split('\t')[5]
    if id in nr:
        for id2 in nr[id]:
            print(f'{line}\t{cog[id2]}', file = output)
 
blast.close()
output.close()

请问如何解决?谢谢!

13行后面打印下line的值,看下元素个数,应该是不到7个吧,或者说不是每行都有7个。

for line in nr_cog:
    line = line.split(',')
    print(line)
    if line[2] not in nr:
        nr[line[2]] = [line[6]]
    elif line[6] not in nr[line[2]]:
        nr[line[2]].append(line[6])


【以下回答由 GPT 生成】

解决方案

根据提供的错误信息和代码内容,问题发生在以下代码段:

for line in nr_cog:
    line = line.split(',')
    if line[2] not in nr:
        nr[line[2]] = [line[6]]
    elif line[6] not in nr[line[2]]:
        nr[line[2]].append(line[6])

根据报错信息 IndexError: list index out of range,说明 line 的长度不够,找不到对应的索引。这样的错误通常发生在 line 的长度小于访问的索引。在这段代码中,line 是根据逗号 , 分隔的数据行。

因此,我们需要检查输入的数据文件 data1.csv,确认其中的数据行的格式是否正确,且每一行的字段数是否符合预期。同时,我们也可以添加一些错误处理代码来避免这类错误。

以下是修改后的代码:

import sys

def read_nr_cog(nr_cog_file):
    nr = {}
    try:
        with open(nr_cog_file, 'r') as file:
            for line in file:
                line = line.strip().split(',')
                if len(line) > 2:  # 检查字段数是否大于2
                    if line[2] not in nr:
                        nr[line[2]] = [line[6]]
                    elif line[6] not in nr[line[2]]:
                        nr[line[2]].append(line[6])
                else:
                    print("数据行格式错误:", line)
    except FileNotFoundError:
        print(f"文件 {nr_cog_file} 未找到")
    return nr

def read_cog_tab(cog_tab_file):
    cog = {}
    try:
        with open(cog_tab_file, 'r') as file:
            for line in file:
                line = line.strip().split('\t')
                if len(line) >= 3:  # 检查字段数是否大于等于3
                    cog[line[0]] = '\t'.join(line[0:3])
                else:
                    print("数据行格式错误:", line)
    except FileNotFoundError:
        print(f"文件 {cog_tab_file} 未找到")
    return cog

if len(sys.argv) < 5:  # 添加参数检查
    print("参数不足")
    print("使用方法: python3 test.py data1.csv data2.tab data3.txt output.txt")
    sys.exit(1)

nr_cog_file = sys.argv[1]
cog_tab_file = sys.argv[2]
blast_file = sys.argv[3]
output_file = sys.argv[4]

nr = read_nr_cog(nr_cog_file)
cog = read_cog_tab(cog_tab_file)

output = open(output_file, 'w')
try:
    with open(blast_file, 'r') as blast:
        print(f'{blast.readline().strip()}\tCOG_name\tCOG_class\tCOG_description', file=output)
        for line in blast:
            line = line.strip().split('\t')
            id = line[0]
            if id in nr:
                cog_info = '\t'.join([cog[c] for c in nr[id]])
                print(f'{line}\t{cog_info}', file=output)
except FileNotFoundError:
    print(f"文件 {blast_file} 未找到")

output.close()

这样,我们添加了参数检查,以及对数据文件读取的错误处理代码。代码会在检测到格式错误或文件未找到时给出提示。同时,我们也将读取文件的代码封装为函数,提高了代码的可读性和可维护性。

希望这样对您有所帮助!如果您还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^