Написание бинарных файлов в Python 2.6+ и 3 - PullRequest
0 голосов
/ 11 декабря 2011

Я пишу программу, которая должна записать двоичный файл.В нем содержится заголовок строк (пар ключ-значение) и числовых данных (которые могут быть с прямым или прямым порядком байтов), и я ищу способ написать программу, которая работает без изменений в Python 2.6+ и Python 3.2+.

Кто-нибудь может предложить несколько лучших практик?Кроме того, как правильно обращаться с порядком байтов, не загромождая логику моей программы с struct.pack.Должен ли я подкласс BufferedWriter?

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 11 декабря 2011

Как только вы создали двоичные данные, вы просто записываете их в файл, открытый в двоичном режиме. Это все, что нужно сделать. Никаких проблем с совместимостью между Python 2 и 3 вообще нет.

Подкласс BufferedWriter совершенно не нужен.

Как вы создаете данные, это другой вопрос, но опять же там я не вижу явных проблем несовместимости.

0 голосов
/ 11 декабря 2011

Вы можете использовать os.open + os.write + os.close. Однако для надежности им нужны циклы while.

Я сделал это, используя http://stromberg.dnsalias.org/~strombrg/bufsock.html (я написал это, мой бывший работодатель разрешил мне открыть его), чтобы добиться этого в дедуплицирующей программе резервного копирования, которая выполняет множество операций двоичного ввода-вывода. Для этого не нужны циклы, даже если вы используете сигналы. Не позволяйте имени «bufsock» обмануть вас - это также хорошо для файлового ввода-вывода.

Кстати, написание вещей в зависимости от порядка байтов обычно является ошибкой в ​​долгосрочной перспективе. Если вы не удовлетворены встроенными инструментами Python (я не всегда, например, когда мне понадобился 3-байтовый целочисленный тип), вероятно, лучше разделить ваши числа, используя divmod 256. Другой альтернативой является использование http://stromberg.dnsalias.org/~strombrg/base255.html чтобы получить строки с нулевым символом в конце.

0 голосов
/ 11 декабря 2011

Не ясно, если у вас уже есть предопределенный двоичный формат файла, которому вы должны соответствовать, но если нет, и вы просто пытаетесь сериализовать свои структуры данных таким образом, чтобы их можно было прочитать несколькими языками программирования (а также несколькимиВерсии Python на нескольких платформах), вы можете посмотреть Protocol Buffers

...