Saya mencoba menulis kamus ke file txt. Kemudian baca nilai dict dengan mengetikkan kunci dengan raw_input
. Saya merasa seperti saya hanya melewatkan satu langkah tetapi saya telah mencari beberapa saat sekarang.
Saya mendapatkan kesalahan ini
File "name.py", line 24, in reading
print whip[name]
TypeError: string indices must be integers, not str
Kode saya:
#!/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 harus merupakan turunan dari kelas PersonJawaban:
Kode Anda hampir benar ! Anda benar, Anda hanya melewatkan satu langkah. Saat Anda membaca di file, Anda membacanya sebagai string; tetapi Anda ingin mengubah string itu kembali menjadi kamus.
Pesan kesalahan yang Anda lihat adalah karena
self.whip
merupakan string, bukan kamus.Saya pertama kali menulis bahwa Anda bisa memberi makan string ke dalam
dict()
tetapi itu tidak berhasil! Anda perlu melakukan sesuatu yang lain.Contoh
Inilah cara termudah: masukkan string ke dalam
eval()
. Seperti:Anda dapat melakukannya dalam satu baris, tetapi menurut saya akan terlihat berantakan seperti ini:
Namun
eval()
terkadang tidak disarankan. Masalahnya adalah itueval()
akan mengevaluasi string apa pun , dan jika seseorang menipu Anda untuk menjalankan string yang sangat rumit, sesuatu yang buruk mungkin terjadi. Dalam hal ini, Anda hanya menjalankaneval()
file Anda sendiri, jadi tidak masalah.Tetapi karena
eval()
bermanfaat, seseorang membuat alternatif yang lebih aman. Ini disebutliteral_eval
dan Anda mendapatkannya dari modul Python yang disebutast
.ast.literal_eval()
hanya akan mengevaluasi string yang berubah menjadi jenis Python dasar, jadi tidak mungkin string yang rumit dapat melakukan sesuatu yang buruk di komputer Anda.EDIT
Sebenarnya, praktik terbaik dalam Python adalah menggunakan
with
pernyataan untuk memastikan file ditutup dengan benar. Menulis ulang hal di atas untuk menggunakanwith
pernyataan:Di Python paling populer, yang dikenal sebagai "CPython", Anda biasanya tidak memerlukan
with
pernyataan karena fitur "pengumpulan sampah" bawaan akan mengetahui bahwa Anda telah selesai dengan file tersebut dan akan menutupnya untuk Anda. Tetapi implementasi Python lainnya, seperti "Jython" (Python untuk Java VM) atau "PyPy" (sistem eksperimental yang sangat keren dengan pengoptimalan kode just-in-time) mungkin tidak berhasil menutup file untuk Anda. Itu bagus untuk membiasakan diri menggunakanwith
, dan menurut saya itu membuat kode cukup mudah dimengerti.sumber
dict()
mengharapkan kamus atau daftar tupel. Itu tidak akan mengevaluasi string.Sudahkah Anda mencoba modul json ? Format JSON sangat mirip dengan kamus python. Dan itu bisa dibaca / ditulis manusia:
Kode ini dibuang ke file teks
Anda juga dapat memuat dari file JSON:
sumber
with
pernyataan untuk memastikannya ditutup setelahnya?d = {"one": {"1" : 1, "a": {"i"}}}
). Oleh karena itu, saya merekomendasikan metode acar @ blender yang berfungsi dalam kasus saya.json.dump({1: 'one'}, file)
akan membaca kembali seperti{'1': 'one'}
saat melakukan json.load. Lebih baik menggunakan acar jika Anda tidak akan membaca file yang disimpan menggunakan bahasa lain selain Python.Untuk menyimpan objek Python dalam file, gunakan
pickle
modul:Perhatikan bahwa saya tidak pernah mengatur
b = a
, tetapi malah menjadi acara
ke file dan kemudian membukanya menjadib
.Adapun kesalahan Anda:
self.whip
adalah objek kamus.deed.txt
berisi teks, jadi saat Anda memuat kontendeed.txt
keself.whip
,self.whip
menjadi representasi string itu sendiri.Anda mungkin ingin mengevaluasi string kembali menjadi objek Python:
Perhatikan bagaimana
eval
suaranyaevil
. Itu disengaja. Gunakanpickle
modul sebagai gantinya.sumber
Saya membuat fungsi saya sendiri yang bekerja dengan sangat baik:
Ini akan menyimpan nama kunci terlebih dahulu, diikuti oleh semua nilai. Perhatikan bahwa dalam kasus ini dict saya berisi bilangan bulat jadi itulah mengapa itu diubah menjadi
int
. Kemungkinan besar ini adalah bagian yang perlu Anda ubah untuk situasi Anda.sumber
Hai ada cara untuk menulis dan membaca kamus ke file Anda dapat mengubah kamus Anda ke format JSON dan membaca dan menulis dengan cepat lakukan ini:
Untuk menulis tanggal Anda:
dan untuk membaca data Anda:
sumber
Anda dapat melakukan iterasi melalui key-value pair dan menuliskannya ke dalam file
sumber