2013-08-17 30 views
2

我是編程的初學者,並決定自學Python。幾天後,我決定編寫一小段代碼。我是很簡單的:Python:數據到文件然後數據從文本文件到列表 - TypeError:必須是str,而不是字節

  • 今天
  • 頁我在(我讀一本書)的日期
  • 我怎麼感覺
  • 然後我在文件中添加數據。每次啓動程序時,它會在文件
  • 中添加一行新的數據,然後提取數據以生成列表列表。

事實是,我想重新寫我的程序,以醃菜單,然後unpickle該文件。但是,當我處理一個我無法處理的錯誤時,我真的很想知道如何解決這個問題。因此,我希望你能幫助我:)

我一直在這個顯然簡單而愚蠢的問題一直在努力過去的幾個小時。雖然我找不到解決方案。以下是錯誤,代碼:

錯誤:

Traceback (most recent call last): 
    File "dailyshot.py", line 25, in <module> 
    SaveData(todaysline) 
    File "dailyshot.py", line 11, in SaveData 
    mon_pickler.dump(datatosave) 
TypeError: must be str, not bytes 

CODE:

import pickle 
import datetime 

def SaveData(datatosave): 
    with open('journey.txt', 'wb') as thefile: 
     my_pickler = pickle.Pickler(thefile) 
     my_pickler.dump(datatosave) 
     thefile.close() 

todaylist = [] 
today = datetime.date.today() 
todaylist.append(today) 

page = input('Page Number?\n') 
feel = input('How do you feel?\n') 

todaysline = today.strftime('%d, %b %Y') + "; " + page + "; " + feel + "\n" 

print('Thanks and Good Bye!') 

SaveData(todaysline) 

print('let\'s make a list now...') 

thefile = open('journey.txt','rb') 
thelist = [line.split(';') for line in thefile.readlines()] 
thefile.close() 

print(thelist) 

感謝looot!

回答

1

好了,所以有一些事情要在這裏評論:

  1. 當您使用with聲明,你沒有明確關閉該文件。 Python將在with塊(第8行)的末尾爲你做到這一點。

  2. 對於任何事情您都不使用todayList。你創建它,添加一個元素,然後放棄它。所以它可能是無用的:)

  3. 你爲什麼酸洗字符串對象?如果你有字符串,就按原樣寫入文件。

  4. 如果您在寫入數據時醃製數據,則必須在讀取時取下它。您不應該編寫醃製數據,然後將其作爲純文本文件讀取。

  5. 使用a作爲添加項目到文件時的追加,w將覆蓋整個文件。

我會建議只寫一個純文本文件,其中每行是一個條目。

import datetime 

def save(data): 
    with open('journey.txt', 'a') as f: 
     f.write(data + '\n') 

today = datetime.date.today() 
page = input('Page Number: ') 
feel = input('How do you feel: ') 

todaysline = ';'.join([today.strftime('%d, %b %Y'), page, feel]) 

print('Thanks and Good Bye!') 
save(todaysline) 

print('let\'s make a list now...') 

with open('journey.txt','r') as f: 
    for line in f: 
     print(line.strip().split(';')) 
+0

感謝維克多被打開。關於你的代碼,第22行似乎沒有解決。在我看來,缺少一些東西沒有?但有沒有辦法讓我的代碼工作,通過修復這個「一定是str,而不是字節」的錯誤,這看起來並不複雜......但我找不到如何解決它。我試圖瞭解我不在這裏:) – 2lr

+0

我改變了一點,現在是什麼線?你使用的是什麼版本的Python? –

+0

Python3.3 - 感謝您抽出時間 – 2lr

0

你確定你發佈了正確的代碼嗎?如果在打開文件時錯過了「b」,則會發生此錯誤。

with open('journey.txt', 'w') as thefile: 

>>> with open('journey.txt', 'w') as thefile: 
... pickler = pickle.Pickler(thefile) 
... pickler.dump("some string") 
... 
Traceback (most recent call last): 
    File "<stdin>", line 3, in <module> 
TypeError: must be str, not bytes 

文件應該以二進制模式

>>> with open('journey.txt', 'wb') as thefile: 
... pickler = pickle.Pickler(thefile) 
... pickler.dump("some string") 
... 
>>> 
+0

是的,這是正確的代碼。我不應該使用鹹菜,除非我需要取消。 – 2lr

相關問題