Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с кодировками, ПОМОГИТЕ 
:(
    Опции темы
HellanD
Дата 11.6.2007, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 443
Регистрация: 16.5.2006
Где: Киев

Репутация: 1
Всего: 2



Есть у меня кусок кода, который читает данные(они на русском языке) из файла:
Код

self.name     = unicode(file.readline()[:-1])



А он мне выдает вот такое... Можете обьяснить причину? В начале кода у меня стоит # -*- coding: cp1251 -*-

self.name     = unicode(file.readline()[:-1])
UnicodeDecodeError: 'ascii' codec can't decode byte 0xcf in position 0: ordinal not in range(128)


--------------------
Мой сайт на django
Japanese Innovations
PM ICQ   Вверх
srd
Дата 11.6.2007, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 7
Всего: 49



Попробуй:
Код

# Здесь предполагается, что у тебя файл в кодировке cp1251
self.name     = file.readline()[:-1].decode("cp1251")


Цитата(HellanD @  11.6.2007,  18:23 Найти цитируемый пост)
А он мне выдает вот такое... Можете обьяснить причину?

Если при декодировании "узкой" строки в юникод не задана кодировка, т.е. используется кодек по-умолчанию ascii, который, разумеется, не понимает русских символов. Этот кодек выбирается один раз при стартапе питона и потом менять его нельзя. Потому пользуйся методами decode/encode. Можешь ещё помедитировать на код метода setencoding() в файле Lib/site.py в том каталоге, где у тебя установлен питон smile

Цитата(HellanD @  11.6.2007,  18:23 Найти цитируемый пост)
# -*- coding: cp1251 -*-

Это относится только к кодировке файла с исходным кодом. Об остальном ты должен позаботиться сам smile



--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
HellanD
Дата 11.6.2007, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 443
Регистрация: 16.5.2006
Где: Киев

Репутация: 1
Всего: 2



Попробовал заюзать 
Код

self.name     = file.readline()[:-1].decode("cp1251") 

Есть проблемка... Он в конец строки добавляет казяблик(я так понимаю символ окончания строки), а это не хорошо...Я и так от них избавлялся с помощью страшного file.readline()[:-1]....(Кстате а это как то можно улутшить??)

Добавлено через 4 минуты и 15 секунд
Стоп на счет казябликов сори, сам напутал....По ошибке убрал [:-1]


--------------------
Мой сайт на django
Japanese Innovations
PM ICQ   Вверх
pythonwin
Дата 11.6.2007, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



HellanD, можешь ещё посмотреть Использование Unicode в Python
PM WWW GTalk Jabber   Вверх
srd
Дата 11.6.2007, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 7
Всего: 49



Цитата(HellanD @  11.6.2007,  19:35 Найти цитируемый пост)
Я и так от них избавлялся с помощью страшного file.readline()[:-1]

Хм. Если в конце файла нету символов перевода строки, то предпоследний вызов readline() вернёт строку без "\n" на конце. И в этом случае [:-1] уничтожит последний значащий символ.

Можно, например, воспользоваться методом rstrip()
Код

>>> "test".rstrip("\n")
'test'
>>> "test\n".rstrip("\n")
'test'
>>> "\n".rstrip("\n")
''


Добавлено через 5 минут и 51 секунду
pythonwin
Ух, ты постоянно где-то откапываешь ссылки на интересные материалы. smile


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
pythonwin
Дата 11.6.2007, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(srd @  11.6.2007,  16:06 Найти цитируемый пост)
Ух, ты постоянно где-то откапываешь ссылки на интересные материалы. smile 

насчет интересных ссылок:
1) они постепенно накапливаются
2) можно многое почерпнуть читая http://python.com.ua/ru/links/blogi/ и статьи на http://python.com.ua/ru/articles/Python/

PM WWW GTalk Jabber   Вверх
HellanD
Дата 12.6.2007, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 443
Регистрация: 16.5.2006
Где: Киев

Репутация: 1
Всего: 2



Цитата

Можешь ещё помедитировать на код метода setencoding() в файле Lib/site.py


Вот помню что точно когдато над ним медетировал....Теперь тесты на моей тачке запускаются а на другой нет....Можете еще подробно написать как над ним можно помедетировать? smile 


--------------------
Мой сайт на django
Japanese Innovations
PM ICQ   Вверх
Ulysses4j
Дата 12.6.2007, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 6.6.2007
Где: Ростов-на-Дону

Репутация: 3
Всего: 10



Цитата(HellanD @ 12.6.2007,  09:46)
Цитата
Можешь ещё помедитировать на код метода setencoding() в файле Lib/site.py

Вот помню что точно когдато над ним медетировал....Теперь тесты на моей тачке запускаются а на другой нет....

Цитата
>>> unicode(regular_string)
UnicodeDecodeError: ’ascii’ codec can’t decode byte ...
  • Неправильное решение: исправить 'ascii' в site.py на используемую кодировку
  • Правильное решение: использовать явную перекодировку
    >>> unicode(regular_string, 'utf-8')
    либо
    >>> regular_string.decode('utf-8')

Цитата по предложенному pythonwin материалу "Использование Unicode в Python" (стр. 7).


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
HellanD
Дата 12.6.2007, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 443
Регистрация: 16.5.2006
Где: Киев

Репутация: 1
Всего: 2



Да я то понял...Предложение такое откатить назад либу site.py...И решить вопрос иначе (А если кодировка не 'utf-8'?? по моему "cp1251")


--------------------
Мой сайт на django
Japanese Innovations
PM ICQ   Вверх
pythonwin
Дата 12.6.2007, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



вот статья о питоне+unicode == All About Python and Unicode

Добавлено через 4 минуты и 10 секунд
Как узнать кодировку?

Добавлено через 6 минут и 56 секунд
http://chardet.feedparser.org/

Добавлено через 9 минут и 29 секунд
PS администрации - закрепите, пожалуйста, тему smile
PM WWW GTalk Jabber   Вверх
HellanD
Дата 29.6.2007, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 443
Регистрация: 16.5.2006
Где: Киев

Репутация: 1
Всего: 2



Еще вопрос связанный с кодировками... Вообщем захотел я получит доступ к кнопке "пуск" на рабочем столе (Винда русская ХР), узнал с помощью проги winspectr ее дескриптор, а по нему с помощью функции getWindowText узнал название окна (оно на русском и питон это выводит козябликами)....
Хочу теперь  найти дискриптор с помощю функции findwindow а она ничего не может найти (Ну оно и понятно я название окна передаю не понятно какое....) Подскажите плиз. Буду благодарен


--------------------
Мой сайт на django
Japanese Innovations
PM ICQ   Вверх
pythonwin
Дата 29.6.2007, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



HellanD, это тебе в GUI или вариант "поиграйся" decode и encode
PM WWW GTalk Jabber   Вверх
HellanD
Дата 29.6.2007, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 443
Регистрация: 16.5.2006
Где: Киев

Репутация: 1
Всего: 2



Ну не знаю причем тут ГУИ вообще...Англиские контролы ловяться на раз два три! А вот с decode и encode игрался - но не долго всегда получал эрор! Типа что не аски декодируешь!


--------------------
Мой сайт на django
Japanese Innovations
PM ICQ   Вверх
pythonwin
Дата 29.6.2007, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



HellanD, создай отдельную тему и выложи туда код smile

PM WWW GTalk Jabber   Вверх
stoune
Дата 9.5.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 9.5.2008

Репутация: нет
Всего: нет



Цитата(HellanD @ 11.6.2007,  11:23)
Есть у меня кусок кода, который читает данные(они на русском языке) из файла:
Код

self.name     = unicode(file.readline()[:-1])



А он мне выдает вот такое... Можете обьяснить причину? В начале кода у меня стоит # -*- coding: cp1251 -*-

self.name     = unicode(file.readline()[:-1])
UnicodeDecodeError: 'ascii' codec can't decode byte 0xcf in position 0: ordinal not in range(128)

Курить здесь http://www.faqs.org/docs/diveintopython/kgp_unicode.html

Вкратце, создать sitecustomize.py файл в site-packages и вернуть кодировку по умолчанию, например utf8
PM MAIL   Вверх
pythonwin
Дата 12.5.2008, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(stoune @  9.5.2008,  18:39 Найти цитируемый пост)
Вкратце, создать sitecustomize.py файл в site-packages и вернуть кодировку по умолчанию, например utf8 

это не правильно...
как правильно читать по ссылкам:
http://www.rupy.ru/member/5/#paper-6
http://www.rupy.ru/static/files/07/02/12/r...ich-unicode.pdf

Добавлено через 54 секунды
для определения кодировки текста в файле посмотри http://chardet.feedparser.org/
PM WWW GTalk Jabber   Вверх
iale
Дата 31.3.2009, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 31.3.2009

Репутация: нет
Всего: нет



Видимо давно не было проблем с кодировками. Недавно начал изучать python и есть непонимание работы с кодировками, все выше перечисленные доки я прочитал. Имеем такой код:
Версия - Python 2.5.2
Код

# -*- coding: utf-8 -*-

str1 ='привет';
str2 = u'привет';
str3 = unicode('привет', 'utf-8');

print(len(str1));
print(len(str2));
print(len(str3));

print(type(str1));
print(type(str2));
print(type(str3));


Результат:
Код

12
6
6
<type 'str'>
<type 'unicode'>
<type 'unicode'>


Но если выполнять в интерактивном режиме, то:
Код

str1 ='привет';
print(len(str1));
print(type(str1));
 
Результат:
Код

6
<type 'str'>

Вопрос почему разная длина, если тип один и тот же?


Это сообщение отредактировал(а) iale - 31.3.2009, 14:28
PM MAIL   Вверх
_Viper_
Дата 1.4.2009, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 8.11.2006

Репутация: 10
Всего: 11



В интерактивном режиме другая кодировка, не utf-8, поэтому и длинна другая.
PM MAIL   Вверх
Vinata
Дата 26.11.2009, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 26.11.2009
Где: Пенза

Репутация: нет
Всего: нет



Здравствуйте, помогите пожалуйста, у меня преподоет молодой аспирант, который не рассказывает и не объясняет.. Нужно написать прогу на питоне из csv в базу данных, с распознованием знаков препинание и разделителя столбцов в csv.. помогите пожалуйсиа smile  smile  smile  smile  smile 
PM MAIL   Вверх
Ch0bits
Дата 31.12.2009, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

Репутация: нет
Всего: 62



У меня такая проблема. Использую консоль виндовс cmd.exe, если выводить в нее текст в юникоде через print то все в порядке.
Код

print u'Привет'

А вот при возбуждении исключений выходит такой косяк.
Код

>>> raise TypeError(u'Привет')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: <unprintable TypeError object>

Как это понимать? Исключения не поддерживают юникод? O_o
PM WWW   Вверх
Virtuos86
Дата 14.1.2010, 05:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 4.12.2009
Где: Томская обл.

Репутация: нет
Всего: нет



 
Цитата(Ch0bits @ 31.12.2009,  09:10)
Как это понимать? Исключения не поддерживают юникод? O_o

Насколько я понимаю, ответ на этот вопрос раскрыли здесь.

Это сообщение отредактировал(а) Virtuos86 - 14.1.2010, 05:44
PM MAIL Jabber   Вверх
Karadul
Дата 10.2.2010, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: нет
Всего: 1



Цитата(srd @  11.6.2007,  11:51 Найти цитируемый пост)
Можешь ещё помедитировать на код метода setencoding() в файле Lib/site.py в том каталоге, где у тебя установлен питон

А нельзя вместо этого написать вначале программы setdefaulencoding четотам и писать как раньше?
PM MAIL   Вверх
pythonwin
Дата 10.2.2010, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(Karadul @  10.2.2010,  20:36 Найти цитируемый пост)
А нельзя вместо этого написать вначале программы setdefaulencoding четотам и писать как раньше? 

это не правильно и это можно прочитать здесь
Презентация: pdf 292.2 Кб
Тезисы: pdf 265.6 Кб
PM WWW GTalk Jabber   Вверх
Karadul
Дата 16.2.2010, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: нет
Всего: 1



А где именно это там написано? Там написано только то, что не надо менять ничего в site.py, иначе прога будет работать только на компе разработчика. Может мне кажется, но можно как-то поставить default encoding в самой программе?
PM MAIL   Вверх
pythonwin
Дата 16.2.2010, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Karadul, посмотри, пожалуйста, ссылки в моём посте чуть выше - там есть ответы.
PM WWW GTalk Jabber   Вверх
Virtuos86
Дата 11.4.2010, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 4.12.2009
Где: Томская обл.

Репутация: нет
Всего: нет



Цитата(iale @ 31.3.2009,  14:24)
 # -*- coding: utf-8 -*-

 Может нужно писать:
#! -*- coding: utf-8 -*-
Потому без бэнга у Вас просто комментарий написан по сути.
PM MAIL Jabber   Вверх
mrDoctorWho
Дата 29.10.2011, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 28.10.2011

Репутация: нет
Всего: нет



Цитата(Virtuos86 @  11.4.2010,  20:28 Найти цитируемый пост)
Может нужно писать:
#! -*- coding: utf-8 -*-
Потому без бэнга у Вас просто комментарий написан по сути.


Насколько я знаю, питону абсолютно без разницы как вы пишете кодировку.

Лично я пишу:
Код

# /* coding: utf-8 */


Или так:
Код

# coding: utf-8


Результат один и тот же.

А проблемы с Unicode я решаю так: 
Код

import sys
reload(sys).setdefaultencoding("utf-8")

PM MAIL   Вверх
pythonwin
Дата 29.10.2011, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 14
Всего: 36



Цитата(mrDoctorWho @  29.10.2011,  14:54 Найти цитируемый пост)
А проблемы с Unicode я решаю так: 

это неправильный метод. ниже выступление Юревича на rupy.ru 2007 об юникоде
Использование Unicode в Python
Использование Unicode в Python. тезисы
PM WWW GTalk Jabber   Вверх
drLans
Дата 21.2.2012, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 11.8.2006

Репутация: нет
Всего: нет



Товарищи, помогите прояснить несколько вопросов по кодировкам. Дело происходит в Windows 7, Python 2.7.

1. Какой кодировкой print декодирует байты для вывода в человеко-понятном виде в этом случае:
Код

# -*- coding: utf-8 -*-
a = 'строка'
print a, repr(a)

Код

строка '\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xba\xd0\xb0'

Что используется, один из уникодов (utf-8, utf-16, ...), cp1251, 866, что-либо ещё? 
Или это зависит от текущей локали?
Код

locale.getpreferredencoding()

Или используется это?
Код

sys.getdefaultencoding()  

Или это?
Код

sys.stdout.encoding

2. Есть файл с русскими символами, и при открытии его в Notepad++ его кодировка определяется как ANSI.
Подскажите, что это за кодировка такая? Где можно увидеть её таблицу?
И как с ней работать из python?

3. Можно ли как-то узнать, в какой кодировке закодирована некая строка?

Это сообщение отредактировал(а) drLans - 21.2.2012, 22:04
PM MAIL   Вверх
Karadul
Дата 21.2.2012, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: нет
Всего: 1



Ух ты, мою тему 2х летней давности апнули. Времена проходят, а проблемы остаются теми же smile))

drLansa у тебя не юникод, так что он выводится как есть байт в байт, то есть в кодировке исходника (в случае repr). В случае print - имхо декодируется в кодировку сосноли.

Ах да, есть знатный костылик на случай, если надо таки вывести любые байты на stdout (например, что из сети получил - то и выдал).

Код

sys.stdout = codecs.getwriter('UTF-8')(sys.stdout)




Это сообщение отредактировал(а) Karadul - 21.2.2012, 19:19
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2162 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.