我将2种不同的膳食和2种不同的单位量添加到字典中,然后将其完美地保存到我的文本文件中,但是当我退出程序并重新加载文件时,出现语法错误。 (另外,某些函数看起来还没有完成,但这仅仅是因为Stack Overflow告诉我不要在其中添加所有代码。
试图使字典不以空字典开头,但是却不能解决任何问题。
import pprint
import time
pretty = pprint.PrettyPrinter(width = 20)
meals = {}
command = ""
condition = False
f = open("meals.txt", "r+")
f.write(str(meals))
f.close()
def save_dict_to_file(meals):
f = open("meals.txt", "r+")
f.write(str(meals))
f.close()
def load_dict_from_file():
f = open("meals.txt", "r+")
data = f.read()
f.close()
return eval(data)
load_dict_from_file()
def add_entry():
meal = input("Enter name of meal: ").lower()
units = int(input("Enter units needed: "))
meals[meal] = units
pretty.pprint(meals)
save_dict_to_file(meals)
def remove_entry():
def help():
def view_dict():
def ending_message():
while True:
command = input("> ").lower()
if command == "help":
help()
elif command == "add":
add_entry()
elif command == "exit":
save_dict_to_file(meals)
ending_message()
time.sleep(3)
break
elif command == "remove":
remove_entry()
elif command == "view":
view_dict()
在字典中添加多个条目之后,我希望能够退出程序,加载并在键入view来查看条目时查看以前添加的内容。这就是我得到的-
PS C:\Users\Alex\Desktop\Python\own_projects\mosh> python diabetes.py
Traceback (most recent call last):
File "diabetes.py", line 24, in <module>
load_dict_from_file()
File "diabetes.py", line 22, in load_dict_from_file
return eval(data)
File "<string>", line 1
{}lasagne': 12, 'fish and chips': 16}
^
SyntaxError: invalid syntax
答案 0 :(得分:1)
该问题可能是由于未在文件中添加换行符引起的。一个简单的解决方法是:f.write(str(meals) + "\n")
但是在文本文件中编写代码然后进行评估是一个坏主意:
只要您仅在字典中存储文本,数字和true / false,就可以用JSON文件非常清晰地表示它。 JSON的优点是,基本上任何编程语言都可以读取JSON:
import json
data = {
"A": 1,
"B": {"C": 2}
}
# write data to file
with open("file.txt", "w") as file:
file.write(json.dumps(data))
# read data from file
with open("file.txt", "r") as file:
data = json.load(file)
如果将更复杂的对象(例如类的实例等)存储在文件中,则应查看pickle。那是另一个内置库,是一种非常方便的方式来存储python程序中的几乎所有内容。正如Klaus D.在评论中指出的那样,泡菜并不比您的方法更安全。永远不要从不信任的来源加载泡菜对象。
import pickle
with open("file.txt", "wb") as file:
pickle.dump(data, file)
with open("file.txt", "rb") as file:
data = pickle.load(file)
答案 1 :(得分:0)
我并不完全记得漂亮的印刷品是如何工作的,但是这种实现方式非常脆弱。无法按照您期望的方式进行打印的可能性很高,这可能会破坏目前的状况。
我建议使用更标准的数据传输格式,例如CSV或JSON。如果您的数据是平坦的,我建议使用CSV。如果您的数据更复杂,建议您使用JSON。
我将用两种方法的示例暂时编辑此答案。
CSV示例:
import csv
# This is a list of dictionaries
data = [
{
'meal': 'breakfast',
'units': 20
},
{
'meal': 'lunch',
'units': 40
},
{
'meal': 'dinner',
'units': 50
}
]
# If you wanted the values for lunch, you could do data[1]['units']
# This says access the second value inside the data list,
# and get the value for the units in that dictionary
def write_data(file_path='meals.csv'):
# Open the file for writing without adding extra new lines
# The with syntax will automatically close it for us
with open(file_path, 'w', newline='') as f:
# Create a dictionary writer, telling it what columns to expect
writer = csv.DictWriter(f, ['meal', 'units'])
writer.writeheader()
writer.writerows(data)
def read_data(file_path='meals.csv'):
new_data = []
# open the file for reading
with open(file_path) as f:
# Create a dictionary reader. It will figure things out automagically
reader = csv.DictReader(f)
for row in reader:
print(row)
new_data.append(row)
return new_data
print('writing data...')
write_data()
print('reading data...')
print(read_data())
JSON示例:
import json
data = {
'lunch': 10,
'breakfast': 20,
'dinner': 30
}
def write_data(file_path='meals.json'):
# Open the file for writing without adding extra new lines
# The with syntax will automatically close it for us
with open(file_path, 'w', newline='') as f:
json.dump(data, f)
def read_data(file_path='meals.json'):
# open the file for reading
with open(file_path) as f:
new_data = json.load(f)
return new_data
print('writing data...')
write_data()
print('reading data...')
print(read_data())
答案 2 :(得分:0)
这需要工作:
import pprint
import time
import os
pretty = pprint.PrettyPrinter(width = 20)
meals = {}
command = ""
condition = False
n = False
if not os.path.isfile('meals.txt'):
f = open("meals.txt", "w+")
f.write(str(meals))
f.close()
else:
n = True
def save_dict_to_file(meals):
f = open("meals.txt", "w+")
f.write(str(meals))
f.close()
def load_dict_from_file():
f = open("meals.txt", "r+")
data = f.read()
f.close()
return eval(data)
if n:
meals = load_dict_from_file()
def add_entry():
meal = input("Enter name of meal: ").lower()
units = int(input("Enter units needed: "))
meals[meal] = units
pretty.pprint(meals)
save_dict_to_file(meals)
import os
def remove_entry():
os.remove('meals.txt')
def help():
pretty.pprint('help')
def view_dict():
pretty.pprint(load_dict_from_file())
def ending_message():
pretty.pprint('done')
while True:
command = input("> ").lower()
if command == "help":
help()
elif command == "add":
add_entry()
elif command == "exit":
save_dict_to_file(meals)
ending_message()
time.sleep(3)
break
elif command == "remove":
remove_entry()
elif command == "view":
view_dict()