2013-12-11 15 views
0

我有一切工作,但讓它寫入文件的行的最後一步。任何幫助都是極好的。我認爲它是一個功能或控制結構的問題。我如何得到這個程序來寫每一行給定的單詞到一個文件?

def process(word, file_name, new_file_name): 
    '''Check the file for the word and returns lines with the word in it 
    ''' 

    file=open(file_name, 'r') 
    file2=open(new_file_name, 'w') 

    for line in file: 
     if word in line: 
       file2.write(line)  
    else: 
     print("That word is not in this file.") 

    file.close() 
    print('File written') 


def main(): 
    global line 

    word=input('Enter a word: ').strip().lower() 
    file_name=input('Enter a file name: ') 
    new_file_name=input('Enter a new file name: ') 
    process(word, file_name, new_file_name) 



main() 
+0

發生了什麼問題? – flyer

回答

0

忘記關閉file2。關閉它,它應該寫出來。

此外,更好的方式來打開和關閉文件通常要用到的with上下文管理器:

with open(file_path, 'w') as my_f: 
    my_f.write('foo') 

,將打開和關閉自身,關閉with範圍之外。

此外,它更標準編寫一個main這樣:

if __name__ == '__main__': 
    main() 
    # or just the main body here if it's simple enough 

其原因是,你可以導入其他源代碼的文件,並將其導入後它不會執行主。您可以編寫一個模塊,從中導入,或在您的main中有測試代碼,然後直接執行測試。

另外,什麼qwrrty說你的forelse聲明是正確的。它將始終打印。

elseforwhile循環是Python的一個有趣的功能,你不會在許多編程語言中看到好或壞的循環。如果循環執行而不是break語句退出,則它會執行。如果try塊完成而沒有任何異常,則還有一個tryexceptelse執行else

你應該使用else來處理像遍歷容器,搜索元素,以及如果找不到邏輯的情況。如果你找到它,你就完成了,並且你break。在您的示例中,我沒有看到else的好理由。

+0

非常感謝你! – rs19

+0

使用** w + **表示*讀寫*。使用** w **表示*寫入*,如果文件不存在,它將創建,否則將文件截斷爲0。由於代碼不會讀取'file2'中的內容,因此關閉文件是否與問題無關。 – flyer

0

從短暫測試此代碼,它似乎按預期工作,並寫入file2fileword匹配的所有行。

此代碼打印誤導性的消息:

for line in file: 
    if word in line: 
      file2.write(line)  
else: 
    print("That word is not in this file.") 

當迭代器排出的else子句for運行,因此這將始終打印「這個詞是不是在這個文件中。」你想要更多的東西是這樣的:

found = False 
for line in file: 
    if word in line: 
     file2.write(line) 
     found = True 

if not found: 
    print("That word is not in this file.") 

如前所述,這也是一個不錯的主意,以確保您關閉file2當你用它做的,而with open(...) as file2上下文經理是有用的。但是這應該會導致該計劃在這種情況下行爲不當。

相關問題