Не удается получить словарь для сохранения в файл .txt без синтаксической ошибки в Python

Из ссылки core javascript

=== Возвращает true, если операнды строго равны (см. выше) без преобразования типа.

1
задан t.m.adam 24 March 2019 в 06:25
поделиться

3 ответа

Я не совсем помню, как работает красивая печать, но этот способ сделать это очень хрупкий. Вероятность того, что что-то не будет печататься так, как вы ожидаете, довольно высока, что может сломать ситуацию, как сейчас.

Я рекомендую использовать более стандартный формат передачи данных, такой как 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())
0
ответ дан TheBeege 24 March 2019 в 06:25
поделиться

это нужно для работы:

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()
0
ответ дан Matthijs990 24 March 2019 в 06:25
поделиться

Возможно, проблема связана с тем, что в ваш файл не добавляются новые строки. Простое исправление было бы следующим: f.write(str(meals) + "\n")

Но писать код в текстовом файле и затем оценивать его - плохая идея:

  • Файл будет доступен для чтения только вашей программе на Python
  • Это подвержено синтаксическим ошибкам (как в вашем вопросе)
  • Это очень небезопасно. Вредоносный код может оказаться в вашем файле.

Пока вы храните только текст, числа и true / false в своем словаре, он может быть очень четко представлен в файле 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. Как отметил Клаус Д. в комментарии, рассол не безопаснее, чем ваш подход. Вы никогда не должны загружать объект рассола из источника, которому вы не доверяете.

import pickle

with open("file.txt", "wb") as file:
    pickle.dump(data, file)

with open("file.txt", "rb") as file:
    data = pickle.load(file)
0
ответ дан lhk 24 March 2019 в 06:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: