我正在尝试编写一个基于字典值打开文件的脚本。对于每个键/值,它根据该值的名称打开一个文件,并将该文件分配给值的名称(我认为这里出错了)。到目前为止,它为我打开文件,使用正确的名称,这样才有效。但是,我认为我分配open(文件)函数的名称是错误的,因为我的函数的其余部分不再打开文件,我无法关闭它们。 我的脚本示例:
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'object没有属性'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。谢谢大家的帮助!
答案 0 :(得分:0)
我要警告不要在第一个循环中重复使用“value”,以便明确和将来可能引入的错误。
但是,你发布的代码实际上是有效的,所以很明显还有其他事情我们无法在这里诊断出来。您需要做的是在尝试关闭其中的文件句柄之前检查filelist
的内容。这可能会指向你的答案。
答案 1 :(得分:0)
我在代码中看不到问题,也许它不在粘贴的部分中? (在filelist
中,或在剪切的位)。
但无论如何,我会重写它以避免使用相同的变量value
,用于两个不同的事情:
filelist = []
codeconv={"agt":"r1p1d", "aga":"r2p1d"}
for file_id in codeconv.values():
f = open("c:\Biochemistry\Pythonscripts\Splittest\split"+file_id+".txt", 'w')
filelist.append(f)
"Here I do something with the files"
for f in filelist:
if isinstance(f, str):
print "WARNING: Expected file handle, got string:", f
else:
f.close()
(我还添加了一些故障排除代码)
答案 2 :(得分:0)
您没有分配该功能,而是指定返回值。在这种情况下,这似乎是一个字符串而不是文件对象,这有点令人惊讶。你在“我在做什么”部分的文件列表中做了什么吗?
[编辑] 好吧,听起来你想在key / fileobject之间使用dict(使用示例)。
codeconv={"agt":"r1p1d", "aga":"r2p1d"}
filedict = {key, open("c:\Biochemistry\Pythonscripts\Splittest\split"+value+".txt", 'w')
for key, value in codeconv.iteritems()}
#Here I do something with the files
filedict["agt"].write("foo")
filedict["aga"].write("bar")
for f in filedict.values():
f.close()
答案 3 :(得分: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()
答案 4 :(得分: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()
答案 5 :(得分: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
,但是你计算实际的文件名。我不应该这样说,但我经常被遗漏这些细节。)