Найти - Пользователи
Полная версия: Unicode строка и бинарные данные
Начало » Python для новичков » Unicode строка и бинарные данные
1
bigvovka
Народ, хелп, в питоне ещё не сильно разбираюсь, столкнулся с такой проблемой:

Есть переменная, в ней юникодовская строка, но данные в ней бинарные. т.е. совсем не юникод, соответственно при выводе в файл питон ругается…
Как эту строку вывести в файл или преобразовать в любой другой бинарный объект, не трогая сами данные, т.е. не искажая данные?
Андрей Светлов
Вы уж таки определитесь, у вас таки юникод (unicode, UCS2 или UCS4 в зависимости от сборки питона) или бинарные данные.
Одновременно то и другое - нонсенс.
bigvovka
вот так с этим нонсенсом я и живу )))

после выборки из базы данных бинарных данных (изображение, png) получается строка
(u'\u5089\u474e\u0a0d\u0a1a\x00\u0d00\u4849\u5244\x00\u6400\x00\u6400\u0608\x00\u7000\u95e2T\u5700\u49c3\u4144\u7854\u74
9c\ubf90\u432f\u1461\u9f86\udd73\ua6f6\ua189\u4269\u9224\u889a\u9ad8\u4898\u1a8c\ub031\u1260\uc19b\u603f\u0e91\u8906\uff
..........
при любом к ней обращении получаем:
UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 0-3: ordinal not in range(128)

вообще более полнй вопрос тут: http://python.su/forum/viewtopic.php?id=8550
но так как никто не отетил, решил, может кто подскажет, как работать со строками в таком случае…
Андрей Светлов
Ааа. В текстовое поле БД писать бинарные данные - после этого я не удивлен.
Нужно подумать, как вам с этим жить…

Например, загоните ваш unicode в array.array с типом ‘u’, а затем вызовите .tostring
Выглядит жутковато, но должно сработать. Может, еще потребуется .byteswap - сами проверьте.
bigvovka
база не моя - я должен только обрабатывать её… :)
хотя Вы подали идею: если изменить немного тип поля базы (там МЕМО поле с опцией юникод), то С-шная прога, которая её наполняет, может и не заметит изменений…

а насчёт array.array - надо попробовать, правда там 200 метров данных, не хотелось бы их долго перелопачивать, хотелось бы сразу… но, как говорится, лучше хоть как-то, чем никак :)
Андрей Светлов
Блобы по 200 метров каждый? 8-)
И ваша база все еще как-то крутится?
bigvovka
Немного не так - в базе около 10К записей общим объёмом 200М :)

О, Великий Гуру Андрей Светлов, ты указал истинный путь страждущему :)
array.array отлично сработал, массив непосредственно записал в файл - png файл получился корректным :)

Для читающих тему:
a = array.array('u', b)
file = open('a.png', 'wb')
file.write(a)
file.close

где b - исходная проблемная строка
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB