Hướng dẫn python read entire binary file - python đọc toàn bộ tệp nhị phân

Tôi cũng thấy Python thiếu khi đọc và viết các tệp nhị phân, vì vậy tôi đã viết một mô -đun nhỏ (cho Python 3.6+).

Với BinaryFile, bạn sẽ làm điều gì đó như thế này (tôi đoán, vì tôi không biết Fortran):

import binaryfile

def particle_file(f):
    f.array('group_ids')  # Declare group_ids to be an array (so we can use it in a loop)
    f.skip(4)  # Bytes 1-4
    num_particles = f.count('num_particles', 'group_ids', 4)  # Bytes 5-8
    f.int('num_groups', 4)  # Bytes 9-12
    f.skip(8)  # Bytes 13-20
    for i in range(num_particles):
        f.struct('group_ids', '>f')  # 4 bytes x num_particles
    f.skip(4)

with open('myfile.bin', 'rb') as fh:
    result = binaryfile.read(fh, particle_file)
print(result)

Trong đó tạo ra một đầu ra như thế này:

{
    'group_ids': [(1.0,), (0.0,), (2.0,), (0.0,), (1.0,)],
    '__skipped': [b'\x00\x00\x00\x08', b'\x00\x00\x00\x08\x00\x00\x00\x14', b'\x00\x00\x00\x14'],
    'num_particles': 5,
    'num_groups': 3
}

Tôi đã sử dụng Skip () để bỏ qua dữ liệu bổ sung Fortran cho biết thêm, nhưng bạn có thể muốn thêm một tiện ích để xử lý các bản ghi Fortran đúng cách thay thế. Nếu bạn làm như vậy, một yêu cầu kéo sẽ được chào đón.

Hướng dẫn python read entire binary file - python đọc toàn bộ tệp nhị phân

Nadiam0 đăng chuyên nghiệp trong đào tạo 0 Posting Pro in Training

4 năm trước

Được chứ. Tôi vừa tìm thấy

{
    'group_ids': [(1.0,), (0.0,), (2.0,), (0.0,), (1.0,)],
    '__skipped': [b'\x00\x00\x00\x08', b'\x00\x00\x00\x08\x00\x00\x00\x14', b'\x00\x00\x00\x14'],
    'num_particles': 5,
    'num_groups': 3
}
4 đã hoàn thành mục tiêu của mình bằng cách:

with open("portrait1.dng", "rb") as binaryfile :
    myArr = bytearray(binaryfile.read())

with open("readfile.raw", "wb") as newFile:
    newFile.write(myArr)

Nhưng các câu hỏi của tôi vẫn là đứng bởi vì như tôi đã đề cập đến tệp hiện tại, tôi đang thử nghiệm chỉ là 16,2MB và tệp thực sẽ được sử dụng là 8GB và tôi đã kiểm tra mã này với tệp khổng lồ và máy tính xách tay của tôi bị đóng băng. Vì vậy, một vài câu hỏi/suy nghĩ được cập nhật:

  1. Đọc và viết rõ ràng hoạt động nhưng hoạt động nào sử dụng hầu hết RAM? Vì một trong những lý do tại sao máy tính xách tay của tôi bị đóng băng. Có cách nào để giảm tải đó không? Coz Tôi không thể tiếp tục thử nghiệm và đóng băng máy tính xách tay của mình, điều đó chắc chắn không lành mạnh cho nó. Toàn bộ cuộc sống đại học của tôi là về điều này (dịch thuật, nếu nó chết tôi chết).

  2. Có cách nào tốt hơn để đọc tệp không? Giống như phần từng phần có lẽ? Làm thế nào mà đạt được? Bởi vì tôi không thực sự cần ghi, bài viết chỉ để tôi thấy rằng tệp được đọc hoàn toàn. Tôi cần đọc cho các quy trình khác.

Hướng dẫn python read entire binary file - python đọc toàn bộ tệp nhị phân

GRIBOUILLIS1.391 LUẬT SƯ 1,391 Programming Explorer Team Colleague

4 năm trước

Đọc tệp của các đoạn và cũng viết các đoạn:

with open("portrait1.dng", "rb") as binaryfile :
    with open("readfile.raw", "wb") as newFile:
        while True:
            chunk = binaryfile.read(4096)
            if not chunk:
                break
            newFile.write(binascii.hexlify(chunk))

Toàn bộ cuộc sống đại học của tôi là về điều này (dịch thuật, nếu nó chết tôi chết).

Đảm bảo bạn sao lưu các tệp của bạn thường xuyên trên một đĩa riêng.

Được chỉnh sửa 4 năm trước bởi Gribouillis

Đăng nhập vào tài khoản Python Barsels của bạn để lưu cài đặt screencast của bạn.

Vẫn chưa có tài khoản? Đăng ký tại đây.

Điều gì sẽ xảy ra nếu bạn muốn đọc từ một tệp không phải là một tệp văn bản?read from a file that isn't a text file?

Cách đọc tệp nhị phân trong Python

Nếu chúng ta cố gắng đọc một tệp zip bằng hàm

{
    'group_ids': [(1.0,), (0.0,), (2.0,), (0.0,), (1.0,)],
    '__skipped': [b'\x00\x00\x00\x08', b'\x00\x00\x00\x08\x00\x00\x00\x14', b'\x00\x00\x00\x14'],
    'num_particles': 5,
    'num_groups': 3
}
5 tích hợp trong Python bằng chế độ đọc mặc định, chúng ta sẽ gặp lỗi:we'll get an error:

>>> with open("exercises.zip") as zip_file:
...     contents = zip_file.read()
...
Traceback (most recent call last):
  File "", line 2, in 
  File "/usr/lib/python3.10/codecs.py", line 322, in de
code
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8e in position 11: invalid sta
rt byte

Chúng tôi gặp lỗi vì các tệp zip không phải là tệp văn bản, chúng là các tệp nhị phân.binary files.

Để đọc từ một tệp nhị phân, chúng ta cần mở nó với chế độ

{
    'group_ids': [(1.0,), (0.0,), (2.0,), (0.0,), (1.0,)],
    '__skipped': [b'\x00\x00\x00\x08', b'\x00\x00\x00\x08\x00\x00\x00\x14', b'\x00\x00\x00\x14'],
    'num_particles': 5,
    'num_groups': 3
}
6 thay vì chế độ mặc định của
{
    'group_ids': [(1.0,), (0.0,), (2.0,), (0.0,), (1.0,)],
    '__skipped': [b'\x00\x00\x00\x08', b'\x00\x00\x00\x08\x00\x00\x00\x14', b'\x00\x00\x00\x14'],
    'num_particles': 5,
    'num_groups': 3
}
7:mode
{
    'group_ids': [(1.0,), (0.0,), (2.0,), (0.0,), (1.0,)],
    '__skipped': [b'\x00\x00\x00\x08', b'\x00\x00\x00\x08\x00\x00\x00\x14', b'\x00\x00\x00\x14'],
    'num_particles': 5,
    'num_groups': 3
}
6 instead of the default mode of
{
    'group_ids': [(1.0,), (0.0,), (2.0,), (0.0,), (1.0,)],
    '__skipped': [b'\x00\x00\x00\x08', b'\x00\x00\x00\x08\x00\x00\x00\x14', b'\x00\x00\x00\x14'],
    'num_particles': 5,
    'num_groups': 3
}
7
:

>>> with open("exercises.zip", mode="rb") as zip_file:
...     contents = zip_file.read()
...

Khi bạn đọc từ một tệp nhị phân, bạn sẽ không lấy lại chuỗi. Bạn sẽ nhận lại một đối tượng

{
    'group_ids': [(1.0,), (0.0,), (2.0,), (0.0,), (1.0,)],
    '__skipped': [b'\x00\x00\x00\x08', b'\x00\x00\x00\x08\x00\x00\x00\x14', b'\x00\x00\x00\x14'],
    'num_particles': 5,
    'num_groups': 3
}
8, còn được gọi là chuỗi byte:byte string:

>>> with open("exercises.zip", mode="rb") as zip_file:
...     contents = zip_file.read()
...
>>> type(contents)

>>> contents[:20]
b'PK\x03\x04\n\x00\x00\x00\x00\x00Y\x8e\x84T\x00\x00\x00\x00\x00\x00'

Chuỗi byte không có ký tự trong đó: họ có byte trong đó.: they have bytes in them.

Các byte trong một tập tin sẽ không giúp chúng tôi rất nhiều trừ khi chúng tôi hiểu ý nghĩa của chúng.

Sử dụng thư viện để đọc tệp nhị phân của bạn

Bạn có thể sẽ không đọc một tập tin nhị phân rất thường xuyên.

Khi làm việc với các tệp nhị phân, bạn thường sử dụng thư viện (thư viện Python tích hợp hoặc thư viện của bên thứ ba) biết cách xử lý loại tệp cụ thể mà bạn đang làm việc. Thư viện đó sẽ thực hiện công việc giải mã các byte từ tệp của bạn thành một cái gì đó dễ làm việc hơn.

Ví dụ: mô -đun

{
    'group_ids': [(1.0,), (0.0,), (2.0,), (0.0,), (1.0,)],
    '__skipped': [b'\x00\x00\x00\x08', b'\x00\x00\x00\x08\x00\x00\x00\x14', b'\x00\x00\x00\x14'],
    'num_particles': 5,
    'num_groups': 3
}
9 của Python có thể giúp chúng tôi đọc dữ liệu trong tệp zip:

>>> from zipfile import ZipFile
>>>
>>> with ZipFile("exercises.zip") as zip_file:
...     test_file = zip_file.read("exercises/test.py").decode("utf-8")
...
>>> test_file[:30]
'#!/usr/bin/env python3\nfrom __'

Tốt nhất là tránh thực hiện logic kiểm tra byte hoặc kiểm tra byte của riêng bạn nếu ai đó đã thực hiện công việc đó cho bạn.avoid implementing your own byte-checking or byte manipulation logic if someone has already done that work for you.

Làm việc ở cấp độ byte trong Python

Đôi khi bạn sẽ làm việc với thư viện hoặc API yêu cầu bạn phải làm việc trực tiếp ở cấp độ byte. Trong trường hợp đó, bạn sẽ muốn có ít nhất một chút quen thuộc với các tệp nhị phân và chuỗi byte.

Ví dụ: giả sử chúng tôi muốn tính toán

with open("portrait1.dng", "rb") as binaryfile :
    myArr = bytearray(binaryfile.read())

with open("readfile.raw", "wb") as newFile:
    newFile.write(myArr)
0
with open("portrait1.dng", "rb") as binaryfile :
    myArr = bytearray(binaryfile.read())

with open("readfile.raw", "wb") as newFile:
    newFile.write(myArr)
1 của một tệp đã cho.

Ở đây chúng tôi có một chức năng gọi là

with open("portrait1.dng", "rb") as binaryfile :
    myArr = bytearray(binaryfile.read())

with open("readfile.raw", "wb") as newFile:
    newFile.write(myArr)
2 làm điều đó:

import hashlib


def get_sha256_hash(filename):
    with open(filename, mode="rb") as f:
        return hashlib.sha256(f.read()).hexdigest()

Hàm này đọc tất cả các dữ liệu nhị phân trong tệp này. Chúng tôi đang đọc byte vì mô -đun

with open("portrait1.dng", "rb") as binaryfile :
    myArr = bytearray(binaryfile.read())

with open("readfile.raw", "wb") as newFile:
    newFile.write(myArr)
3 của Python yêu cầu chúng tôi làm việc với các byte. Mô-đun
with open("portrait1.dng", "rb") as binaryfile :
    myArr = bytearray(binaryfile.read())

with open("readfile.raw", "wb") as newFile:
    newFile.write(myArr)
3 hoạt động ở cấp độ thấp: nó hoạt động với
{
    'group_ids': [(1.0,), (0.0,), (2.0,), (0.0,), (1.0,)],
    '__skipped': [b'\x00\x00\x00\x08', b'\x00\x00\x00\x08\x00\x00\x00\x14', b'\x00\x00\x00\x14'],
    'num_particles': 5,
    'num_groups': 3
}
8 thay vì với các chuỗi.

Vì vậy, chúng tôi sẽ chuyển tất cả các byte trong tệp của chúng tôi để có một đối tượng băm và sau đó gọi phương thức

with open("portrait1.dng", "rb") as binaryfile :
    myArr = bytearray(binaryfile.read())

with open("readfile.raw", "wb") as newFile:
    newFile.write(myArr)
6 trên đối tượng băm đó để có được một chuỗi các ký tự thập lục phân đại diện cho tổng kiểm tra SHA-256 của tệp này:

>>> get_sha256_hash("exercises.zip")
'9e98242a21760945ec815668fc79d8621fa15dd23659ea29be2c5949153fe96d'

Chức năng này hoạt động tốt, nhưng đọc các tệp rất lớn với chức năng này có thể là một vấn đề.

Đọc các tệp nhị phân trong các khối

Hàm

with open("portrait1.dng", "rb") as binaryfile :
    myArr = bytearray(binaryfile.read())

with open("readfile.raw", "wb") as newFile:
    newFile.write(myArr)
2 của chúng tôi đọc toàn bộ tệp vào bộ nhớ cùng một lúc. Với một tập tin thực sự lớn có thể chiếm rất nhiều bộ nhớ.the whole file into memory all at once. With a really big file that might take up a lot of memory.

Với một tệp văn bản, cách thông thường để giải quyết vấn đề này sẽ là đọc từng dòng tệp. Nhưng các tập tin nhị phân không nhất thiết phải có dòng! Thay vào đó, chúng ta có thể cố gắng đọc Chunk của Chunk.binary files don't necessarily have lines! Instead, we could try to read chunk by chunk.

Đầu tiên chúng tôi sẽ đọc một đoạn tám kilobyte từ tập tin của chúng tôi:

{
    'group_ids': [(1.0,), (0.0,), (2.0,), (0.0,), (1.0,)],
    '__skipped': [b'\x00\x00\x00\x08', b'\x00\x00\x00\x08\x00\x00\x00\x14', b'\x00\x00\x00\x14'],
    'num_particles': 5,
    'num_groups': 3
}
0

Chúng tôi tạo một đối tượng băm mới trước và sau đó đọc một đoạn tám kilobyte (bằng cách chuyển số byte cho phương thức

with open("portrait1.dng", "rb") as binaryfile :
    myArr = bytearray(binaryfile.read())

with open("readfile.raw", "wb") as newFile:
    newFile.write(myArr)
8 của đối tượng tệp của chúng tôi).

Bây giờ chúng tôi cần phần còn lại của các phần của tập tin của chúng tôi. Vì vậy, chúng tôi sẽ lặp:

{
    'group_ids': [(1.0,), (0.0,), (2.0,), (0.0,), (1.0,)],
    '__skipped': [b'\x00\x00\x00\x08', b'\x00\x00\x00\x08\x00\x00\x00\x14', b'\x00\x00\x00\x14'],
    'num_particles': 5,
    'num_groups': 3
}
1

Chúng tôi liên tục đọc một đoạn, cập nhật đối tượng băm của chúng tôi, và sau đó đọc một đoạn khác.

Miễn là chúng tôi không ở cuối tập tin của chúng tôi, chúng tôi sẽ lấy lại một sự thật khi chúng tôi đọc.

Nhưng khi chúng tôi đọc ở cuối tệp của chúng tôi, chúng tôi sẽ lấy lại một chuỗi byte trống. Chuỗi byte trống (như chuỗi trống) là giả, vì vậy ở cuối tập tin của chúng tôi, chúng tôi sẽ thoát ra khỏi vòng lặp của chúng tôi. Sau đó, chúng tôi sẽ trả lại

with open("portrait1.dng", "rb") as binaryfile :
    myArr = bytearray(binaryfile.read())

with open("readfile.raw", "wb") as newFile:
    newFile.write(myArr)
6 giống như chúng tôi đã làm trước đây.

Hàm

with open("portrait1.dng", "rb") as binaryfile :
    myArr = bytearray(binaryfile.read())

with open("readfile.raw", "wb") as newFile:
    newFile.write(myArr)
2 đã được sửa đổi này hoạt động như trước:

{
    'group_ids': [(1.0,), (0.0,), (2.0,), (0.0,), (1.0,)],
    '__skipped': [b'\x00\x00\x00\x08', b'\x00\x00\x00\x08\x00\x00\x00\x14', b'\x00\x00\x00\x14'],
    'num_particles': 5,
    'num_groups': 3
}
2

Nhưng thay vì đọc toàn bộ tệp của chúng tôi vào bộ nhớ, giờ đây chúng tôi đang đọc tệp chunk-by-chunk của chúng tôi.reading our file chunk-by-chunk.

Bên cạnh: sử dụng biểu thức gán

Thông thường để xem biểu thức gán được sử dụng (thông qua toán tử Walrus của Python) khi đọc các tệp chunk-by-chunk:assignment expression used (via Python's walrus operator) when reading files chunk-by-chunk:

{
    'group_ids': [(1.0,), (0.0,), (2.0,), (0.0,), (1.0,)],
    '__skipped': [b'\x00\x00\x00\x08', b'\x00\x00\x00\x08\x00\x00\x00\x14', b'\x00\x00\x00\x14'],
    'num_particles': 5,
    'num_groups': 3
}
3

Việc đọc dữ liệu liên tục trong vòng lặp

with open("portrait1.dng", "rb") as binaryfile :
    with open("readfile.raw", "wb") as newFile:
        while True:
            chunk = binaryfile.read(4096)
            if not chunk:
                break
            newFile.write(binascii.hexlify(chunk))
1 là một trường hợp sử dụng khá tốt cho biểu thức gán. Nó có thể trông hơi kỳ lạ, nhưng nó tiết kiệm cho chúng ta một vài dòng mã.it does save us a few lines of code.

Người vận hành Walrus đã được thêm vào trong Python 3,8.

Bản tóm tắt

Khi bạn đọc một tệp nhị phân trong Python, bạn sẽ nhận lại byte.you'll get back bytes.

Khi bạn đang đọc một tệp nhị phân lớn, có lẽ bạn sẽ muốn đọc nó theo chunk.read it chunk-by-chunk.

Nhưng tốt nhất là tránh tự đọc các tệp nhị phân nếu bạn có thể. Nếu có thư viện của bên thứ ba có thể giúp bạn xử lý tệp nhị phân của mình, có lẽ bạn nên sử dụng thư viện đó để thực hiện xử lý dựa trên byte cho bạn.avoid reading binary files yourself if you can. If there's a third-party library that can help you process your binary file, you should probably use that library to do the byte-based processing for you.

Làm cách nào để đọc toàn bộ tệp nhị phân trong Python?

Hàm Open () mở một tệp ở định dạng văn bản theo mặc định. Để mở một tệp ở định dạng nhị phân, thêm 'B' vào tham số chế độ. Do đó, chế độ "RB" mở tệp ở định dạng nhị phân để đọc, trong khi chế độ "WB" mở tệp ở định dạng nhị phân để viết.add 'b' to the mode parameter. Hence the "rb" mode opens the file in binary format for reading, while the "wb" mode opens the file in binary format for writing.

Làm cách nào để đọc một tệp nhị phân?

Để đọc từ một tập tin nhị phân..
Sử dụng phương thức ReadallBytes, trả về nội dung của tệp dưới dạng mảng byte.Ví dụ này đọc từ tệp c:/tài liệu và cài đặt/selfportrait.....
Đối với các tệp nhị phân lớn, bạn có thể sử dụng phương thức đọc của đối tượng fileStream để đọc từ tệp chỉ một số lượng được chỉ định tại một thời điểm ..

Làm cách nào để đọc một tệp nhị phân trong Python 3?

Bạn có thể mở tệp bằng phương thức Open () bằng cách chuyển tham số B để mở nó ở chế độ nhị phân và đọc các byte tệp.Mở ('Tên tệp', "RB") Mở tệp nhị phân ở chế độ đọc.open the file using open() method by passing b parameter to open it in binary mode and read the file bytes. open('filename', "rb") opens the binary file in read mode.

Làm cách nào để đọc một hình ảnh nhị phân trong Python?

>> fileId = fopen ('samplex3. RAW', 'rb') fileId = 1 >> a = fread (fileId, [1024,1024], 'int16');Kích thước (a) Ans = 1024 1024 >> tối đa (tối đa (a)) ans = 12345 >> Đóng tất cả;nhân vật;Imagesc (a) ;..
python..
image..
numpy..
binary..