Python将函数赋值给字典值
我正在尝试写一个脚本,根据字典里的值来打开文件。对于每一个键值对,它会根据值的名字打开一个文件,并把这个文件的名字赋给那个值(我觉得这里可能出错了)。到目前为止,它能为我打开文件,并且名字也对,所以这一点是没问题的。不过,我觉得我给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 个回答
这些文件已经打开了——你的 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
替换成你实际计算出的文件名。我不应该需要说这个,但我之前因为遗漏这些细节而吃过亏。)
也许你想把元组添加到 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()
如果我理解得没错的话,你是想从字典里动态创建一些变量,然后把它们分配给打开的文件,对吧??!!
我建议你可以用另一个字典来实现,像这样:
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()