Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 27, 2010 11:37:13

bigvovka
От:
Зарегистрирован: 2010-09-21
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Unicode строка и бинарные данные

Народ, хелп, в питоне ещё не сильно разбираюсь, столкнулся с такой проблемой:

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



Офлайн

#2 Сен. 27, 2010 16:44:26

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Unicode строка и бинарные данные

Вы уж таки определитесь, у вас таки юникод (unicode, UCS2 или UCS4 в зависимости от сборки питона) или бинарные данные.
Одновременно то и другое - нонсенс.



Офлайн

#3 Сен. 27, 2010 17:52:58

bigvovka
От:
Зарегистрирован: 2010-09-21
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Unicode строка и бинарные данные

вот так с этим нонсенсом я и живу )))

после выборки из базы данных бинарных данных (изображение, 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
но так как никто не отетил, решил, может кто подскажет, как работать со строками в таком случае…



Офлайн

#4 Сен. 27, 2010 18:10:36

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Unicode строка и бинарные данные

Ааа. В текстовое поле БД писать бинарные данные - после этого я не удивлен.
Нужно подумать, как вам с этим жить…

Например, загоните ваш unicode в array.array с типом ‘u’, а затем вызовите .tostring
Выглядит жутковато, но должно сработать. Может, еще потребуется .byteswap - сами проверьте.



Офлайн

#5 Сен. 27, 2010 20:32:51

bigvovka
От:
Зарегистрирован: 2010-09-21
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Unicode строка и бинарные данные

база не моя - я должен только обрабатывать её… :)
хотя Вы подали идею: если изменить немного тип поля базы (там МЕМО поле с опцией юникод), то С-шная прога, которая её наполняет, может и не заметит изменений…

а насчёт array.array - надо попробовать, правда там 200 метров данных, не хотелось бы их долго перелопачивать, хотелось бы сразу… но, как говорится, лучше хоть как-то, чем никак :)



Офлайн

#6 Сен. 27, 2010 20:49:22

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Unicode строка и бинарные данные

Блобы по 200 метров каждый? 8-)
И ваша база все еще как-то крутится?



Офлайн

#7 Сен. 27, 2010 22:52:12

bigvovka
От:
Зарегистрирован: 2010-09-21
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Unicode строка и бинарные данные

Немного не так - в базе около 10К записей общим объёмом 200М :)

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

Для читающих тему:

a = array.array('u', b)
file = open('a.png', 'wb')
file.write(a)
file.close

где b - исходная проблемная строка



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version