Saya mencoba untuk menyimpan dan memuat objek menggunakan pickle
modul.
Pertama saya mendeklarasikan objek saya:
>>> class Fruits:pass
...
>>> banana = Fruits()
>>> banana.color = 'yellow'
>>> banana.value = 30
Setelah itu saya membuka file bernama 'Fruits.obj' (sebelumnya saya membuat file .txt baru dan saya mengganti nama 'Fruits.obj'):
>>> import pickle
>>> filehandler = open(b"Fruits.obj","wb")
>>> pickle.dump(banana,filehandler)
Setelah melakukan ini saya menutup sesi saya dan saya memulai yang baru dan saya meletakkan sesi berikutnya (mencoba mengakses ke objek yang seharusnya disimpan):
file = open("Fruits.obj",'r')
object_file = pickle.load(file)
Tapi saya punya pesan ini:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python31\lib\pickle.py", line 1365, in load
encoding=encoding, errors=errors).load()
ValueError: read() from the underlying stream did notreturn bytes
Saya tidak tahu harus berbuat apa karena saya tidak mengerti pesan ini. Adakah yang tahu Bagaimana saya bisa memuat objek saya 'banana'? Terima kasih!
EDIT: Seperti yang disarankan beberapa dari Anda, saya katakan:
>>> import pickle
>>> file = open("Fruits.obj",'rb')
Tidak ada masalah, tapi yang saya taruh selanjutnya adalah:
>>> object_file = pickle.load(file)
Dan saya mengalami kesalahan:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python31\lib\pickle.py", line 1365, in load
encoding=encoding, errors=errors).load()
EOFError
Jawaban:
Adapun masalah kedua Anda:
Setelah Anda membaca konten file, penunjuk file akan berada di akhir file - tidak akan ada data lebih lanjut untuk dibaca. Anda harus memundurkan file agar dapat dibaca dari awal lagi:
Apa yang biasanya ingin Anda lakukan adalah menggunakan pengelola konteks untuk membuka file dan membaca data darinya. Dengan cara ini, file akan secara otomatis ditutup setelah blok selesai dieksekusi, yang juga akan membantu Anda mengatur operasi file Anda menjadi potongan yang berarti.
Akhirnya, cPickle adalah implementasi yang lebih cepat dari modul acar di C. Jadi:
sumber
{"a": 1, "b": 2}
membuat kamus dengan tombol"a"
dan"b"
di dalamnya. Ini disebut ekspresi tampilan kamus dalam dokumentasi online. Ini hanyalah salah satu dari beberapa cara berbeda sebuah objek bertipedict
, yang merupakan salah satu dari beberapa tipe data bawaan standar yang tersedia dengan Python, dapat dibangun.pickle
yang akan mengimporcpickle
secara otomatis jika bisa. docs.python.org/3.1/whatsnew/3.0.html#library-changesPekerjaan berikut untuk saya:
sumber
class Fruits
ditentukan sehinggapickle.load()
dapat menyusun kembali objek dari data yang disimpan di file biner. Praktik terbaik untuk hal semacam ini adalah dengan meletakkanclass Fruits
definisi dalam file .py terpisah (menjadikannya modul kustom) dan kemudianimport
modul atau item darinya kapan pun diperlukan (yaitu, kedua sesi). Misalnya jika Anda memasukkannya ke dalam file bernamaMyDataDefs.py
maka Anda bisa menulisfrom MyDataDefs import Fruits
. Beri tahu saya jika ini tidak jelas dan saya akan memperbarui jawaban saya sesuai dengan itu.my_data_defs.py
usingfrom my_data_defs import Fruits
.Anda juga lupa membacanya sebagai biner.
Di bagian menulis Anda, Anda memiliki:
Di bagian baca Anda memiliki:
Jadi gantilah dengan:
Dan itu akan berhasil :)
Adapun kesalahan kedua Anda, kemungkinan besar disebabkan oleh tidak menutup / menyinkronkan file dengan benar.
Coba sedikit kode ini untuk menulis:
Dan ini (tidak berubah) untuk dibaca:
Versi yang lebih rapi akan menggunakan
with
pernyataan tersebut.Untuk menulis:
Untuk dibaca:
sumber
Selalu buka dalam mode biner, dalam hal ini
sumber
Anda tidak membuka file dalam mode biner.
Harus bekerja.
Untuk kesalahan kedua Anda, file kemungkinan besar kosong, yang berarti Anda tidak sengaja mengosongkannya atau menggunakan nama file yang salah atau semacamnya.
(Ini dengan asumsi Anda benar-benar menutup sesi Anda. Jika tidak, maka itu karena Anda tidak menutup file antara tulis dan baca).
Saya menguji kode Anda, dan berhasil.
sumber
Sepertinya Anda ingin menyimpan instance kelas Anda di seluruh sesi, dan menggunakan
pickle
adalah cara yang tepat untuk melakukan ini. Namun, ada paket bernamaklepto
yang mengabstraksi penyimpanan objek ke antarmuka kamus, sehingga Anda bisa memilih untuk mengambil objek dan menyimpannya ke file (seperti yang diperlihatkan di bawah), atau mengacak objek dan menyimpannya ke database, atau sebagai ganti gunakan acar, gunakan json, atau banyak pilihan lainnya. Hal yang menyenangkan tentangklepto
ini adalah dengan mengabstraksi ke antarmuka umum, itu membuatnya mudah sehingga Anda tidak perlu mengingat detail tingkat rendah tentang cara menyimpan melalui pengawetan ke file, atau sebaliknya.Perhatikan bahwa Ini berfungsi untuk atribut kelas yang ditambahkan secara dinamis, yang tidak dapat dilakukan oleh acar ...
Lalu kita restart…
Klepto
bekerja pada python2 dan python3.Dapatkan kodenya di sini: https://github.com/uqfoundation
sumber
Anda dapat menggunakan anycache untuk melakukan pekerjaan itu untuk Anda. Dengan asumsi Anda memiliki fungsi
myfunc
yang membuat instance:Anycache memanggil
myfunc
pertama kali dan mengambil hasilnya ke file dengancachedir
menggunakan pengenal unik (tergantung pada nama fungsi dan argumen) sebagai nama file. Pada proses yang berurutan, objek acar dimuat.Jika
cachedir
dipertahankan antara proses python, objek acar diambil dari proses python sebelumnya.Argumen fungsi juga diperhitungkan. Implementasi yang direfraktor berfungsi juga:
sumber