Hướng dẫn python read 32 bit integer from file - python đọc số nguyên 32 bit từ tệp

Tôi đang cố đọc một tệp BMP trong Python. Tôi biết hai byte đầu tiên chỉ ra công ty BMP. 4 byte tiếp theo là kích thước tệp. Khi tôi thực hiện:

fin = open("hi.bmp", "rb")
firm = fin.read(2)  
file_size = int(fin.read(4))  

Tôi có:

ValueError: chữ không hợp lệ cho int () với cơ sở 10: 'f#\ x13'

Những gì tôi muốn làm là đọc bốn byte đó như một số nguyên, nhưng có vẻ như Python đang đọc chúng dưới dạng ký tự và trả lại một chuỗi, không thể chuyển đổi thành một số nguyên. Làm thế nào tôi có thể làm điều này một cách chính xác?

Hướng dẫn python read 32 bit integer from file - python đọc số nguyên 32 bit từ tệp

Lucas w

8923 Huy hiệu vàng10 Huy hiệu bạc22 Huy hiệu đồng3 gold badges10 silver badges22 bronze badges

Đã hỏi ngày 22 tháng 7 năm 2009 lúc 6:48Jul 22, 2009 at 6:48

MANUEL ARAOZMANUEL ARAOManuel Araoz

15.7K22 Huy hiệu vàng70 Huy hiệu bạc94 Huy hiệu đồng22 gold badges70 silver badges94 bronze badges

2

Phương thức

import struct

print(struct.unpack('i', fin.read(4)))
0 trả về một chuỗi byte dưới dạng chuỗi. Để chuyển đổi từ chuỗi byte chuỗi thành dữ liệu nhị phân, hãy sử dụng mô-đun
import struct

print(struct.unpack('i', fin.read(4)))
1 tích hợp: http://docs.python.org/l Library/struct.html.

import struct

print(struct.unpack('i', fin.read(4)))

Lưu ý rằng

import struct

print(struct.unpack('i', fin.read(4)))
2 luôn trả về một tuple, do đó
import struct

print(struct.unpack('i', fin.read(4)))
3 mang lại giá trị số nguyên mà bạn đang theo sau.

Bạn có thể nên sử dụng chuỗi định dạng

import struct

print(struct.unpack('i', fin.read(4)))
4 (

Rufflewind

8.3322 Huy hiệu vàng35 Huy hiệu bạc53 Huy hiệu Đồng2 gold badges35 silver badges53 bronze badges

Đã trả lời ngày 22 tháng 7 năm 2009 lúc 6:59Jul 22, 2009 at 6:59

8

Một phương pháp thay thế không sử dụng 'struct.unpack ()' sẽ là sử dụng Numpy:

import numpy as np

f = open("file.bin", "r")
a = np.fromfile(f, dtype=np.uint32)

'DTYPE' đại diện cho kiểu dữ liệu và có thể là int#, uint#, float#, phức tạp#hoặc loại do người dùng xác định. Xem

import struct

print(struct.unpack('i', fin.read(4)))
5.

Cá nhân thích sử dụng Numpy để làm việc với dữ liệu mảng/ma trận vì nó nhanh hơn rất nhiều so với việc sử dụng danh sách Python.

Hướng dẫn python read 32 bit integer from file - python đọc số nguyên 32 bit từ tệp

Đã trả lời ngày 29 tháng 7 năm 2012 lúc 21:51Jul 29, 2012 at 21:51

Hướng dẫn python read 32 bit integer from file - python đọc số nguyên 32 bit từ tệp

EMANUEL EYEMANUEL EYEmanuel Ey

2.5745 huy hiệu vàng29 Huy hiệu bạc37 Huy hiệu đồng5 gold badges29 silver badges37 bronze badges

3

Kể từ Python 3.2+, bạn cũng có thể thực hiện điều này bằng phương pháp INT gốc

import struct

print(struct.unpack('i', fin.read(4)))
6:

file_size = int.from_bytes(fin.read(2), byteorder='big')

Lưu ý rằng chức năng này yêu cầu bạn chỉ định xem số đó được mã hóa ở định dạng lớn hay ít, vì vậy bạn sẽ phải xác định tính endian để đảm bảo nó hoạt động chính xác.

Đã trả lời ngày 8 tháng 5 năm 2017 lúc 21:33May 8, 2017 at 21:33

Hướng dẫn python read 32 bit integer from file - python đọc số nguyên 32 bit từ tệp

CrepegoatcrepegoatCrepeGoat

2.13717 Huy hiệu bạc22 Huy hiệu đồng17 silver badges22 bronze badges

6

Ngoại trừ

import struct

print(struct.unpack('i', fin.read(4)))
1 Bạn cũng có thể sử dụng mô -đun
import struct

print(struct.unpack('i', fin.read(4)))
8

import array
values = array.array('l') # array of long integers
values.read(fin, 1) # read 1 integer
file_size  = values[0]

Đã trả lời ngày 22 tháng 7 năm 2009 lúc 7:10Jul 22, 2009 at 7:10

Nick Dandoulakisnick DandoulakisNick Dandoulakis

41.9K15 Huy hiệu vàng102 Huy hiệu bạc136 Huy hiệu đồng15 gold badges102 silver badges136 bronze badges

3

Khi bạn đang đọc tệp nhị phân, bạn cần giải nén nó vào một số nguyên, vì vậy hãy sử dụng mô -đun cấu trúc cho điều đó

import struct
fin = open("hi.bmp", "rb")
firm = fin.read(2)  
file_size, = struct.unpack("i",fin.read(4))

Đã trả lời ngày 22 tháng 7 năm 2009 lúc 7:03Jul 22, 2009 at 7:03

Anurag uniyalanurag uniyalAnurag Uniyal

83.7K39 Huy hiệu vàng170 Huy hiệu bạc216 Huy hiệu đồng39 gold badges170 silver badges216 bronze badges

1

Khi bạn đọc từ một tệp nhị phân, một loại dữ liệu được gọi là byte được sử dụng. Đây là một chút giống như danh sách hoặc tuple, ngoại trừ nó chỉ có thể lưu trữ số nguyên từ 0 đến 255.

Try:

file_size = fin.read(4)
file_size0 = file_size[0]
file_size1 = file_size[1]
file_size2 = file_size[2]
file_size3 = file_size[3]

Or:

file_size = list(fin.read(4))

Thay vì:

file_size = int(fin.read(4))

Đã trả lời ngày 10 tháng 4 năm 2018 lúc 21:02Apr 10, 2018 at 21:02

Hướng dẫn python read 32 bit integer from file - python đọc số nguyên 32 bit từ tệp

Đây là một giải pháp muộn nhưng tôi mặc dù nó có thể giúp ích.

fin = open("hi.bmp", "rb")
firm = fin.read(2)
file_size = 0
for _ in range(4):  
    (file_size << 8) += ord(fin.read(1))

Đã trả lời ngày 6 tháng 2 lúc 4:58Feb 6 at 4:58

Hướng dẫn python read 32 bit integer from file - python đọc số nguyên 32 bit từ tệp