无法获取字典以将其保存到.txt文件,而Python中没有语法错误

时间:2019-03-24 06:19:30

标签: python python-3.x

我将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

3 个答案:

答案 0 :(得分:1)

该问题可能是由于未在文件中添加换行符引起的。一个简单的解决方法是:f.write(str(meals) + "\n")

但是在文本文件中编写代码然后进行评估是一个坏主意:

  • 该文件只能被您的python程序读取
  • 容易出现语法错误(如您的问题)
  • 这是非常不安全的。恶意代码可能会出现在您的文件中。

只要您仅在字典中存储文本,数字和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()