Уведомления

Группа в Telegram: @pythonsu

#1 Июль 22, 2011 17:21:18

messsir
От:
Зарегистрирован: 2011-07-22
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

перекодировка из OEM 866 в win1251

доброго всем времени суток.

как понятно из заголовка, снова проблема с кодировкой.
перед этим прочитал весь поиск на эту тему, все попробовал, решения так и нашел.
конечно же, я в python новичок, но уже появилась некоторая задача.

имеется такая строчка:

NAME:‡ЂЋ “¬®бЄў >23ав
.¬®в®” >24ЋЇ« в  §   /¬ Ї® „Ё«ҐабЄ®¬г ¤®Ј®
ў®>26аг Ї® бз>27Ґвг >30

если я правильно понимаю, то представлена она в OEM 866, задача отобразить ее в win1251.
если быть точнее, то задача конвертировать несколько сотен файлов в читабельный вид.

пожалуйста, подскажите, как это правильнее сделать. буду очень рад полезным ссылкам на эту тему (гуглом пользовался, толку мало)
работаю под виндой, python 3.2

заранее благодарю!



Офлайн

#2 Июль 22, 2011 18:41:20

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

перекодировка из OEM 866 в win1251

'xxx'.decode('cp866').encode('cp1251')
это для py2,6, для 3,2 что-то подобное

Офлайн

#3 Июль 22, 2011 18:44:30

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

перекодировка из OEM 866 в win1251

а это фокус (для запутывания)

# coding: utf8

s = """NAME:‡ЂЋ "¬®бЄў >23ав
.¬®в®" >24ЋЇ« в § /¬ Ї® „Ё«ҐабЄ®¬г ¤®Ј®
ў®>26аг Ї® бз>27Ґвг >30"""

print s.decode('utf8').encode('cp1251').decode('cp866')
result:
NAME:ЗАО "москв >23рт
.мото" >24Опл т з /м по Дилерскому дого
во>26ру по сч>27ету >30

Офлайн

#4 Июль 22, 2011 19:16:12

messsir
От:
Зарегистрирован: 2011-07-22
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

перекодировка из OEM 866 в win1251

попытался сделать так, как Вы посоветовали…
ругается на следующее:

Traceback (most recent call last):
File "C:/Python32/1", line 5, in <module>
print(s.decode('utf8').encode('cp1251').decode('cp866'))
AttributeError: 'str' object has no attribute 'decode'
если я правильно понимаю, ему не нравится то, что s строковая, а не байтовая.
такое впечатление, что

# coding: utf8
он просто не видит…

ну или я что-то не понимаю, что весьма вероятно :)

в любом случае, спасибо за помощь!



Офлайн

#5 Июль 22, 2011 19:44:36

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

перекодировка из OEM 866 в win1251

Я привел пример для py2.x …, пришлось установить питон 3,2
вот 2 способа, конвертит из файла “1” в “2”

open('2','w',encoding='cp1251').write(open('1','r',encoding='cp866').read())
open('2','bw').write(open('1','br').read().decode('cp866').encode('cp1251'))
в питоне 3,2 байтовая строка указывается с буквой б: b“xxx” (тут есть decode ), но нужно что-б сам исходник был в той кодировке,
либо можно использовать так “xxx”, но сохранить файл в cp866 и написать в начале # coding: cp866

Офлайн

#6 Июль 23, 2011 06:43:50

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9973
Репутация: +  856  -
Профиль   Отправить e-mail  

перекодировка из OEM 866 в win1251

>>> s = """NAME:‡ЂЋ "¬®бЄў >23ав
... ... .¬®в®" >24ЋЇ« в § /¬ Ї® „Ё«ҐабЄ®¬г ¤®Ј®
... ... ў®>26аг Ї® бз>27Ґвг >30"""
>>> s
'NAME:‡ЂЋ "¬®бЄў >23ав\n... .¬®в®" >24ЋЇ« в § /¬ Ї® „Ё«ҐабЄ®¬г ¤®Ј®\n... ў®>26аг Ї® бз>27Ґвг >30'
>>> s.encode('cp1251')
b'NAME:\x87\x80\x8e "\xac\xae\xe1\xaa\xa2 >23\xe0\xe2\n... .\xac\xae\xe2\xae" >24\x8e\xaf\xab \xe2 \xa7 /\xac \xaf\xae \x84\xa8\xab\xa5\xe0\xe1\xaa\xae\xac\xe3 \xa4\xae\xa3\xae\n... \xa2\xae>26\xe0\xe3 \xaf\xae \xe1\xe7>27\xa5\xe2\xe3 >30'
>>> s.encode('cp1251').decode('cp866')
'NAME:ЗАО "москв >23рт\n... .мото" >24Опл т з /м по Дилерскому дого\n... во>26ру по сч>27ету >30'
>>>
messsir
если быть точнее, то задача конвертировать несколько сотен файлов в читабельный вид.
у приложения, в котором смотришь текст, есть отображение в кодировке
так что “читабельный вид” - понятие относительное

messsir
# coding: utf8
в третьем питоне кодировка по умолчанию utf-8

messsir
работаю под виндой, python 3.2
качай python 3.2.1
там исправлен баг input'а
http://bugs.python.org/issue12477

у меня в линуксе все файлы в utf-8 и консоль отображает в utf-8

o7412369815963
open('2','w',encoding='cp1251').write(open('1','r',encoding='cp866').read())
1) сделай import this
2) этот код не закрывает файлы
3) http://docs.python.org/py3k/reference/compound_stmts.html#the-with-statement
второ питон (http://docs.python.org/reference/compound_stmts.html#the-with-statement)



Отредактировано (Июль 23, 2011 06:50:37)

Офлайн

#7 Июль 23, 2011 13:21:53

messsir
От:
Зарегистрирован: 2011-07-22
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

перекодировка из OEM 866 в win1251

o7412369815963
Я привел пример для py2.x …, пришлось установить питон 3,2
вот 2 способа, конвертит из файла “1” в “2”
в питоне 3,2 байтовая строка указывается с буквой б: b“xxx” (тут есть decode ), но нужно что-б сам исходник был в той кодировке,
либо можно использовать так “xxx”, но сохранить файл в cp866 и написать в начале # coding: cp866
Спасибо, теперь все понятно, ясно что делал не так.
py.user.next
у приложения, в котором смотришь текст, есть отображение в кодировке
так что “читабельный вид” - понятие относительное
да, надо было уточнить. я имел ввиду, что нужно открывать в виндовском блокноте.
py.user.next
качай python 3.2.1
там исправлен баг input'а
http://bugs.python.org/issue12477
спасибо, не узнал. установил.
py.user.next
1) сделай import this
2) этот код не закрывает файлы
3) http://docs.python.org/py3k/reference/c … -statement
второ питон (http://docs.python.org/reference/compou … -statement)
благодарю за ссылки и помощь :)



Офлайн

#8 Июль 23, 2011 13:25:08

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

перекодировка из OEM 866 в win1251

py.user.next
1) сделай import this
2) этот код не закрывает файлы
3) http://docs.python.org/py3k/reference/compound_stmts.html#the-with-statement
второ питон (http://docs.python.org/reference/compound_stmts.html#the-with-statement)
Этот код закрывает файлы! т.к. не происходит привязывание к пространству имен и объект разрушается сразу после выполнения. =P
Ты привел полезные ссылки, тебе стоит их почитать.

Офлайн

#9 Июль 23, 2011 13:26:52

messsir
От:
Зарегистрирован: 2011-07-22
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

перекодировка из OEM 866 в win1251

o7412369815963
Ты привел полезные ссылки, тебе стоит их почитать.
уже читаю :)



Офлайн

#10 Июль 24, 2011 06:11:58

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9973
Репутация: +  856  -
Профиль   Отправить e-mail  

перекодировка из OEM 866 в win1251

o7412369815963
Ты привел полезные ссылки, тебе стоит их почитать.
я уточню ещё точнее

http://docs.python.org/py3k/reference/datamodel.html
Objects are never explicitly destroyed; however, when they become unreachable they may be garbage-collected. An implementation is allowed to postpone garbage collection or omit it altogether — it is a matter of implementation quality how garbage collection is implemented, as long as no objects are collected that are still reachable.
Some objects contain references to “external” resources such as open files or windows. It is understood that these resources are freed when the object is garbage-collected, but since garbage collection is not guaranteed to happen, such objects also provide an explicit way to release the external resource, usually a close() method. Programs are strongly recommended to explicitly close such objects. The ‘try…finally‘ statement and the ‘with‘ statement provide convenient ways to do this.
o7412369815963
Этот код закрывает файлы! т.к. не происходит привязывание к пространству имен
на чём основано данное утверждение ?
наверное, ты думаешь, что сборщик мусора, собравший объекты этих файлов, равен их закрытию ?
но что будет, если этот код окажется в каком-нибудь цикле, а сборщик мусора не успеет добраться до этих объектов ?



Отредактировано (Июль 24, 2011 06:14:54)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version