Пытаюсь записать словарь в текстовый файл. Затем прочтите значения dict, нажав клавиши с помощью raw_input
. Я чувствую, что просто упускаю один шаг, но я уже давно искал.
Я получаю эту ошибку
File "name.py", line 24, in reading
print whip[name]
TypeError: string indices must be integers, not str
Мой код:
#!/usr/bin/env python
from sys import exit
class Person(object):
def __init__(self):
self.name = ""
self.address = ""
self.phone = ""
self.age = ""
self.whip = {}
def writing(self):
self.whip[p.name] = p.age, p.address, p.phone
target = open('deed.txt', 'a')
target.write(str(self.whip))
print self.whip
def reading(self):
self.whip = open('deed.txt', 'r').read()
name = raw_input("> ")
if name in self.whip:
print self.whip[name]
p = Person()
while True:
print "Type:\n\t*read to read data base\n\t*write to write to data base\n\t*exit to exit"
action = raw_input("\n> ")
if "write" in action:
p.name = raw_input("Name?\n> ")
p.phone = raw_input("Phone Number?\n> ")
p.age = raw_input("Age?\n> ")
p.address = raw_input("Address?\n>")
p.writing()
elif "read" in action:
p.reading()
elif "exit" in action:
exit(0)
name 'p' is not defined
, p должен быть экземпляром класса PersonОтветы:
Ваш код почти правильный ! Вы правы, вам просто не хватает одного шага. Когда вы читаете файл, вы читаете его как строку; но вы хотите превратить строку обратно в словарь.
Вы увидели сообщение об ошибке, потому что
self.whip
это строка, а не словарь.Сначала я написал, что можно просто ввести строку,
dict()
но это не работает! Вам нужно заняться чем-то другим.пример
Вот самый простой способ: вставить строку в
eval()
. Вот так:Вы можете сделать это одной строкой, но я думаю, что это выглядит неаккуратно:
Но
eval()
иногда не рекомендуется. Проблема в том, чтоeval()
будет оцениваться любая строка, и если кто-то обманом заставил вас запустить действительно сложную строку, может случиться что-то плохое. В этом случае вы просто запускаетеeval()
свой собственный файл, так что все должно быть в порядке.Но поскольку
eval()
это полезно, кто-то сделал ему альтернативу, которая безопаснее. Это называется,literal_eval
и вы получаете его из модуля Python с именемast
.ast.literal_eval()
будет оценивать только те строки, которые превращаются в базовые типы Python, поэтому хитрая строка не может сделать что-то плохое на вашем компьютере.РЕДАКТИРОВАТЬ
На самом деле, лучшая практика в Python - использовать
with
оператор, чтобы убедиться, что файл правильно закрыт. Переписываем приведенное выше, чтобы использоватьwith
оператор:В наиболее популярном Python, известном как «CPython», этот
with
оператор обычно не нужен, поскольку встроенные функции «сборки мусора» определят, что вы закончили работу с файлом, и закроют его за вас. Но другие реализации Python, такие как Jython (Python для виртуальной машины Java) или PyPy (действительно крутая экспериментальная система с своевременной оптимизацией кода), могут не решить, как закрыть файл для вас. Привыкнуть к использованию - это хорошоwith
, и я думаю, это упрощает понимание кода.источник
dict()
ожидает словарь или список кортежей. Он не будет оценивать строку.Вы пробовали модуль json ? Формат JSON очень похож на словарь Python. И он доступен для чтения / записи:
Этот код выгружается в текстовый файл
Также вы можете загрузить из файла JSON:
источник
with
операторе, чтобы гарантировать его закрытие после?d = {"one": {"1" : 1, "a": {"i"}}}
). Поэтому я рекомендую метод pickle @blender, который работает в моем случае.json.dump({1: 'one'}, file)
будет считываться, как{'1': 'one'}
при выполнении json.load. Лучше использовать pickle, если вы не собираетесь читать сохраненный файл на других языках, кроме Python.Для хранения объектов Python в файлах используйте
pickle
модуль:Обратите внимание, что я никогда не устанавливал
b = a
, а вместоa
этого добавлял в файл, а затем распаковывал его вb
.Что касается вашей ошибки:
self.whip
был объектом словаря.deed.txt
содержит текст, поэтому, когда вы загружаете содержимоеdeed.txt
вself.whip
,self.whip
становится строковым представлением самого себя.Вероятно, вы захотите оценить строку обратно в объект Python:
Обратите внимание, как
eval
звучитevil
. Это сделано намеренно.pickle
Вместо этого используйте модуль.источник
Я создал свои собственные функции, которые действительно прекрасно работают:
Сначала будет сохранено имя ключа, а затем все значения. Обратите внимание, что в этом случае мой dict содержит целые числа, поэтому он преобразуется в
int
. Скорее всего, вам нужно изменить эту часть в зависимости от ситуации.источник
Привет, есть способ написать и прочитать словарь в файл, вы можете превратить свой словарь в формат JSON и быстро читать и писать, просто сделайте это:
Чтобы написать дату:
и читать ваши данные:
источник
Вы можете перебирать пару ключ-значение и записывать ее в файл
источник