Saya merasa sangat sulit membaca file biner dengan Python. Bisakah Anda membantu saya? Saya perlu membaca file ini, yang di Fortran 90 mudah dibaca
int*4 n_particles, n_groups
real*4 group_id(n_particles)
read (*) n_particles, n_groups
read (*) (group_id(j),j=1,n_particles)
Secara detail, format file tersebut adalah:
Bytes 1-4 -- The integer 8.
Bytes 5-8 -- The number of particles, N.
Bytes 9-12 -- The number of groups.
Bytes 13-16 -- The integer 8.
Bytes 17-20 -- The integer 4*N.
Next many bytes -- The group ID numbers for all the particles.
Last 4 bytes -- The integer 4*N.
Bagaimana saya bisa membaca ini dengan Python? Saya mencoba segalanya tetapi tidak pernah berhasil. Apakah ada kemungkinan saya menggunakan program f90 dengan python, membaca file biner ini dan kemudian menyimpan data yang perlu saya gunakan?
fromfile
memudahkan untuk membaca file biner. Saya merekomendasikannya.Jawaban:
Baca konten file biner seperti ini:
lalu " keluarkan " data biner menggunakan struct.unpack :
Byte awal:
struct.unpack("iiiii", fileContent[:20])
Body: abaikan byte heading dan byte trailing (= 24); Bagian yang tersisa membentuk body, untuk mengetahui jumlah byte pada body lakukan pembagian integer sebanyak 4; Hasil bagi yang diperoleh dikalikan dengan string
'i'
untuk membuat format yang benar untuk metode unpack:Byte akhir:
struct.unpack("i", fileContent[-4:])
sumber
import struct
Secara umum, saya akan merekomendasikan Anda untuk menggunakan modul struct Python untuk ini. Ini standar dengan Python, dan seharusnya mudah untuk menerjemahkan spesifikasi pertanyaan Anda ke dalam string pemformatan yang sesuai
struct.unpack()
.Perhatikan bahwa jika ada padding "tak terlihat" di antara / sekitar bidang, Anda perlu mencari tahu dan memasukkannya ke dalam
unpack()
panggilan, atau Anda akan membaca bit yang salah.Membaca konten file untuk mendapatkan sesuatu untuk dibongkar cukup sepele:
Ini membongkar dua bidang pertama, dengan asumsi mereka mulai di awal file (tidak ada padding atau data asing), dan juga mengasumsikan urutan byte asli (
@
simbol). HurufI
s dalam string pemformatan berarti "unsigned integer, 32 bits".sumber
Anda dapat menggunakan
numpy.fromfile
, yang dapat membaca data dari teks dan file biner. Pertama-tama Anda akan membuat tipe data, yang mewakili format file Anda, menggunakannumpy.dtype
, lalu membaca tipe ini dari file menggunakannumpy.fromfile
.sumber
Untuk membaca file biner menjadi
bytes
objek:Untuk membuat
int
dari byte 0-3 data:Untuk mengekstrak beberapa
int
dari data:pathlib
int.from_bytes()
struct
sumber
Saya juga menemukan Python kurang dalam hal membaca dan menulis file biner, jadi saya menulis modul kecil (untuk Python 3.6+).
Dengan binaryfile Anda akan melakukan sesuatu seperti ini (saya menduga, karena saya tidak tahu Fortran):
Yang menghasilkan keluaran seperti ini:
Saya menggunakan skip () untuk melewati data tambahan yang ditambahkan Fortran, tetapi Anda mungkin ingin menambahkan utilitas untuk menangani catatan Fortran dengan benar. Jika Anda melakukannya, permintaan tarik akan diterima.
sumber
sumber
pickle.load
dimuat? Apakah itu memuat aliran Fortran, file langsung atau berurutan? Mereka berbeda dan tidak kompatibel.