Próbuję napisać słownik do pliku txt. Następnie przeczytaj wartości dict, wpisując klucze za pomocą raw_input
. Czuję, że przegapiłem jeden krok, ale szukałem już od jakiegoś czasu.
Otrzymuję ten błąd
File "name.py", line 24, in reading
print whip[name]
TypeError: string indices must be integers, not str
Mój kod:
#!/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 powinno być instancją klasy PersonOdpowiedzi:
Twój kod jest prawie poprawny ! Masz rację, brakuje Ci tylko jednego kroku. Kiedy czytasz plik, czytasz go jako ciąg; ale chcesz przekształcić ciąg z powrotem w słownik.
Wyświetlony komunikat o błędzie brzmiał, ponieważ
self.whip
był to ciąg znaków, a nie słownik.Najpierw napisałem, że możesz po prostu wprowadzić ciąg,
dict()
ale to nie działa! Musisz zrobić coś innego.Przykład
Oto najprostszy sposób: wprowadź ciąg do
eval()
. Tak jak to:Możesz to zrobić w jednej linii, ale myślę, że wygląda to niechlujnie w ten sposób:
Ale
eval()
czasami nie jest zalecane. Problem polega na tym,eval()
że oceni każdy ciąg, a jeśli ktoś oszuka cię do uruchomienia naprawdę trudnego ciągu, może się zdarzyć coś złego. W takim przypadku po prostu uruchamiaszeval()
swój własny plik, więc powinno być w porządku.Ale ponieważ
eval()
jest przydatny, ktoś stworzył dla niego alternatywę, która jest bezpieczniejsza. Nazywa się toliteral_eval
i uzyskujesz to z modułu Pythona o nazwieast
.ast.literal_eval()
oceni tylko łańcuchy, które zamieniają się w podstawowe typy Pythona, więc nie ma możliwości, aby skomplikowany ciąg mógł zrobić coś złego na twoim komputerze.EDYTOWAĆ
Właściwie najlepszą praktyką w Pythonie jest użycie
with
instrukcji, aby upewnić się, że plik zostanie poprawnie zamknięty. Przepisanie powyższego nawith
oświadczenie:W najpopularniejszym Pythonie, znanym jako „CPython”, zwykle nie potrzebujesz
with
instrukcji, ponieważ wbudowane funkcje „usuwania elementów bezużytecznych” zorientują się, że skończyłeś z plikiem i zamkną go za Ciebie. Ale inne implementacje Pythona, takie jak „Jython” (Python dla maszyny wirtualnej Java) lub „PyPy” (naprawdę fajny system eksperymentalny z optymalizacją kodu w trybie just-in-time) mogą nie zamknąć pliku za Ciebie. Dobrze jest przyzwyczaić się do używaniawith
i myślę, że dzięki temu kod jest łatwy do zrozumienia.źródło
dict()
oczekuje słownika lub listy krotek. Nie oceni ciągu.Czy próbowałeś już modułu JSON ? Format JSON jest bardzo podobny do słownika Pythona. I jest czytelny / zapisywalny dla człowieka:
Ten kod zrzuca do pliku tekstowego
Możesz także załadować z pliku JSON:
źródło
with
oświadczeniu, aby upewnić się, że zostanie zamknięty po?d = {"one": {"1" : 1, "a": {"i"}}}
.). Dlatego polecam metodę marynowania @ blendera, która działa w moim przypadku.json.dump({1: 'one'}, file)
czyta z powrotem tak, jak{'1': 'one'}
podczas wykonywania json.load. Lepiej użyć pikle, jeśli nie zamierzasz czytać zapisanego pliku w innych językach niż Python.Aby przechowywać obiekty Pythona w plikach, użyj
pickle
modułu:Zauważ, że nigdy nie ustawiłem
b = a
, ale zamiast tego wytrawiłema
do pliku, a następnie rozpakowałem gob
.Co do twojego błędu:
self.whip
był obiektem słownikowym.deed.txt
zawiera tekst, więc po załadowaniu zawartoścideed.txt
doself.whip
,self.whip
staje się ciągową reprezentacją samego siebie.Prawdopodobnie chciałbyś przeliczyć ciąg z powrotem na obiekt Pythona:
Zwróć uwagę, jak
eval
brzmievil
. To jest zamierzone.pickle
Zamiast tego użyj modułu.źródło
Stworzyłem własne funkcje, które działają naprawdę fajnie:
Najpierw zapisze nazwę klucza, a po niej wszystkie wartości. Zauważ, że w tym przypadku moja dict zawiera liczby całkowite, dlatego jest konwertowana na
int
. Najprawdopodobniej jest to część, którą musisz zmienić w swojej sytuacji.źródło
Cześć, jest sposób na zapisanie i odczytanie słownika do pliku, w którym możesz zamienić słownik na format JSON oraz szybko czytać i pisać, po prostu zrób to:
Aby napisać datę:
i odczytać Twoje dane:
źródło
Możesz iterować przez parę klucz-wartość i zapisać ją do pliku
źródło