Напишите файлы со строками в двоичном с Python 3 - PullRequest
0 голосов
/ 02 декабря 2018

Мне удалось преобразовать целые числа в двоичные и записать их в двоичный файл, импортируя модуль struct.

import struct

a = 1234

with open("data.txt", "wb") as f:
   f.write(struck.pack("i", a))

Теперь я хотел бы преобразовать строку в двоичную, чтобы я мог также записать ее вдвоичный файл без преобразования строки в ASCII.Какой тип кода использовать для строк?Есть ли другой способ записи строки в двоичном формате?

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Вы можете использовать код типа 's' для записи двоичной строки фиксированной длины.Например, '10s' указывает строку байтов длиной 10, как описано в документации .

. Здесь есть две важные проблемы:

  1. Процесс преобразования строки в двоичное представление требует кодировки .ASCII - одна из таких кодировок, а UTF-8 - другая, более современная.Вы можете кодировать строку в Python следующим образом:

    'foo'.encode('utf-8')
    

    Вы не можете просто сохранить строку в двоичном потоке, не кодировав ее каким-либо образом.То, как вы это сделаете, является вашим решением.

  2. Строка обычно не является структурой данных фиксированной длины.Если вы хотите иметь возможность читать строку из вашей структуры данных после ее записи, вам нужно будет знать, как долго это будет продолжаться.Иначе как узнать, сколько байтов нужно прочитать?Вы можете ограничиться хранением строк с двоичными представлениями фиксированной длины (например, используя '10s'), но это может вызвать проблемы с кодировками переменной ширины, такими как UTF-8 (где некоторые символы имеют более одного байта).

    Существует несколько различных способов кодирования этой информации в двоичном потоке;например строки в стиле C заканчиваются нулевым байтом (b'\0'), в то время как более распространенным является сохранение длины строки сначала (в качестве префикса), а затемзапишите байты.

Строковое представление в двоичном формате нетривиально, и вы должны тщательно продумать, как вы хотите представить свои данные, прежде чем продолжить.См. статью Википедии о строках для более подробной информации.


NB Если все, что вы хотите сделать, это сохранить одну строку в файле, то этосделано очень легко, используя ответ Шей.В этом случае файловая система сама сообщает Python, как долго файл (в байтах) и когда прекратить чтение данных.

Этот подход не работает, когда вы храните структуру данных, состоящую из лотов.разных частей.

0 голосов
/ 02 декабря 2018

Если вы хотите записать данные utf-8 в файл openend в режиме binary-write :

with open("file.txt","wb") as f:
    f.write(your_string.encode("utf-8"))

Если вы хотите прочитать данные utf-8 изфайл открывается в режиме двоичное чтение :

with open("file.txt","rb") as f:
    str_to_save_to = f.read().decode("utf-8")

То же самое можно сделать с помощью (режим "r"):

with open("file.txt","r") as f:
    str_to_save_to = f.read()

Это потому, что когдаВы пишете или читаете в обычном режиме - python автоматически преобразует данные для вас из "str" ​​в "bytes" и из "bytes" в "str".Но эти две вещи на самом деле одно и то же с другим интерфейсом.При сохранении в памяти эти два типа выглядят одинаково (по крайней мере, их сущность).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...