2011-11-23 63 views
0

我在爲我的python類編寫這個簡短程序時遇到了麻煩,我希望有人能提供一些幫助。Python - 讀寫用戶輸入

我想實現什麼: 1.編寫一個使用while循環接受用戶輸入的程序(如果用戶按Enter鍵,則退出程序)。 2.將輸入保存到文件,然後打印。 3.開始時,程序將顯示文件的當前內容。

實施例:

首次啓動程序。

輸入文本:這是輸入

此輸入。

輸入文本:其他文字

這是輸入。一些更多的文字。

當您啓動程序的第二次

此輸入。一些更多的文字。

輸入文本:

等等,等等

我有什麼至今:

intext = open('user_input.txt','a') 
intext.close() 
string_input = input('Enter text: ') 
while True: 
    open_input = open('user_input.txt','r') 
    if open_input: 
     for i in open_input: 
      print(i) 

    if string_input != "": 
     uinput = open('user_input.txt','a') 
     uinput.write(string_input + '.') 
     uinput.close() 
     rd = open('user_input.txt', 'r') 
     if rd: 
      for line in rd: 
       print(line) 

    if string_input == "": 
     t = open('user_input.txt', 'r') 
     for line in t: 
      print(line) 
     t.close() 
     break 

問題:一旦打開,所有先前存儲的文本不顯示。如果用戶輸入的文本以無限循環打印,並且不提示再次輸入文本。

肯定:輸入被記錄到文本文件。如果沒有輸入文字,退出之前輸入的文字會顯示正確。

就像我說的,這是我的作業。我已經尋找答案,但我似乎將代碼分開,並將其重新組合在一起,以獲得不同的錯誤。所以一些指導將不勝感激。

有一件事我忘了提的是,我使用的Python 3


再次

感謝David幫我覺得更像是一個程序員。結果如下:

intext = open('user_input.txt','r').readline() 
print(intext) 
while True: 
    string_input = input('Enter text: ') 
    if string_input == "": 
     t = open('user_input.txt', 'r').readline() 
     print(t) 
     break 
    if string_input != "": 
     d = open('user_input.txt', 'a') 
     d.write(string_input + '. ') 
     d.close() 
     n = open('user_input.txt', 'r').readline() 
     print(n) 

我試着讓代碼儘可能的小,並且它現在可以工作。

  1. 我是否需要關閉該文件結尾:說出來的這個

    一對夫婦的問題,其他問題?當我試圖關閉apndn時,它給了我錯誤。

  2. 在尋找答案時,我來到了一個對面,this。使用「with」語句是否仍然是最佳做法?

實施例:

with open("x.txt") as f: 
    data = f.read() 
    do something with data 

回答

0

的raw_input使用,而不是輸入端。

你忘記調用輸入while循環

BTW,爲什麼單單在程序退出,而不是在每個循環不寫入數據?

5

說實話,你的程序正如你所顯示的那樣是一團糟。我認爲這不是侮辱,而是因爲你確實清楚地列出了你的程序需要採取的步驟,而且我認爲通過取消你現有的代碼並從頭開始,你會更好地理解。

在您的問題,列出了下列步驟:

  1. 一旦啓動,顯示文件以前的任何內容
  2. 使用while迴路
    1. 接受來自用戶的輸入
    2. 如果用戶按Enter鍵,則退出程序
    3. 將輸入保存爲文件
    4. 打印(:您的意思是隻打印最新的輸入,或者一切都在文件中)

打開你的整體任務進入這樣的具體步驟清單大概是80%編寫計算機程序的工作。剩下要做的就是把它翻譯成代碼。所以我建議你考慮如何分別完成這些步驟。

  • 寫代碼段,以顯示文件
  • 的內容寫代碼段,以從所述用戶讀出的線路輸入的,並將其存儲在變量
  • 寫代碼段,以檢查內容查看它是否爲空,如果是,退出
  • 編寫代碼片段以將變量的內容附加到文件
  • 編寫代碼片段以打印變量(或文件的內容) ,如果這就是你的意思)

這些都可以在一行或兩行完成,因此單獨使用它們應該很容易。一旦你完成了所有的作品,所有你需要做的就是把它們放在一起:

# display the contents of the file 
while True: 
    # read a line of input and store it in a variable 
    # check the contents of the variable to see if it's empty, and if so, exit 
    # append the contents of the variable to the file 
    # print the contents of the variable (or of the file) 

更新:這不是什麼大不了的事,但你有一個不必要的if聲明(第二一個)在您的修改程序中。考慮一下:如果string_input爲空,Python將執行break語句,該語句立即終止循環。因此,如果string_input不爲空,您將只能達到第二個if聲明。這意味着條件string_input != ""在該程序中保證爲真,並且不需要檢查它。

我是否需要在最後關閉文件?當我試圖關閉apndn時,它給了我錯誤。

是的。看看你d使用的模式:

# open the file 
d = open('user_input.txt', 'a') 
# write to it (or read from it) 
d.write(string_input + '. ') 
# close it 
d.close() 

你應該做同樣的事情,每次打開文件時,即以intextt,並n:打開它,從它讀,然後立即將其關閉。 *

我猜你遇到錯誤的原因是,你試圖把.close()語句在程序結束時,if聲明以外,甚至外面的while循環。這會給你一個NameError,因爲變量nt沒有在程序中的那些點上定義。它們在其定義的塊的末尾「過期」。有關詳細信息,請閱讀scoping。 (維基百科的文章可能不是最好的介紹,但你可以搜索棧溢出和/或網絡上更多的資源。)

雖然尋找答案我來​​了一個跨越,this。使用「with」語句是否仍然是最佳做法?

是的,with語句對Python來說是比較新的,並且是推薦的方式來執行這種「快速」文件I/O操作。基本上with塊在最後關心文件。例如,上述代碼段中涉及d相當於

# open the file 
with open('user_input.txt', 'a') as d: 
    # write to it (or read from it) 
    d.write(string_input + '. ') 
# Python "automatically" closes it for you 

*的文件訪問這種「開放式讀/寫關閉」模式通常一個好主意。我已經告訴你在你的程序中使用它,因爲學習如何將程序拆分成小步驟並將每個步驟分別轉換爲代碼非常重要。但是當你編寫一個程序,它將文件重複寫入文件或從文件中讀取文件時,有時候最好在開始時打開一次文件並保持打開狀態,而不是打開和關閉文件每次。如果您好奇,您可以研究的一件事是如何修改程序以減少打開和關閉文件的次數。

+0

感謝您的誠實。我會採取更有組織的方法回退一步。 – glw