Pickle - 无法正确存储附加字典列表
Pickle - Unable to correctly store appended dictionary to list
我正在尝试将多个词典的列表保存在 pickle 文件中,并且能够随时在列表中存储新的附加词典并将其保存在 pickle 文件中,然后将 pickle 文件作为列表加载字典。到目前为止,代码的行为如下:
第一次尝试在列表中追加字典时,pickle 文件如下所示(数据保存成功):
Running info()......
===================================================
Existing data: []
===================================================
Running save_score()......
Inside try: {}
============================================
Existing data: [{}]
New data: {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}
Saved Data: [{}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}]
===================================================
我第二次尝试在列表中附加字典,pickle 文件如下所示:
Running info()......
===================================================
Existing data: [[{}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}]]
===================================================
Running save_score()......
Inside try: [{}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}]
============================================
Existing data: [[{}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}], [{}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}]]
New data: {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}
Saved Data: [[{}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}], [{}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}], {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}]
===================================================
如您所见(字典中的值在上面的示例中不是问题),而不是附加到现有列表,每次都会在列表中创建一个新列表。到目前为止,我还没有设法解决这个问题并获得预期的输出。
预期的输出应该是:
Saved Data: [{}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}, {}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}]
相反,输出是:
Saved Data: [[{}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}], [{}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}], {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}]
代码如下:
import pickle
data = []
computer_name = "computer name"
username = "user 1"
computer_score = 3
human_score = 1
def save_score():
try:
existing_data = pickle.load(open("w6_project.p", "rb"))
print("Inside try: {}".format(existing_data))
data.append(existing_data)
except (OSError, IOError) as e:
pickle.dump({}, open("w6_project.p", "wb"))
new_data = {"ComputerName": computer_name, "PlayerName": username, "ComputerScore": computer_score, "PlayerScore": human_score}
print("============================================")
print("Existing data: {}".format(data))
data.append(new_data)
print("New data: {}".format(new_data))
pickle.dump(data, open("w6_project.p", "wb")) # Save the data into a pickle file
print("Saved Data: {}".format(data))
print("===================================================")
pass
def info():
try:
existing_data = pickle.load(open("w6_project.p", "rb"))
data.append(existing_data)
except (OSError, IOError) as e:
pickle.dump({}, open("w6_project.p", "wb"))
print("===================================================")
print("Existing data: {}".format(data))
print("===================================================")
pass
def main():
print("Running info()......\n")
info()
print("\nRunning save_score()......\n")
save_score()
if __name__ == "__main__":
main()
问题是您有两个列表 - data
和 existing_data
- 并且您以错误的方式加入它们。使用 append()
可以将一个列表放在另一个列表中。你应该使用 extend()
加入他们
data.extend(existing_data)
或更短
data += existing_data
但是如果你在加载 pickle 后添加新数据,那么你应该简单地直接赋值给变量
data = pickle.load(...)
编辑: 最小工作示例
import pickle
computer_name = "computer name"
username = "user 1"
computer_score = 3
human_score = 1
def save_score():
try:
data = pickle.load(open("w6_project.p", "rb"))
print("Inside try: {}".format(data))
except (OSError, IOError) as e:
data = []
new_data = {"ComputerName": computer_name, "PlayerName": username, "ComputerScore": computer_score, "PlayerScore": human_score}
data.append(new_data)
pickle.dump(data, open("w6_project.p", "wb")) # Save the data into a pickle file
print("============================================")
print("Existing Data: {}".format(data))
print("New Data: {}".format(new_data))
print("Saved Data: {}".format(data))
print("Length Data: {}".format( len(data) ))
print("===================================================")
def info():
try:
data = pickle.load(open("w6_project.p", "rb"))
except (OSError, IOError) as e:
data = []
print("===================================================")
print("Existing Data: {}".format(data))
print("Length Data: {}".format( len(data) ))
print("===================================================")
def main():
print("Running info()......\n")
info()
print("\nRunning save_score()......\n")
save_score()
if __name__ == "__main__":
main()
我正在尝试将多个词典的列表保存在 pickle 文件中,并且能够随时在列表中存储新的附加词典并将其保存在 pickle 文件中,然后将 pickle 文件作为列表加载字典。到目前为止,代码的行为如下:
第一次尝试在列表中追加字典时,pickle 文件如下所示(数据保存成功):
Running info()......
===================================================
Existing data: []
===================================================
Running save_score()......
Inside try: {}
============================================
Existing data: [{}]
New data: {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}
Saved Data: [{}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}]
===================================================
我第二次尝试在列表中附加字典,pickle 文件如下所示:
Running info()......
===================================================
Existing data: [[{}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}]]
===================================================
Running save_score()......
Inside try: [{}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}]
============================================
Existing data: [[{}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}], [{}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}]]
New data: {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}
Saved Data: [[{}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}], [{}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}], {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}]
===================================================
如您所见(字典中的值在上面的示例中不是问题),而不是附加到现有列表,每次都会在列表中创建一个新列表。到目前为止,我还没有设法解决这个问题并获得预期的输出。
预期的输出应该是:
Saved Data: [{}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}, {}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}]
相反,输出是:
Saved Data: [[{}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}], [{}, {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}], {'ComputerName': 'computer name', 'PlayerName': 'user 1', 'ComputerScore': 3, 'PlayerScore': 1}]
代码如下:
import pickle
data = []
computer_name = "computer name"
username = "user 1"
computer_score = 3
human_score = 1
def save_score():
try:
existing_data = pickle.load(open("w6_project.p", "rb"))
print("Inside try: {}".format(existing_data))
data.append(existing_data)
except (OSError, IOError) as e:
pickle.dump({}, open("w6_project.p", "wb"))
new_data = {"ComputerName": computer_name, "PlayerName": username, "ComputerScore": computer_score, "PlayerScore": human_score}
print("============================================")
print("Existing data: {}".format(data))
data.append(new_data)
print("New data: {}".format(new_data))
pickle.dump(data, open("w6_project.p", "wb")) # Save the data into a pickle file
print("Saved Data: {}".format(data))
print("===================================================")
pass
def info():
try:
existing_data = pickle.load(open("w6_project.p", "rb"))
data.append(existing_data)
except (OSError, IOError) as e:
pickle.dump({}, open("w6_project.p", "wb"))
print("===================================================")
print("Existing data: {}".format(data))
print("===================================================")
pass
def main():
print("Running info()......\n")
info()
print("\nRunning save_score()......\n")
save_score()
if __name__ == "__main__":
main()
问题是您有两个列表 - data
和 existing_data
- 并且您以错误的方式加入它们。使用 append()
可以将一个列表放在另一个列表中。你应该使用 extend()
加入他们
data.extend(existing_data)
或更短
data += existing_data
但是如果你在加载 pickle 后添加新数据,那么你应该简单地直接赋值给变量
data = pickle.load(...)
编辑: 最小工作示例
import pickle
computer_name = "computer name"
username = "user 1"
computer_score = 3
human_score = 1
def save_score():
try:
data = pickle.load(open("w6_project.p", "rb"))
print("Inside try: {}".format(data))
except (OSError, IOError) as e:
data = []
new_data = {"ComputerName": computer_name, "PlayerName": username, "ComputerScore": computer_score, "PlayerScore": human_score}
data.append(new_data)
pickle.dump(data, open("w6_project.p", "wb")) # Save the data into a pickle file
print("============================================")
print("Existing Data: {}".format(data))
print("New Data: {}".format(new_data))
print("Saved Data: {}".format(data))
print("Length Data: {}".format( len(data) ))
print("===================================================")
def info():
try:
data = pickle.load(open("w6_project.p", "rb"))
except (OSError, IOError) as e:
data = []
print("===================================================")
print("Existing Data: {}".format(data))
print("Length Data: {}".format( len(data) ))
print("===================================================")
def main():
print("Running info()......\n")
info()
print("\nRunning save_score()......\n")
save_score()
if __name__ == "__main__":
main()