SOUR
Янв. 6, 2012 19:38:27
Доброго времени суток!
Я реализую разные алгоритмы сжатия текста на питоне, и у меня возникла следующая проблема.
Допустим у меня есть исходная строка - this is an example for huffman encoding (в txt файл весит 39 кб)
После шифрования получается набор 1 и 0 (которые по длине больше чем исходный текст) дак вот я так и не понял, как хранить каждый бит (1 or 0) и записыать его в бинарный файл (open('exemple.bin', wb))… Я пытался с помощью bool значений и int-овых но не прет, так же пытался с помощью dump , но тут файл жиреет в 2-3 раза…
У кого есть какие-нибудь мысли?
s0rg
Янв. 6, 2012 20:09:54
SOUR
Янв. 6, 2012 20:50:31
Пожалуйста можно поподробней про этот struct, в интернете натыкался на неё, но никто конкретного не писал…
SOUR
Янв. 6, 2012 21:17:59
или скажите альтернативные варианты, если кто знает таковые
Ну дык это, обычный вариант - складываете битики в байтики, переводите в строки и пишете. Все будет компактнее некуда.
o7412369815963
Янв. 7, 2012 09:41:46
Можно биты собирать через chr, складывать в строки, потом записывать.
SOUR
Янв. 7, 2012 10:29:17
o7412369815963
проблема, что питон не хочет записывать char'ы в бинарный файл..
o7412369815963
Янв. 7, 2012 13:47:43
SOUR
o7412369815963
проблема, что питон не хочет записывать char'ы в бинарный файл..
а у меня питон нормально пишет в файл.
SOUR
o7412369815963
проблема, что питон не хочет записывать char'ы в бинарный файл..
Это какая-то выдуманная проблема.
Вот, смотрите как он прекрасно туда пишет:
In [1]: a = '101011101010101010110'
In [2]: ''.join([chr(int(a[i:i+8], 2)) for i in range(0, len(a), 8)])
Out[2]: '\xae\xaa\x16'
In [3]: with open('out.bin', 'wb') as out:
...: out.write(''.join([chr(int(a[i:i+8], 2)) for i in range(0, len(a), 8)]))
И после этого вот что там унутре:
$ hexdump out.bin
0000000 aaae 0016
0000003
py.user.next
Янв. 9, 2012 22:14:40
строку единиц и нулей нужно выравнять, чтобы длина была кратна восьми
иначе обрезок в конце неявно добавляет нули между ним и кратной частью