Hướng dẫn write binary file python - viết tệp nhị phân python

Tôi có một chuỗi (nó cũng có thể là một số nguyên) trong Python và tôi muốn viết nó vào một tệp. Nó chỉ chứa những cái và số không tôi muốn mẫu của các cái và số không được ghi vào một tệp. Tôi muốn viết trực tiếp nhị phân vì tôi cần lưu trữ nhiều dữ liệu, nhưng chỉ có các giá trị nhất định. Tôi thấy không cần phải chiếm không gian sử dụng tám bit cho mỗi giá trị khi tôi chỉ cần ba.

Nội dung chính

  • 15.2K13 Huy hiệu vàng129 Huy hiệu bạc138 Huy hiệu đồng
  • Làm thế nào để bạn viết dữ liệu nhị phân vào một tệp trong Python?
  • Chúng ta có thể viết chuỗi vào tệp nhị phân trong Python không?
  • Định dạng tệp nhị phân trong Python là gì?
  • Làm cách nào để đọc một chuỗi nhị phân trong Python?

Ví dụ. Giả sử tôi đã viết chuỗi nhị phân

import struct

#...
with open('file.dat', 'wb') as f:
    if isinstance(value, int):
        f.write(struct.pack('i', value)) # write an int
    elif isinstance(value, str):
        f.write(value) # write a string
    else:
        raise TypeError('Can only write str or int')
0 vào một tệp. Nếu tôi mở nó trong một trình soạn thảo văn bản, nó sẽ nói
import struct

#...
with open('file.dat', 'wb') as f:
    if isinstance(value, int):
        f.write(struct.pack('i', value)) # write an int
    elif isinstance(value, str):
        f.write(value) # write a string
    else:
        raise TypeError('Can only write str or int')
1 (01100010 là mã ASCII cho B). Đừng nhầm lẫn mặc dù. Tôi không muốn viết mã ASCII, ví dụ chỉ là để chỉ ra rằng tôi muốn viết trực tiếp các byte vào tệp.

Clarification:

Chuỗi của tôi trông giống như thế này:

binary_string = "001011010110000010010"

Nó không được làm bằng mã nhị phân cho số hoặc ký tự. Nó chỉ chứa dữ liệu tương đối với chương trình của tôi.

Duhaime

23.9K14 Huy hiệu vàng156 Huy hiệu bạc200 Huy hiệu đồng14 gold badges156 silver badges200 bronze badges14 gold badges156 silver badges200 bronze badges

Đã hỏi ngày 2 tháng 6 năm 2013 lúc 21:29Jun 2, 2013 at 21:29Jun 2, 2013 at 21:29

Để viết ra một chuỗi, bạn có thể sử dụng phương thức

import struct

#...
with open('file.dat', 'wb') as f:
    if isinstance(value, int):
        f.write(struct.pack('i', value)) # write an int
    elif isinstance(value, str):
        f.write(value) # write a string
    else:
        raise TypeError('Can only write str or int')
2 của tệp. Để viết một số nguyên, bạn sẽ cần sử dụng mô -đun
import struct

#...
with open('file.dat', 'wb') as f:
    if isinstance(value, int):
        f.write(struct.pack('i', value)) # write an int
    elif isinstance(value, str):
        f.write(value) # write a string
    else:
        raise TypeError('Can only write str or int')
3
import struct

#...
with open('file.dat', 'wb') as f:
    if isinstance(value, int):
        f.write(struct.pack('i', value)) # write an int
    elif isinstance(value, str):
        f.write(value) # write a string
    else:
        raise TypeError('Can only write str or int')

Tuy nhiên, biểu diễn của int và chuỗi là khác nhau, bạn có thể sử dụng hàm

import struct

#...
with open('file.dat', 'wb') as f:
    if isinstance(value, int):
        f.write(struct.pack('i', value)) # write an int
    elif isinstance(value, str):
        f.write(value) # write a string
    else:
        raise TypeError('Can only write str or int')
4 thay thế để biến nó thành chuỗi 0 và 1
>>> bin(7)
'0b111'
>>> bin(7)[2:] #cut off the 0b
'111'

Nhưng có lẽ cách tốt nhất để xử lý tất cả các

import struct

#...
with open('file.dat', 'wb') as f:
    if isinstance(value, int):
        f.write(struct.pack('i', value)) # write an int
    elif isinstance(value, str):
        f.write(value) # write a string
    else:
        raise TypeError('Can only write str or int')
5 này là quyết định độ rộng cố định cho các chuỗi nhị phân trong tệp và chuyển đổi chúng như vậy:
>>> x = 7
>>> '{0:032b}'.format(x) #32 character wide binary number with '0' as filler
'00000000000000000000000000000111'

Thiết quyền

10,4K2 Huy hiệu vàng17 Huy hiệu bạc32 Huy hiệu đồng2 gold badges17 silver badges32 bronze badges2 gold badges17 silver badges32 bronze badges

Đã trả lời ngày 2 tháng 6 năm 2013 lúc 21:52Jun 2, 2013 at 21:52Jun 2, 2013 at 21:52

Ryan Hainingan HainingRyan HainingRyan Haining

33.7K12 Huy hiệu vàng105 Huy hiệu bạc167 Huy hiệu đồng12 gold badges105 silver badges167 bronze badges12 gold badges105 silver badges167 bronze badges

3

Được rồi, sau khi tìm kiếm nhiều hơn một chút, tôi đã tìm thấy một câu trả lời. Tôi tin rằng những người còn lại chỉ đơn giản là không hiểu (đó có lẽ là lỗi của tôi, vì tôi phải chỉnh sửa hai lần để làm rõ). Tôi tìm thấy nó ở đây.

Câu trả lời là phân chia từng phần dữ liệu, chuyển đổi chúng thành một số nguyên nhị phân sau đó đặt chúng vào một mảng nhị phân. Sau đó, bạn có thể sử dụng phương thức

import struct

#...
with open('file.dat', 'wb') as f:
    if isinstance(value, int):
        f.write(struct.pack('i', value)) # write an int
    elif isinstance(value, str):
        f.write(value) # write a string
    else:
        raise TypeError('Can only write str or int')
6 của mảng để ghi vào tệp.
import struct

#...
with open('file.dat', 'wb') as f:
    if isinstance(value, int):
        f.write(struct.pack('i', value)) # write an int
    elif isinstance(value, str):
        f.write(value) # write a string
    else:
        raise TypeError('Can only write str or int')
1

Ryan Haining

33.7K12 Huy hiệu vàng105 Huy hiệu bạc167 Huy hiệu đồng12 gold badges105 silver badges167 bronze badges12 gold badges105 silver badges167 bronze badges

Được rồi, sau khi tìm kiếm nhiều hơn một chút, tôi đã tìm thấy một câu trả lời. Tôi tin rằng những người còn lại chỉ đơn giản là không hiểu (đó có lẽ là lỗi của tôi, vì tôi phải chỉnh sửa hai lần để làm rõ). Tôi tìm thấy nó ở đây.Jun 2, 2013 at 23:36

Câu trả lời là phân chia từng phần dữ liệu, chuyển đổi chúng thành một số nguyên nhị phân sau đó đặt chúng vào một mảng nhị phân. Sau đó, bạn có thể sử dụng phương thức

import struct

#...
with open('file.dat', 'wb') as f:
    if isinstance(value, int):
        f.write(struct.pack('i', value)) # write an int
    elif isinstance(value, str):
        f.write(value) # write a string
    else:
        raise TypeError('Can only write str or int')
6 của mảng để ghi vào tệp.
import struct

#...
with open('file.dat', 'wb') as f:
    if isinstance(value, int):
        f.write(struct.pack('i', value)) # write an int
    elif isinstance(value, str):
        f.write(value) # write a string
    else:
        raise TypeError('Can only write str or int')
1KFox

Ryan Haining3 gold badges9 silver badges34 bronze badges

Được rồi, sau khi tìm kiếm nhiều hơn một chút, tôi đã tìm thấy một câu trả lời. Tôi tin rằng những người còn lại chỉ đơn giản là không hiểu (đó có lẽ là lỗi của tôi, vì tôi phải chỉnh sửa hai lần để làm rõ). Tôi tìm thấy nó ở đây.Jun 2, 2013 at 23:36

import struct

#...
with open('file.dat', 'wb') as f:
    if isinstance(value, int):
        f.write(struct.pack('i', value)) # write an int
    elif isinstance(value, str):
        f.write(value) # write a string
    else:
        raise TypeError('Can only write str or int')
6 của mảng để ghi vào tệp.KFox

Ryan Haining3 gold badges9 silver badges34 bronze badges

Đã trả lời ngày 2 tháng 6 năm 2013 lúc 23:36

import struct

#...
with open('file.dat', 'wb') as f:
    if isinstance(value, int):
        f.write(struct.pack('i', value)) # write an int
    elif isinstance(value, str):
        f.write(value) # write a string
    else:
        raise TypeError('Can only write str or int')
4

KfoxkfoxJun 2, 2013 at 22:16

import struct

#...
with open('file.dat', 'wb') as f:
    if isinstance(value, int):
        f.write(struct.pack('i', value)) # write an int
    elif isinstance(value, str):
        f.write(value) # write a string
    else:
        raise TypeError('Can only write str or int')
3Aya

1.1163 huy hiệu vàng9 Huy hiệu bạc34 Huy hiệu đồng

Tôi muốn mẫu của những cái và số không được ghi vào một tệp.Jun 2, 2013 at 22:166 gold badges54 silver badges55 bronze badges

1

Nếu bạn có nghĩa là bạn muốn viết một luồng từ một chuỗi sang một tệp, bạn sẽ cần một cái gì đó như thế này ...Aya

import struct

#...
with open('file.dat', 'wb') as f:
    if isinstance(value, int):
        f.write(struct.pack('i', value)) # write an int
    elif isinstance(value, str):
        f.write(value) # write a string
    else:
        raise TypeError('Can only write str or int')
6

... mà Sep 20, 2016 at 5:04

import struct

#...
with open('file.dat', 'wb') as f:
    if isinstance(value, int):
        f.write(struct.pack('i', value)) # write an int
    elif isinstance(value, str):
        f.write(value) # write a string
    else:
        raise TypeError('Can only write str or int')
7 hiển thị ...6 gold badges54 silver badges55 bronze badgesThorSummoner

Đã trả lời ngày 2 tháng 6 năm 2013 lúc 22:1613 gold badges129 silver badges138 bronze badges

0

AyaayaSep 20, 2016 at 5:04

37.6K6 Huy hiệu vàng54 Huy hiệu bạc55 Huy hiệu ĐồngThorSummoner

15.2K13 Huy hiệu vàng129 Huy hiệu bạc138 Huy hiệu đồng

Ví dụ ngắn gọn:13 gold badges129 silver badges138 bronze badges

Đã trả lời ngày 20 tháng 9 năm 2016 lúc 5:04

Thorsummonerthorsummoner
  • import struct
    
    #...
    with open('file.dat', 'wb') as f:
        if isinstance(value, int):
            f.write(struct.pack('i', value)) # write an int
        elif isinstance(value, str):
            f.write(value) # write a string
        else:
            raise TypeError('Can only write str or int')
    
    7
  • Nối vào
  • import struct
    
    #...
    with open('file.dat', 'wb') as f:
        if isinstance(value, int):
            f.write(struct.pack('i', value)) # write an int
        elif isinstance(value, str):
            f.write(value) # write a string
        else:
            raise TypeError('Can only write str or int')
    
    8 3 bit cùng một lúc vẫn sẽ tạo ra 8 bit cho mỗi giá trị. Lắp đặt
    import struct
    
    #...
    with open('file.dat', 'wb') as f:
        if isinstance(value, int):
            f.write(struct.pack('i', value)) # write an int
        elif isinstance(value, str):
            f.write(value) # write a string
        else:
            raise TypeError('Can only write str or int')
    
    9,
    >>> bin(7)
    '0b111'
    >>> bin(7)[2:] #cut off the 0b
    '111'
    
    0 và
    >>> bin(7)
    '0b111'
    >>> bin(7)[2:] #cut off the 0b
    '111'
    
    1 vào một mảng và ghi vào đĩa sẽ tạo ra đầu ra sau:
    >>> bin(7)
    '0b111'
    >>> bin(7)[2:] #cut off the 0b
    '111'
    
    2. Lưu ý tất cả các số không có đệm trong đó.

    binary_string = "001011010110000010010"
    
    3

    Có vẻ như, thay vào đó, bạn muốn "nhỏ gọn" bộ ba nhị phân vào byte để tiết kiệm không gian. Đưa ra chuỗi ví dụ trong câu hỏi của bạn, bạn có thể chuyển đổi nó thành một danh sách các số nguyên (8 bit cùng một lúc) và sau đó viết trực tiếp vào một tệp. Điều này sẽ đóng gói tất cả các bit với nhau chỉ bằng 3 bit cho mỗi giá trị thay vì 8.

    >>> bin(7)
    '0b111'
    >>> bin(7)[2:] #cut off the 0b
    '111'
    
    3

Ví dụ Python 3.4

>>> bin(7)
'0b111'
>>> bin(7)[2:] #cut off the 0b
'111'
4Mar 30, 2016 at 22:25Mar 30, 2016 at 22:25

Làm thế nào để bạn viết dữ liệu nhị phân vào một tệp trong Python?

Sử dụng tệp ....

File = Open ("Sample.bin", "WB").

tập tin. Viết (b "Chuỗi nhị phân này sẽ được viết vào sample.bin").

tập tin. gần().

Chúng ta có thể viết chuỗi vào tệp nhị phân trong Python không?

Phương thức số 1: Sử dụng Định dạng Jop () + Ord () + () Sự kết hợp của các hàm trên có thể được sử dụng để thực hiện tác vụ cụ thể này.Hàm ord chuyển đổi ký tự thành tương đương ASCII, định dạng chuyển đổi số này thành số nhị phân và tham gia được sử dụng để nối từng ký tự được chuyển đổi để tạo thành một chuỗi.Using join() + ord() + format() The combination of above functions can be used to perform this particular task. The ord function converts the character to it's ASCII equivalent, format converts this to binary number and join is used to join each converted character to form a string.Using join() + ord() + format() The combination of above functions can be used to perform this particular task. The ord function converts the character to it's ASCII equivalent, format converts this to binary number and join is used to join each converted character to form a string.

Định dạng tệp nhị phân trong Python là gì?

Khoa học dữ liệu thực tế bằng cách sử dụng các tệp "nhị phân" Python 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.any files where the format isn't made up of readable characters. Binary files can range from image files like JPEGs or GIFs, audio files like MP3s or binary document formats like Word or PDF. In Python, files are opened in text mode by default.any files where the format isn't made up of readable characters. Binary files can range from image files like JPEGs or GIFs, audio files like MP3s or binary document formats like Word or PDF. In Python, files are opened in text mode by default.

Làm cách nào để đọc một chuỗi nhị phân trong Python?

Phương pháp số 1: Dữ liệu nhị phân được chia thành các bộ 7 bit vì bộ nhị phân này làm đầu vào, trả về giá trị thập phân tương ứng là mã ASCII của ký tự của chuỗi.Mã ASCII này sau đó được chuyển đổi thành chuỗi bằng hàm chr ().using chr() function.using chr() function.