Python将函数赋值给字典值

1 投票
6 回答
3104 浏览
提问于 2025-04-16 08:53

我正在尝试写一个脚本,根据字典里的值来打开文件。对于每一个键值对,它会根据值的名字打开一个文件,并把这个文件的名字赋给那个值(我觉得这里可能出错了)。到目前为止,它能为我打开文件,并且名字也对,所以这一点是没问题的。不过,我觉得我给open(file)函数赋的名字是错的,因为我后面的代码不再能打开这些文件了,而且我也无法关闭它们。

我的脚本示例:

filelist=[]
codeconv={"agt":"r1p1d", "aga":"r2p1d"}
for value in codeconv.values():
    value=open("c:\Biochemistry\Pythonscripts\Splittest\split"+value+".txt", 'w')
    filelist.append(value)

"Here I do something with the files"

for f in filelist:
    f.close()

所以问题是,我该如何把open(file)函数赋给正确的名字?(比如这里的r1p1d和r2p1d)我又该如何在后面再次调用这些名字呢?

现在我遇到的错误是:
AttributeError: 'str'对象没有'close'这个属性
出现在f.close()这一行。

编辑:现在我用以下代码实现了我想要的功能:(我现在也加上了“这里我做一些事情”的部分,仅为清晰起见)

result=open("C:\\Biochemistry\\Pythonscripts\\Illuminaresults.txt", "r")
filelist=[]

codeconv={"agt":"r1p1d", "aga":"r2p1d"}        
opened_files={}
for key, value in codeconv.items():
    filename="c:\Biochemistry\Pythonscripts\Splittest\split"+value+".txt"
    file=open(filename, 'w')
    opened_files.update({key: file})

for line in result:
    if line[0]==">":
        lastline=line
    if line[0:3] in codeconv and len(line)==64:
        f=opened_files[line[0:3]]
        f.write(lastline+line)
    else: continue 

for f in opened_files.values():
    f.close()

result.close()

不过现在我在尝试写脚本的下一部分时又遇到了另一个问题,但那可能是另一个问题,因为它给了我一个与这一部分无关的Windowserror。谢谢大家的帮助!

6 个回答

0

这些文件已经打开了——你的 filelist 对象里面包含了可以遍历的打开文件对象(比如,你可以用 for line_of_text in filelist[0]: 来逐行读取文件内容),或者调用其他的功能(可以用 dir(file) 查看其他可用的功能)。

你可以通过赋值一个 lambda 函数来延迟打开文件,稍后再调用,比如:

for value in codeconv.values():
    value2 = lambda: open(complete_filename)
    filelist.append(value2)

my_file_object = filelist[0]()

你也可以选择把这些存储在一个字典里:

for value in codeconv.itervalues():
    filedict[value] = lambda: open(complete_filename)

my_file_object = filedict["r1p1d"]()

或者如果你 真的 想创建新的变量(我强烈建议 不要 这样做,但既然你问了):

for value in codeconv.itervalues():
    globals()[value] = open(complete_filename)
    # or
    #globals()[value] = lambda: open(complete_filename)
    # if you prefer

最后,你可以像之前一样关闭文件(如果你用字典的话,就用 filedict.itervalues() 来替代 filelist)。


(显然,你需要在上面的例子中把 complete_filename 替换成你实际计算出的文件名。我不应该需要说这个,但我之前因为遗漏这些细节而吃过亏。)

0

也许你想把元组添加到 filelist 中,这样文件名就和文件对象关联起来了。

codeconv={"agt":"r1p1d", "aga":"r2p1d"}
for value in codeconv.values():
    f=open("c:\Biochemistry\Pythonscripts\Splittest\split"+value+".txt", 'w')
    filelist.append((value, f))

"Here I do something with the files"

for name, f in filelist:
    f.close()
0

如果我理解得没错的话,你是想从字典里动态创建一些变量,然后把它们分配给打开的文件,对吧??!!

我建议你可以用另一个字典来实现,像这样:

codeconv={"agt":"r1p1d", "aga":"r2p1d"}
opened_files = {}

for key, value in codeconv.items():
    file_name = "c:\Biochemistry\Pythonscripts\Splittest\split%s.txt" % value
    file=open(file_name, 'w')
    opened_files.update({key: file})

现在你可以像这样从字典中访问你打开的文件:

f = opened_files['agt'] 
f.read()
....

至于你后面的代码,可以这样写:

for f in opened_files.values():
    f.close()

撰写回答