Hướng dẫn how do you write a binary string in python? - làm thế nào để bạn viết một chuỗi nhị phân trong 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.

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.

Hướng dẫn how do you write a binary string in python? - làm thế nào để bạn viết một chuỗi nhị phân trong python?

Duhaime

24.1K14 Huy hiệu vàng158 Huy hiệu bạc204 Huy hiệu đồng14 gold badges158 silver badges204 bronze badges

Đã hỏi ngày 2 tháng 6 năm 2013 lúc 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'

Hướng dẫn how do you write a binary string in python? - làm thế nào để bạn viết một chuỗi nhị phân trong python?

Thiết quyền

10,5K2 Huy hiệu vàng18 Huy hiệu bạc33 Huy hiệu đồng2 gold badges18 silver badges33 bronze badges

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

Hướng dẫn how do you write a binary string in python? - làm thế nào để bạn viết một chuỗi nhị phân trong python?

Ryan Hainingan HainingRyan Haining

33.9K12 Huy hiệu vàng107 Huy hiệu bạc168 Huy hiệu đồng12 gold badges107 silver badges168 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.

from array import *

bin_array = array('B')

bin_array.append(int('011',2))
bin_array.append(int('010',2))
bin_array.append(int('110',2))

with file('binary.mydata', 'wb') as f:
    bin_array.tofile(f)

Hướng dẫn how do you write a binary string in python? - làm thế nào để bạn viết một chuỗi nhị phân trong python?

Ryan Haining

33.9K12 Huy hiệu vàng107 Huy hiệu bạc168 Huy hiệu đồng12 gold badges107 silver badges168 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.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

Kfoxkfox

from cStringIO import StringIO

s = "001011010110000010010"
sio = StringIO(s)

f = open('outfile', 'wb')

while 1:
    # Grab the next 8 bits
    b = sio.read(8)

    # Bail if we hit EOF
    if not b:
        break

    # If we got fewer than 8 bits, pad with zeroes on the right
    if len(b) < 8:
        b = b + '0' * (8 - len(b))

    # Convert to int
    i = int(b, 2)

    # Convert to char
    c = chr(i)

    # Write
    f.write(c)

f.close()

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

0000000: 00101101 01100000 10010000                             -`.

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:16

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

... 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')
7 hiển thị ...6 gold badges54 silver badges55 bronze badges

1

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

my_number = 1234
with open('myfile', 'wb') as file_handle:
    file_handle.write(struct.pack('i', my_number))
...
with open('myfile', 'rb') as file_handle:
    my_number_back = struct.unpack('i', file_handle.read())[0]

AyaayaSep 20, 2016 at 5:04

37,9K6 Huy hiệu vàng54 Huy hiệu bạc55 Huy hiệu ĐồngThorSummoner

Ví dụ ngắn gọn:15 gold badges130 silver badges139 bronze badges

0

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

Thorsummonerthorsummoner

15.4K15 Huy hiệu vàng130 Huy hiệu bạc139 Huy hiệu đồng

original_string = '001011010110000010010'

# first split into 8-bit chunks
bit_strings = [original_string[i:i + 8] for i in range(0, len(original_string), 8)]

# then convert to integers
byte_list = [int(b, 2) for b in bit_strings]

with open('byte.dat', 'wb') as f:
    f.write(bytearray(byte_list))  # convert to bytearray before writing

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 đó.

  • 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.
  • Ví dụ Python 3.4
  • Nội dung của byte.dat:

                                        ^^ ^ (Note extra bits)
    

    Hex:

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

nhị phân (bằng 8 bit):

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