bigvovka
Сен. 27, 2010 11:37:13
Народ, хелп, в питоне ещё не сильно разбираюсь, столкнулся с такой проблемой:
Есть переменная, в ней юникодовская строка, но данные в ней бинарные. т.е. совсем не юникод, соответственно при выводе в файл питон ругается…
Как эту строку вывести в файл или преобразовать в любой другой бинарный объект, не трогая сами данные, т.е. не искажая данные?
Андрей Светлов
Сен. 27, 2010 16:44:26
Вы уж таки определитесь, у вас таки юникод (unicode, UCS2 или UCS4 в зависимости от сборки питона) или бинарные данные.
Одновременно то и другое - нонсенс.
bigvovka
Сен. 27, 2010 17:52:58
вот так с этим нонсенсом я и живу )))
после выборки из базы данных бинарных данных (изображение, 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 но так как никто не отетил, решил, может кто подскажет, как работать со строками в таком случае…
Андрей Светлов
Сен. 27, 2010 18:10:36
Ааа. В текстовое поле БД писать бинарные данные - после этого я не удивлен.
Нужно подумать, как вам с этим жить…
Например, загоните ваш unicode в array.array с типом ‘u’, а затем вызовите .tostring
Выглядит жутковато, но должно сработать. Может, еще потребуется .byteswap - сами проверьте.
bigvovka
Сен. 27, 2010 20:32:51
база не моя - я должен только обрабатывать её… :)
хотя Вы подали идею: если изменить немного тип поля базы (там МЕМО поле с опцией юникод), то С-шная прога, которая её наполняет, может и не заметит изменений…
а насчёт array.array - надо попробовать, правда там 200 метров данных, не хотелось бы их долго перелопачивать, хотелось бы сразу… но, как говорится, лучше хоть как-то, чем никак :)
Андрей Светлов
Сен. 27, 2010 20:49:22
Блобы по 200 метров каждый? 8-)
И ваша база все еще как-то крутится?
bigvovka
Сен. 27, 2010 22:52:12
Немного не так - в базе около 10К записей общим объёмом 200М :)
О, Великий Гуру Андрей Светлов, ты указал истинный путь страждущему :)
array.array отлично сработал, массив непосредственно записал в файл - png файл получился корректным :)
Для читающих тему:
a = array.array('u', b)
file = open('a.png', 'wb')
file.write(a)
file.close
где b - исходная проблемная строка