尝试将腌制数据加载到列表中未正确附加

Trying to load pickled data to a list isn't appending properly

我正在编写待办事项列表应用程序,并存储 class 对象 task 我正在挑选已创建对象的列表。但是,当我加载数据时,列表显示为空。我构建它的方式是在每个会话中创建一个空列表,然后附加 pickle 文件的内容。创建新任务时,它们会被追加,然后追加整个列表,然后重新加载。

这是我的第一个真正的软件项目,所以我的代码看起来很粗糙。我查看了它并没有发现任何明显的错误,但显然我做错了什么。

相关代码如下:

import _pickle as pickle
import os.path
from os import path
from datetime import datetime

#checks if data exists, and creates file if it does not
if path.exists('./tasks.txt') != True:
    open("./tasks.txt", 'wb')
else:
    pass

#define class for tasks
class task:
    def __init__(self, name, due, category):
        self.name = name
        self.due = datetime.strptime(due, '%B %d %Y %I:%M%p')
        self.category = category
    def expand(self): # returns the contents of the task
        return str(self.name) + " is due in " + str((self.due - datetime.now()))

data = []
# load data to list
def load_data():
    with open('tasks.txt', 'rb') as file:
        while True:
            data = []
            try:
                data.append(pickle.load(file))
            except EOFError:
                break
...

# returns current task list
def list_tasks():
    clear()
    if not data:
        print("Nothing to see here.")
    else:
        i = 1
        for task in data:
            print("%s. %s" % (i, task.expand()))
            i = i+1

#define function to add tasks
def addTask(name, due, category):
    newTask = task(name, due, category)
    data.append(newTask)
    with open('./tasks.txt', 'wb') as file:
        pickle.dump(data, file)
    load_data()
    list_tasks()

...

load_data()
list_tasks()
startup()
ask()
data = []
# load data to list
def load_data():
    with open('tasks.txt', 'rb') as file:
        while True:
            data = []
            try:
                data.append(pickle.load(file))
            except EOFError:
                break

第二个 data = [] 看起来不对。在函数内部和外部都具有 data = [] 会创建两个 data 对象,而您要追加的对象将无法在其他任何地方访问。即使它可以访问,它仍然是空的,因为它在 while 循环的每次迭代中都被重置为 [] 。尝试擦除内部 data = []。然后 data.append 调用将影响全局可见的 data,并且其内容不会在每次循环中重置。

此外,根据您的其余代码,data 看起来应该是一个任务列表。但是如果你 pickle 一个任务列表然后 运行 data.append(pickle.load(file)),那么 data 将是一个任务列表的列表。保持平坦的一种方法是使用 extend 而不是 append.

data = []
# load data to list
def load_data():
    with open('tasks.txt', 'rb') as file:
        while True:
            try:
                data.extend(pickle.load(file))
            except EOFError:
                break

我认为也可以通过单个 load 调用而不是循环中的多次调用来加载数据。这取决于您的 tasks.txt 文件是否是单个 pickle.dump 调用的结果,或者您是否在 [=35] 中打开文件时通过多次 pickle.dump 调用多次向其附加文本=]模式。

def load_data():
    with open('tasks.txt', 'rb') as file:
        return pickle.load(file)
data = load_data()