Hướng dẫn python write array to binary file - python ghi mảng vào tệp nhị phân

"Câu trả lời" của tôi thực sự là một nhận xét về các câu trả lời khác nhau. Tôi không thể bình luận vì tôi không có 50 danh tiếng.

Nếu tệp được đọc lại bởi Python, thì hãy sử dụng mô -đun "Pickle". Một công cụ này có thể đọc và viết nhiều thứ bằng nhị phân.

Nhưng cách đặt câu hỏi, nói rằng "mã hóa 32 bit của IEEE", có vẻ như tệp sẽ được đọc lại bằng các ngôn ngữ khác. Trong trường hợp đó, thứ tự byte nên được chỉ định. Vấn đề là hầu hết các máy là x86, với đơn đặt hàng byte ít, nhưng ngôn ngữ xử lý dữ liệu số một là Java/JVM, sử dụng thứ tự byte lớn. Vì vậy, python "tofile []" sẽ sử dụng C, sử dụng Little Endian do máy ít endian, và sau đó mã xử lý dữ liệu trên Java/JVM sẽ giải mã bằng cách sử dụng Big Endian, dẫn đến lỗi.

Để làm việc với JVM:

# convert to bytes, BIG endian, for use by Java
import struct
f = [3.14, 2.7, 0.0, -1.0, 1.1]
b = struct.pack['>'+'f'*len[f], *f]

with open["f.bin", "wb"] as file:
    file.write[b]

Về phía Java:

try[var stream = new DataInputStream[new FileInputStream["f.bin"]]]
{
    for[int i = 0; i < 5; i++]
        System.out.println[stream.readFloat[]];
}
catch[Exception ex] {}

Vấn đề bây giờ là mã Python 'f'*len[f] - hy vọng trình thông dịch không thực sự tạo ra chuỗi "ffffff ..." siêu dài.

Tôi sẽ sử dụng mảng và byte numpy

import numpy, sys
f = numpy.array[[3.14, 2.7, 0.0, -1.0, 1.1], dtype=numpy.float32]

if sys.byteorder == "little":
    f.byteswap[].tofile["f.bin"] # using BIG endian, for use by Java
else:
    f.tofile["f.bin"]

phương pháp

ndarray.tofile [fid, sep = '', format = '%s']#tofile[fid, sep='', format='%s']#

Viết mảng vào một tệp dưới dạng văn bản hoặc nhị phân [mặc định].

Dữ liệu luôn được viết theo thứ tự C, độc lập với thứ tự của a. Dữ liệu được tạo bởi phương pháp này có thể được khôi phục bằng hàm từ fromfile [].

Tham sốfidfile hoặc str hoặc đường dẫnfidfile or str or Path

Một đối tượng tệp mở hoặc một chuỗi chứa tên tệp.

Đã thay đổi trong phiên bản 1.17.0: pathlib.Path đối tượng hiện được chấp nhận.pathlib.Path objects are now accepted.

SEPPTRstr

Phân tách giữa các mục mảng cho đầu ra văn bản. Nếu có nghĩa là [trống], một tệp nhị phân được viết, tương đương với file.write[a.tobytes[]].

Định dạngstr

Chuỗi định dạng cho đầu ra tệp văn bản. Mỗi mục trong mảng được định dạng thành văn bản bằng cách trước tiên chuyển đổi nó sang loại python gần nhất, sau đó sử dụng mục định định định dạng của định dạng.

Ghi chú

Đây là một chức năng tiện lợi để lưu trữ nhanh dữ liệu mảng. Thông tin về độ chính xác và độ chính xác bị mất, vì vậy phương pháp này không phải là một lựa chọn tốt cho các tệp nhằm lưu trữ dữ liệu hoặc dữ liệu vận chuyển giữa các máy có độ cuối khác nhau. Một số vấn đề này có thể được khắc phục bằng cách xuất dữ liệu dưới dạng tệp văn bản, với chi phí tốc độ và kích thước tệp.

Khi FID là một đối tượng tệp, nội dung mảng được ghi trực tiếp vào tệp, bỏ qua phương thức đối tượng tệp ____ ____. Do đó, TOFILE không thể được sử dụng với các đối tượng tệp hỗ trợ nén [ví dụ: gzipfile] hoặc các đối tượng giống như tệp không hỗ trợ fileno[] [ví dụ: byteo].

Các tệp "nhị phân" là bất kỳ tệp nào trong đó định dạng không được tạo thành từ các ký tự có thể đọc được. Các tệp nhị phân có thể bao gồm từ các tệp hình ảnh như JPEG hoặc GIF, tệp âm thanh như mp3 hoặc định dạng tài liệu nhị phân như Word hoặc PDF. Trong Python, các tệp được mở ở chế độ văn bản theo mặc định. Để mở các tệp ở chế độ nhị phân, khi chỉ định chế độ, hãy thêm 'B' vào nó.

Ví dụ

f = open['my_file', 'w+b']
byte_arr = [120, 3, 255, 0, 100]
binary_format = bytearray[byte_arr]
f.write[binary_format]
f.close[]

Điều này mở một tệp trong chế độ ghi nhị phân và ghi nội dung mảng byte_arr dưới dạng byte trong tệp nhị phân, my_file.

Cập nhật vào ngày 13 tháng 12 năm 2019 10:31:33

  • Câu hỏi và câu trả lời liên quan
  • Python - Viết dữ liệu nhiều tệp vào tệp chính
  • Làm thế nào để mở một tệp nhị phân ở chế độ đọc và ghi với Python?
  • Làm thế nào để viết một dòng trong tệp văn bản bằng Python?
  • Làm thế nào để ghi vào một tệp từ dòng lệnh bằng Python?
  • Làm thế nào để mở một tệp để viết bằng Python?
  • Làm thế nào để ghi dữ liệu vào tệp .csv trong java?
  • Làm thế nào để đổ một tệp nhị phân vào nhiều tệp bằng Python?
  • Làm thế nào để viết một hình ảnh vào một tệp bằng OpenCV?
  • Làm thế nào để viết nhiều dòng trong tệp văn bản bằng Python?
  • Cách viết/tạo tệp JSON bằng Java?
  • Làm thế nào để đọc và viết một tệp bằng JavaScript?
  • Python - Cách viết Pandas DataFrame vào tệp CSV
  • Viết dữ liệu từ/đến tệp .csv trong java
  • Đọc/ghi cấu trúc vào một tệp bằng C
  • Làm thế nào để đọc/ghi dữ liệu từ/đến .properies trong java?

Bài Viết Liên Quan

Chủ Đề