2017-01-13 57 views
1

我有我的代碼一些問題:如何將列表的內容保存到文件?

def entry_book(): 
    book = ["autor", "ime", "godina", "ISNB", "zanr", "cena", "broj"] 
    print ("Podaci za knjigu:") 
    book[0] = input ("Autor: ") 
    book[1] = input ("Naslov: ") 
    book[2] = input ("Godina: ") 
    book[3] = input ("ISNB: ") 
    book[4] = input ("Zanr: ") 
    book[5] = input ("Cena: ") 
    book[6] = input ("Kolicina: ") 
    record= "{}|{}|{}|{}|{}|{}|{}".format (book[0], book[1], book[2], book[3], 
              book[4], book[5], book[6]) 

    print (book) 
    print (record) 
    f = open('books.txt','w') 
    f.write (record) 
    f.close() 
    f = open("books.txt") 
    x = f.read() 
    f.close() 
    print (x) 
    record1 = record.split('|') 
    print (record1) 

    second_meni() 

這是代碼存放的書籍,我想(在圖書館等)後訪問信息。但是,每次添加/創建新書時,舊書都會被刪除。任何人都可以幫我重寫代碼,以便它可以存儲舊數據。或者請解釋什麼是正確的做法?

+4

讓英文代碼有幫助。下一次僅供參考。 –

+4

'f = open('knjige.txt','w')':它每次覆蓋文件(截斷) –

+1

老實說,你真的需要參加codeacademy等那些免費的Python課程來正確編程。 – mootmoot

回答

6

你必須使用

f = open('knjige.txt', 'a') 

「W」重新創建文件(所以用它僅適用於新的文件,或者如果你不介意它會被覆蓋,「A」附加到文件中。

python open built-in function: difference between modes a, a+, w, w+, and r+?

也有一些不相關的建議:

  • 使用添加的,而不是指數,甚至更好:使用字典
  • 使用英語變量名稱/註釋。
  • 使用代碼檢查文件的讀/寫是否正常,如果由於訪問限制或磁盤空間太少而寫入的文件不能爲 ?
  • 對輸入,寫入和打印使用不同的功能,它使得測試/可維護性/擴展更容易。
+0

謝謝。它有幫助。但是,如果我可能再問一個問題,我該如何創建它,以便每次輸入新書(列表)時都會將其保存在文本文件的新行中。 – Alex

+1

「我如何創建它,以便每次輸入新書(列表)時,它都會保存在文本文件的新行中」:您應該爲輸出字符串\ n添加一個換行符。 –

+0

(已在上面解答) –

0

您打開文件的電話f = open('knjige.txt','w')會打開該文件,如果該文件存在,則截斷現有內容。如果使用附加內容的模式打開文件,如a,則不應刪除以前的行。有關打開讀取/寫入文件的更多信息,請參閱https://docs.python.org/2/library/functions.html#open

2

我冒昧地pythonizing你的代碼有點兒

def unos_knjiga(): 
    headers = ["Autor", "Naslov", "Godina", "ISNB", "Zanr", "Cena", "Kolicina"] 
    print("Podaci za knjigu:") 
    knjiga = [input("{}".format(obj + ': ')) for obj in headers] # see 1 
    zapis = '|'.join(knjiga) # see 2 

    print(knjiga) 
    print(zapis) 

    with open('knjige.txt', 'a') as f: # see 3 
     f.write(zapis + '\n') 

    # i guess this is for testing? 
    with open("knjige.txt", 'r') as f: 
     x = f.read() 
    print(x) 

    # and this too? 
    zapis1 = zapis.split('|') 
    print(zapis1) 

    # this is not mentioned anywhere 
    second_meni() 

1)這是一個列表理解。它通過循環遍歷東西來創建列表。在這種情況下,我們循環訪問header列表並使用它的項目來構造input語句。提供的輸入存儲在列表中。

2).join()方法。它做你明確做的。使用它們之間的字符串從迭代器中加入項目。

3)with關鍵字。管理文件,以便您不必。除非有理由不使用它,否則使用它。這也是你的代碼真正存在的問題。您必須使用'a'模式。 'a'用於附加,'w'用於寫入。在這種情況下,寫意味着刪除那裏的一切,並寫下這個新東西。另外請注意,'a'模式也可以創建文件,因此您不需要臨時切換到'w''r'沒有; 'r'讀取)。

乾杯!

+0

謝謝。這是我的程序的一部分,我有一個問題。我仍然是一個史詩新手:/ – Alex

+0

@Alex:代碼已經添加了一個'\ n',可以將你的書分成不同的行。 – mootmoot

+0

@mootmoot非常感謝,非常完美! – Alex

1

我認爲有兩種方法來做到這一點:

FIRST

f = open('knjige.txt','w') 

是一段代碼,它負責在您的文件改寫現有的數據。 python提供的將一些新數據附加到現有數據的其他選項是使用append'a'方法打開一個文件進行寫入。所以,你可以用

f = open('knjige.txt','a') 

更換您的上述聲明它不會取代您輸入新數據的文件。

第二

另一種選擇是在讀的方法來打開你的文件,f = open('knjige.txt','r')和現有的數據複製到一個變量(variable=f.read('knjige.txt'))。您還可以使用泡菜模塊及其功能轉儲加載如果您需要維護您的數據類型。 現在將您的新數據連接到'變量'中的值,並再次用寫入方法打開文件並將其寫回。

相關問題