2010-12-22 60 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,我不應該需要這麼說,但我一直留出這種細節刺痛過於頻繁)