Estou tentando escrever um dicionário em um arquivo txt. Em seguida, leia os valores dict digitando as teclas com raw_input
. Eu sinto que estou perdendo uma etapa, mas estou procurando há um tempo.
Eu recebo este erro
File "name.py", line 24, in reading
print whip[name]
TypeError: string indices must be integers, not str
Meu código:
#!/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 deve ser uma instância da classe PersonRespostas:
Seu código está quase certo ! Você está certo, você está faltando apenas uma etapa. Ao ler o arquivo, você o está lendo como uma string; mas você quer transformar a string de volta em um dicionário.
A mensagem de erro que você viu foi porque
self.whip
era uma string, não um dicionário.Eu escrevi pela primeira vez que você poderia simplesmente alimentar a corda,
dict()
mas isso não funciona! Você precisa fazer outra coisa.Exemplo
Aqui está a maneira mais simples: alimentar a string em
eval()
. Igual a:Você pode fazer isso em uma linha, mas acho que fica confuso desta forma:
Mas
eval()
às vezes não é recomendado. O problema é queeval()
avaliará qualquer string, e se alguém o enganou para executar uma string realmente complicada, algo ruim pode acontecer. Nesse caso, você está apenas executandoeval()
em seu próprio arquivo, então deve estar tudo bem.Mas, porque
eval()
é útil, alguém criou uma alternativa mais segura. Isso é chamadoliteral_eval
e você o obtém de um módulo Python chamadoast
.ast.literal_eval()
avaliará apenas strings que se transformam nos tipos básicos do Python, portanto, não há como uma string complicada fazer algo ruim em seu computador.EDITAR
Na verdade, a melhor prática em Python é usar uma
with
instrução para garantir que o arquivo seja fechado corretamente. Reescrevendo o acima para usar umawith
declaração:No Python mais popular, conhecido como "CPython", você geralmente não precisa da
with
instrução, pois os recursos integrados de "coleta de lixo" descobrirão que você concluiu o arquivo e o fecharão para você. Mas outras implementações Python, como "Jython" (Python para Java VM) ou "PyPy" (um sistema experimental muito legal com otimização de código just-in-time) podem não descobrir como fechar o arquivo para você. É bom adquirir o hábito de usarwith
e acho que torna o código muito fácil de entender.fonte
dict()
espera um dicionário ou uma lista de tuplas. Não avaliará uma string.Você já experimentou o módulo json ? O formato JSON é muito semelhante ao dicionário Python. E é legível / gravável por humanos:
Este código é despejado em um arquivo de texto
Além disso, você pode carregar de um arquivo JSON:
fonte
with
declaração para garantir que ele feche depois?d = {"one": {"1" : 1, "a": {"i"}}}
). Portanto, eu recomendo o método pickle do @blender que funciona no meu caso.json.dump({1: 'one'}, file)
será lido de volta como{'1': 'one'}
ao fazer json.load. Melhor usar pickle se você não for ler o arquivo salvo usando outras linguagens além do Python.Para armazenar objetos Python em arquivos, use o
pickle
módulo:Observe que eu nunca defini
b = a
, mas em vez dissoa
selecionei em um arquivo e, em seguida, desfizb
.Quanto ao seu erro:
self.whip
era um objeto de dicionário.deed.txt
contém texto, então quando você carrega o conteúdo dedeed.txt
emself.whip
,self.whip
torna-se a string representação de de si mesmo.Você provavelmente gostaria de avaliar a string de volta em um objeto Python:
Observe como
eval
soaevil
. Isso é intencional. Empickle
vez disso, use o módulo.fonte
Eu criei minhas próprias funções que funcionam muito bem:
Ele armazenará o nome-chave primeiro, seguido por todos os valores. Observe que, neste caso, meu dict contém inteiros, por isso é convertido para
int
. Esta é provavelmente a parte que você precisa mudar para sua situação.fonte
Olá, há uma maneira de escrever e ler o dicionário para o arquivo, você pode transformar seu dicionário no formato JSON e ler e escrever rapidamente, basta fazer isso:
Para escrever sua data:
e para ler seus dados:
fonte
Você pode iterar através do par de valores-chave e gravá-lo no arquivo
fonte