Python 从函数返回的字典为空

Python 从函数返回的字典为空,python,function,dictionary,Python,Function,Dictionary,我正在编写一个函数,它接收一个可能有多个序列的fasta文件,并返回一个字典,其中登录号作为键,全长头作为值。当我运行函数时,我会得到一个空字典,但当我在函数外运行相同的代码时,我会得到所需的字典。我假设这意味着我的字典在函数中的某个地方被什么都没有覆盖,因为如果它与我的正则表达式模式有关,代码在函数之外也不会工作,但我似乎找不到字典可能被重置的位置。我试着搜索一个解决方案,但我在同一个问题中发现的唯一问题都有明显的问题(没有返回值或其中一个输入变量被覆盖) 这是我的函数代码和输出(假设已导入r

我正在编写一个函数,它接收一个可能有多个序列的fasta文件,并返回一个字典,其中登录号作为键,全长头作为值。当我运行函数时,我会得到一个空字典,但当我在函数外运行相同的代码时,我会得到所需的字典。我假设这意味着我的字典在函数中的某个地方被什么都没有覆盖,因为如果它与我的正则表达式模式有关,代码在函数之外也不会工作,但我似乎找不到字典可能被重置的位置。我试着搜索一个解决方案,但我在同一个问题中发现的唯一问题都有明显的问题(没有返回值或其中一个输入变量被覆盖)

这是我的函数代码和输出(假设已导入re):

输出

{}
{'AF12345': '>AF12345 test sequence 1'}
以下是我在函数外部运行时的输入/输出:

import re
file = open("seq1.txt", "r")
head_dict = {}

for line in file:
    if line.startswith(">"):
        key = re.search(">([^\s]+)", line).group(1)
        value = line.rstrip()
        head_dict[key] = value


print(head_dict)
输出

{}
{'AF12345': '>AF12345 test sequence 1'}
其中seq1.txt是以下没有引号的文件,并且txt文件有一个实际返回值而不是“\n”,我只是不确定如何正确格式化它

“>AF12345测试序列1\nCGATATTCCCATGCGGTTATTTATGTCAAACTGTGACGTTCGCTTGA”

上面是我的代码现在所在的位置。在此之前,我有一个函数,它创建了两个字典,并根据输入参数返回了一个特定的字典。一本字典是登录号和序列,另一本是我正在创建的字典。我把第一本字典拿回来没有任何问题。因此,我决定拆分函数,并为每个字典设置一个函数,尽管它看起来很重复。我还尝试将
head\u dict[key]=value
移动到条件语句之外,并遇到了同样的问题。我尝试将变量名从
key
更改为
acc
,从
value
更改为
header
,但仍然得到了相同的结果(在我的示例中,您可以看到函数外部的变量最初是
key
value
)。我只是尝试将空字典设置为参数,以便在函数外部对其进行初始化,但仍然返回了一个空字典。我不知道现在该试什么。提前谢谢

注意:我相信这可以通过另一个库更有效地解决,但这是针对一个类的,讲师非常反对使用其他库。我们必须先学会自己做这件事

编辑:现在我很沮丧。我重写了代码,添加了创建输入文件的功能,供人们运行我的代码并帮助我使用,但它可以工作。我很抱歉浪费了大家的时间。这是我重写的。如果你注意到这和我上面发布的内容有差异,请让我知道

import re
def getheader(file):
    '''
    compiles headers from a fasta file into a dictionary

    Parameters
    ----------
    file : file
        file that contains the sequences with headers and has not been read

    Returns
    -------
    dictionary with acc no as key and full header as value

    '''
    head_dict = {}
    
    for line in file:
        if line.startswith(">"):
            acc = re.search(">([^\s]+)", line).group(1)
            header = line.rstrip()
            head_dict[acc] = header
            
    return head_dict

file = open("bookishbubs_test1.txt", "w")
file.write(">AF12345 test sequence 1\nCGATATTCCCATGCGGTTTATTTATGCAAAACTGTGACGTTCGCTTGA")
file.close()

file = open("bookishbubs_test1.txt", "r")
headers = getheader(file)
print(headers)
file.close()

请将您如何使用该功能添加到您的@第二次世界大战是不是帮你修好了这个缩进地址?现在,您应该能够看到调用函数的代码位,这就是我认为您所要求的。它应该可以工作。除非输入文件是错误的。只需传递一个硬编码的文件行列表,就可以创建一个文件行,这样人们就可以在家里复制它了我想出来了!我意识到我将文件拉入函数的方式肯定有问题,所以这给了我一个新的短语,谷歌。问题是我调用了两次函数。所以当我第二次调用它时,文件已经被读取,指针在文件的末尾。我在函数开头添加了一行重置指针,请将您使用函数的方式添加到您的@第二次世界大战是不是帮你修好了这个缩进地址?现在,您应该能够看到调用函数的代码位,这就是我认为您所要求的。它应该可以工作。除非输入文件是错误的。只需传递一个硬编码的文件行列表,就可以创建一个文件行,这样人们就可以在家里复制它了我想出来了!我意识到我将文件拉入函数的方式肯定有问题,所以这给了我一个新的短语,谷歌。问题是我调用了两次函数。所以当我第二次调用它时,文件已经被读取,指针在文件的末尾。我在函数的开头添加了一行重置指针