Python赋值函数来dict值

时间:2010-12-22 10:01:54

标签: python function dictionary

我正在尝试编写一个基于字典值打开文件的脚本。对于每个键/值,它根据该值的名称打开一个文件,并将该文件分配给值的名称(我认为这里出错了)。到目前为止,它为我打开文件,使用正确的名称,这样才有效。但是,我认为我分配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。谢谢大家的帮助!

6 个答案:

答案 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,但是你计算实际的文件名。我不应该这样说,但我经常被遗漏这些细节。)