Skip to main content
 首页 » 编程设计

Python:数据到文件然后数据从文本文件到列表之TypeError:必须是 str,而不是字节

2025年05月04日798°冷暖

我是编程初学者,决定自学 Python。几天后,我决定编写一小段代码。我很简单:

  • 今天的日期
  • 我所在的页面(我正在看书)
  • 我的感受
  • 然后我将数据添加到一个文件中。每次启动程序时,它都会在文件中添加一行新数据
  • 然后我提取数据以制作列表列表。

事实是,我想重写我的程序以便 pickle 列表然后取消 pickle 文件。但是,由于我正在处理我无法处理的错误,我真的很想了解如何解决这个问题。因此,我希望你能帮助我 :)

在过去的几个小时里,我一直在为这个看似简单而愚蠢的问题而苦苦挣扎。虽然我没有找到解决方案。这是错误和代码:

错误:

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 

代码:

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) 

非常感谢!

请您参考如下方法:

好的,这里有几件事要评论:

  1. 当您使用with 语句时,您不必显式关闭文件。 Python 将在 with block (第 8 行)的末尾为您执行此操作。

  2. 您不使用 todayList 做任何事情。您创建它,添加一个元素,然后丢弃它。所以它可能没用:)

  3. 为什么要 pickle 字符串对象?如果您有字符串,只需按原样将它们写入文件。

  4. 如果您在写入时对数据进行 pickle,则必须在读取时对其进行 unpickle。您不应该编写 pickled 数据,然后将文件作为纯文本文件读取。

  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(';'))