尝试将腌制数据加载到列表中未正确附加
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()
我正在编写待办事项列表应用程序,并存储 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()