Saya memiliki daftar byte sebagai integer, yang kira-kira seperti
[120, 3, 255, 0, 100]
Bagaimana cara menulis daftar ini ke file sebagai biner?
Apakah ini akan berhasil?
newFileBytes = [123, 3, 255, 0, 100]
# make file
newFile = open("filename.txt", "wb")
# write to file
newFile.write(newFileBytes)
TypeError: argument 1 must be string or buffer, not list
.Jawaban:
Inilah tepatnya
bytearray
untuk:Jika Anda menggunakan Python 3.x, Anda dapat menggunakan
bytes
sebagai gantinya (dan mungkin harus, karena ini menandakan niat Anda lebih baik). Tetapi di Python 2.x, itu tidak akan berfungsi, karenabytes
hanya alias untukstr
. Seperti biasa, menunjukkan dengan interpreter interaktif lebih mudah daripada menjelaskan dengan teks, jadi izinkan saya melakukannya.Python 3.x:
Python 2.x:
sumber
str.encode
danstruct.pack
jika Anda perlu bekerja pada 2.2. Tapi 2.6 telah keluar selama 5 tahun sekarang; ketiga LTS Ubuntu masih mendukung, ketiga versi OS X mendukung, versi utama sebelumnya dari CentOS / RHEL, dll., semuanya disertakan dengan bawaannya. Jika Anda perlu mendukung 2.5 atau 2.1 atau 1.6 atau apa pun, Anda mungkin tahu…bytearray
masih dikonversi\n
ke\r\n
, sehingga tidak memuaskan untuk data biner, jika tanda "b" tidak dilewatkan saat membuka file.\r\n
fiturnya adalah bagian dari opsi baris baru universal untuk teks.)Gunakan
struct.pack
untuk mengonversi nilai integer menjadi byte biner, lalu tulis byte tersebut. MisalnyaNamun saya tidak akan pernah memberikan
.txt
ekstensi file biner .Manfaat dari metode ini adalah dapat digunakan untuk jenis lain juga, misalnya jika ada nilai yang lebih besar dari 255, Anda dapat menggunakan
'5i'
format untuk mendapatkan bilangan bulat 32-bit penuh.sumber
Untuk mengonversi dari bilangan bulat <256 ke biner, gunakan
chr
fungsi. Jadi, Anda sedang berusaha melakukan hal berikut.sumber
charmap
bukanascii
, dan bekerja di python2 serta python3. Theascii
encoding hanya bekerja di python2.Mulai Python 3.2+, Anda juga dapat melakukannya menggunakan
to_bytes
metode int asli:Yaitu, setiap panggilan tunggal
to_bytes
dalam hal ini membuat string dengan panjang 1, dengan karakternya diatur dalam urutan big-endian (yang sepele untuk string panjang-1), yang mewakili nilai integerbyte
. Anda juga dapat mempersingkat dua baris terakhir menjadi satu:sumber
Anda dapat menggunakan contoh kode berikut menggunakan sintaks Python 3:
Ini shell one-liner:
sumber
Gunakan acar, seperti ini: import acar
Kode Anda akan terlihat seperti ini:
Untuk membaca kembali data, gunakan metode pickle.load
sumber