2010-12-22 61 views
0

我正在尝试编写一个基于字典值打开文件的脚本。对于每个键/值,它会根据该值的名称打开一个文件,并将该文件分配给值的名称(我认为这里出错了)。到目前为止,它以正确的名称为我打开这些文件,因此可行。然而,我认为我分配open(file)函数的名称是错误的,因为我的函数的其余部分不再打开这些文件,并且我无法关闭它们。我的脚本 例子:Python赋值函数字典值

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() 

所以问题是,我该如何分配打开(文件)功能,以正确的名称? (例如,这里是r1p1d和r2p1d)我以后如何再次调用它们?

我现在得到的错误是: AttributeError:'str'object在f.close()行上没有属性'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

`filelist`声明在哪里? – 2010-12-22 10:04:38

+0

filelist在此之前声明,我的脚本中只有filelist = [] – Max 2010-12-22 10:06:39

+0

不要使用`file`作为变量。它会隐藏内置类型。 – 2010-12-22 18:07:13

回答

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() 
0

为了清晰起见以及可能在那里引入的未来错误,我谨慎反对在第一个循环中重用“值”。

但是,您发布的代码实际上是有效的,所以显然还有其他事情我们无法在这里诊断。在您尝试关闭文件句柄之前,您需要做的是检查filelist的内容。这可能会指出你的答案。

+0

这是我确切的问题,但我可能没有正确地措辞。我不想重复使用“值”,我希望将实际值(r1p1d,r2p1d等)用作打开函数分配的名称,而不是“值”。 – Max 2010-12-22 10:18:16

+0

此文件列表的内容为:[<打开文件'c:\ Biochemistry \ Pythonscripts \ Splittest \ splitr1p1d.txt',模式'w'在0x0000000002A74540>,<打开文件'c:\ Biochemistry \ Pythonscripts \ Splittest \ splitr2p1d .txt',mode'w'at 0x0000000002A746F0>] – Max 2010-12-22 10:29:05

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() 

(我还加了一点故障代码)

0

你不分配函数,你正在分配返回值。在这种情况下,显而易见的是一个字符串,而不是一个文件对象,这有点令人惊讶。你在“在这里做什么”部分的文件列表中做了什么?

好吧,听起来你想要一个关键字/文件对象之间的字典(有示例用法)。

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() 
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

这些文件已经打开 - 您的filelist o bject包含可以遍历的打开文件对象(例如,使用for line_of_text in filelist[0]:)或调用其他功能(其他成员请参见dir(file))。

您可以推迟通过分配拉姆达打开文件并稍后调用它,例如:

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,我不应该需要这么说,但我一直留出这种细节刺痛过于频繁)