Đọc file nhị phân

Mình có file nhị phân dạng byte cần đọc. Mình thử đọc mấy byte đầu nhưng báo lỗi như này. Mọi người giúp mình với.

import struct
class input_data:
    def __ini__(self, filename):
        try:
            self.input_file = open(filename, 'rb')
            self.read_chn_binary()
        except ValueError:
            print('Unable to load file ' + filename)
            
    def read_chn_binary(self): 
        self.version = struct.unpack('h', self.input_file.read(2))[0]  
        self.mca_detector_number = struct.unpack('h', self.input_file.read(2))[0]
        self.input_file.close()
        
    def write_txt(self, fname):
        tf = open('anhem.txt', 'w')
        tf.writelines(['# Filename : ' + fname,
                      '\n# Version: ' + str(self.version),
                      '\n# MCA detector ID: ' + str(self.mca_detector_number)])
        tf.close()
        
gamma = input_data('file.Chn')
gamma.write_txt('anh')


Đây là cấu trúc đầu của file

1 Like

Bạn viết sai hàm __init__ thành __ini__ kìa :slightly_smiling_face:

6 Likes

Mình bất cẩn quá, cám ơn bạn. Có chỗ này mình chưa hiểu


Mình thấy tất cả phần struct.unpack này đều ghi chỉ số [0] ở cuối như mũi tên mình chỉ. Bạn biết nó có ý nghĩa gì không?

1 Like

Cái đó nói rằng chọn thành phần đầu tiên trong struct.unpack đó (nếu nó là 1 list hay 1 string đã được split() ra). Ví dụ cho dễ hiểu hơn nhé, giả sử mình có 1 list gọi là numbers gồm các số 2, 4, 5 như thế này:

numbers = [2, 4, 5]

Nếu mình muốn gán thành phần đầu tiên của list đó vào 1 biến gọi là first_element thì mình sẽ gõ như thế này:

first_element = numbers[0]

Cái số nằm trong cái [] đó được gọi là index number (số chỉ mục), nó giống như ID của các thành phần trong list đó. Thành phần đầu tiên trong list có index number là 0, và cứ thế tăng dần với các element tiếp theo.

Bạn có thể tìm hiểu về Python List để biết thêm nhé.

5 Likes

Các chỉ số trong List thì mình biết. Ở đây mình có thử lại bằng cách xóa [0] ở phần struct.unpack. Sau khi chạy chương trình xuất ra file text (bạn xem lại code ở bài đầu mình có chuyển về str khi ghi vào file. Kết quả khác nhau như hình dưới: 1 cái trả về str, còn 1 cái là tuple. Bạn xem hình này.

2 Likes

Thì như mình đã nói, cái [0] nó chỉ chọn cái đầu tiên trong 1 list/tuple/string(đã được split()) nên nó sẽ chỉ xuất ra value của thành phần đầu tiên trong tuple đó mà không phải là cả tuple.

4 Likes

Cái struck.unpack() đó nó sẽ trả về một list
nên struck.unpack()[0] có nghĩa là lấy item đầu tiên của cái list sinh ra từ “struck.unpack()” đó

Diễn giải ra thì như này này

my_list = struck.unpack()
1st_item = my_list[0]
3 Likes

Ok bạn, lúc đấy chắc hiểu nhầm ý. Mình tìm hiểu lại thì struct.unpack(...) nó trả về tuple thêm [0] để lấy phần tử đầu tiên.

1 Like

Nó trả về tuple bạn nhé.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?