2010-06-24 79 views
0

我有一個簡單的函數,排序詞典:寫排序結果文件

data = inputfile.readlines() 
lineData = sorted(data, key=len, reverse=True)[:3] 

打印輸出:

print sorted(data, key=len, reverse=True)[:3] 

產生預期的結果,但是寫入文件:

outputfile.writelines sorted(data, key=len, reverse=True)[:3] 

什麼都不產生。如何將輸出寫入文本文件(outputfile)? 完整的代碼如下:

import sys, string 
inputfilenames, outputfilename = sys.argv[1:-1], sys.argv[-1] 


def do_something_with_input(inputfile): 
    data = inputfile.readlines() 
    print sorted(data, key=len, reverse=True)[:3] 
    print sys.path[0]+"/"+ outputfilename 


def write_results(outputfile): 
    data = inputfile.readlines() 
    outputfile.writelines(sorted(data, key=len, reverse=True)[:3]) 

for inputfilename in inputfilenames: 
    inputfile = open(inputfilename, "r") 
    do_something_with_input(inputfile) 
    outputfile = open(outputfilename, "w") 
    write_results(outputfile) 

回答

1

writelines是一種方法,你需要調用它:

outputfile.writelines(sorted(data, key=len, reverse=True)[:3]) 

ETA
功能open提供可隨被重複一次的文件句柄。您在do_something_with_input函數中執行該操作,在迭代inputfile之後,迭代器耗盡。這意味着任何進一步的迭代,例如在您的write_results函數中完成將產生一個空序列。這就是爲什麼沒有東西寫入輸出文件。基本上,它相當於:

>>> a = (i for i in range(2)) 
>>> list(a) 
[0, 1] 
>>> list(a) 
[] 

你需要做的是存儲sorted(...)的輸出,然後將其寫入文件,而不是嘗試重新生成它。

+0

謝謝。修改write_results函數正是我需要做的。 – kjarsenal 2010-06-24 15:04:52

0

你寫:

outputfile.writelines sorted(data, key=len, reverse=True)[:3] 

產生什麼。

它實際上應該產生由於缺少括號的語法錯誤異常 - 如果沒有,我想你必須使用一些(可能)「智能」 IDE喜歡的IPython這使括號中的上你的名字 - 是這種情況嗎?

您正在打印三條最短的行,它們可能都是空的 - 應該在您的輸出文件中放置三條空行(當然,不顯示任何標準輸出 - 是您的意思是「生成沒有」?)。也許你沒有正確地調用outputfile.close(),所以當你檢查文件時,他們仍然被緩衝,而不是寫入磁盤。

正如你所看到的,圍繞着你非常模棱兩可的「不產生任何東西」斷言的可能性很多。你能澄清一下究竟是你正在使用什麼環境,以及你是如何檢查你的代碼「生成」或沒有?否則,很難幫助你。

編輯:在OP澄清,並展示了他的代碼 - 而現在的問題是清楚的:他完全消耗inputfile第一次,從來沒有「倒帶」,所以該文件將立即結束(沒有臺詞留在它)在第二個readlines呼叫。如果您確實需要獨立讀取文件兩次(而不是隻讀一次並傳遞數據,這是正常的),則每次讀取文件時都需要撥打inputfile.seek(0)以「倒帶文件」隨時準備再次閱讀。

+0

對不起。我應該說的是生成一個空的文本文件。該條目已被編輯以提供完整的代碼。我正在使用IDLE。 – kjarsenal 2010-06-24 14:54:32

+0

另外,它應該叫三條最長的線。打印輸出如此。 – kjarsenal 2010-06-24 14:55:55

+0

@kjarsenal,現在你已經顯示你的代碼了,問題已經變得清晰了,請參閱我的答案的編輯。 – 2010-06-24 15:07:34