Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 8, 2010 14:35:52

beliy_shum
От:
Зарегистрирован: 2009-03-11
Сообщения: 67
Репутация: +  0  -
Профиль   Отправить e-mail  

В Python 3.1.2 не возможно прочитать файл в котором есть буква "И"

простейший скрипт:

# -*- coding: cp1251 -*-
f=open("test1.csv", 'r')#откроем файл для чтения
#print(f.readline())
#f=codecs.EncodedFile(f,"cp1251","utf-8")# кодировка данных cp1251 файла - utf-8
f1=open("test.csv", 'w')#откроем файл для чтения
for l in f:
print(l)
f1.write(f.readline())
выкидывает ошибку:

Traceback (most recent call last):
File "test2.py", line 6, in <module>
for l in f:
File "C:\Python31\lib\encodings\cp1251.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 517: character maps to <undefined>
как только я из текста убираю большую русскую букву И то все сразу начинает работать.

Что делать? Программирование это логика, или танцы с бубном?*

у многих такая проблема:
http://yandex.ru/yandsearch?text=UnicodeDecodeError:+'charmap'+codec+can't+decode++character+maps+to+%3Cundefined%3E&lr=213
http://ru.wikisource.org/wiki/%D0%9F%D0%BE%D0%B3%D1%80%D1%83%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_Python_3_(%D0%9F%D0%B8%D0%BB%D0%B3%D1%80%D0%B8%D0%BC)/%D0%A4%D0%B0%D0%B9%D0%BB%D1%8B

Спасибо всем за советы



Офлайн

#2 Ноя. 8, 2010 15:19:40

beliy_shum
От:
Зарегистрирован: 2009-03-11
Сообщения: 67
Репутация: +  0  -
Профиль   Отправить e-mail  

В Python 3.1.2 не возможно прочитать файл в котором есть буква "И"

Такая ошибка появляется только если пытаться перекодировать utf-8 в cp1251



Офлайн

#3 Ноя. 8, 2010 16:23:39

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

В Python 3.1.2 не возможно прочитать файл в котором есть буква "И"

beliy_shum
Программирование это логика, или танцы с бубном?*
это логика, нужно знать что хочешь сделать.

у меня нет питона31 и винды, но так должно работать:
open("test.csv", 'w').write( open("test1.csv", 'r').read().decode('cp1251').encode('utf8') )
читаем, декодируем из ср1251, кодируем в утф8, пишем

Офлайн

#4 Ноя. 8, 2010 17:38:25

ofigetitelno
От:
Зарегистрирован: 2006-08-01
Сообщения: 136
Репутация: +  0  -
Профиль   Отправить e-mail  

В Python 3.1.2 не возможно прочитать файл в котором есть буква "И"

:)
когда же люди начнут читать документацию?
http://docs.python.org/py3k/library/functions.html?highlight=open#open
посмотрите на параметр encoding



Офлайн

#5 Ноя. 9, 2010 13:22:36

beliy_shum
От:
Зарегистрирован: 2009-03-11
Сообщения: 67
Репутация: +  0  -
Профиль   Отправить e-mail  

В Python 3.1.2 не возможно прочитать файл в котором есть буква "И"

ofigetitelno
посмотрите на параметр encoding
как видно из моего кода я кодировку указывал явно(например такой код не работает):
import codecs
f=open("test1.csv", 'r')
f=codecs.EncodedFile(f,"utf-8","utf-8")# кодировка данных - utf-8, файла - тоже utf-8
f1=open("test.csv", 'w')
f1=codecs.EncodedFile(f,"utf-8","utf-8")# кодировка данных - utf-8, файла - тоже utf-8
f1.write(f.readline())
Чем плох такой код и почему он выкидывает “TypeError: can't concat bytes to str”?

А если передать кодировку прямо в функцию, то всё работает, спасибо.
Но это только пример, а на самом деле
f1=codecs.EncodedFile(f,"cp1251","utf-8")
я использую, чтобы внутри программы иметь дело с 1251, сразу, без утомительных дополнительных перекодировок.

P.S. Я знаю что внутри программы нужно работать с utf-8, но если использовать utf-8 то не работают многие функции(начиная от сложностями сортировки, заканчивая банальной str.lower() )



Отредактировано (Ноя. 9, 2010 13:26:14)

Офлайн

#6 Ноя. 9, 2010 15:12:07

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

В Python 3.1.2 не возможно прочитать файл в котором есть буква "И"

Если желаете использовать EncodedFile - файл открывайте в двоичном режиме - через ‘rb’ или ‘wb’.
Действительно, строки с байтами не клеятся, к счастью. К слову, EncodedFile со строками вообще не работает.

Слухи о сложностях utf8 не соответствуют действительности.
К тому же, если у вас python 3.1 - к чему это? В программе все - юникодные строки. Байтами в какой-либо кодировке они становятся только на вводе-выводе.

З.Ы. Документацию таки прочитать не вышло?



Офлайн

#7 Ноя. 9, 2010 15:46:10

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

В Python 3.1.2 не возможно прочитать файл в котором есть буква "И"

Несмотря на то, что с выходом третьей версии питона проблемы с кодировками были полностью решены, у некоторых они всё ещё случаются. Инерционность общества?



Офлайн

#8 Ноя. 10, 2010 13:24:58

beliy_shum
От:
Зарегистрирован: 2009-03-11
Сообщения: 67
Репутация: +  0  -
Профиль   Отправить e-mail  

В Python 3.1.2 не возможно прочитать файл в котором есть буква "И"

подскажите пожалуйста что мне читать из документации. документацию я читаю, но с кодировками проблемы у меня как были, так и остаются. Спасибо.
Разве методы строк и регулярных выражений корректно работают в юникоде? Я не понимаю какие методы мне использовать. Если существует универсальный ответ, поделитесь пожалуйста.



Офлайн

#9 Ноя. 10, 2010 13:46:43

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

В Python 3.1.2 не возможно прочитать файл в котором есть буква "И"

Мы же говорим о третьем питоне, верно?
Строки и регулярные выражения - работают.
Более того, регулярки на байтах, например, не работают с не ASCII символами.

Что у вас не получается?

Кстати, для вас юникод - это что?

В тройке все строки - юникодные. Это те, которые ‘строка’, тип str.
Байты начинаются с префикса b - b'строка байт', тип bytes.

Байты могут быть в разных кодировках, строки кодировки не имеют.

utf-8 - это не юникод.



Отредактировано (Ноя. 10, 2010 14:06:31)

Офлайн

#10 Ноя. 11, 2010 16:32:25

rst16
От:
Зарегистрирован: 2010-07-24
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

В Python 3.1.2 не возможно прочитать файл в котором есть буква "И"

Почему бы не open('name.txt', encoding='utf-8')



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version