Python и русские буквы
-
- Участник
- Сообщения: 94
- Зарегистрирован: 05 июл 2010, 07:58
- Репутация: 0
Python и русские буквы
Добрый день!
Начал тут недавно изучать Python. Решил сделать список папок в каталоге, чтобы пристегнуть к аркгисовскому Моделбилдеру, но че-то не соображу, как научить его понимать русские буквы. Получается типа ['N:\\\xce\xf2\xe4\xe5\xeb\xfb\\\ ... и т.п.
Кто в курсе, подскажите что делать.
Заранее спасибо.
Начал тут недавно изучать Python. Решил сделать список папок в каталоге, чтобы пристегнуть к аркгисовскому Моделбилдеру, но че-то не соображу, как научить его понимать русские буквы. Получается типа ['N:\\\xce\xf2\xe4\xe5\xeb\xfb\\\ ... и т.п.
Кто в курсе, подскажите что делать.
Заранее спасибо.
Жизнь - это эксперимент, поставленный на себе.
-
- Гуру
- Сообщения: 2627
- Зарегистрирован: 29 мар 2007, 14:12
- Репутация: 34
- Откуда: Ukraine
Re: Python и русские буквы
Типичная проблема . Используйте UTF-8 для исходников, т.е. код редактируйте в редакторе, который умеет UTF-8, а в самое начало файла добавьте строку
Далее, ознакомтесь с Unicode HOWTO
Код: Выделить всё
# -*- coding: utf-8 -*-
-
- Гуру
- Сообщения: 588
- Зарегистрирован: 30 мар 2009, 21:53
- Репутация: 55
- Откуда: Королев
Re: Python и русские буквы
Мне кажется у товарища все таки проблема не с текстом исходника а с выводом значений.
Попробуйте: unicode_var.encode('utf-8')
или, если вы в консоли windows: unicode_var.encode('cp1251')
Попробуйте: unicode_var.encode('utf-8')
или, если вы в консоли windows: unicode_var.encode('cp1251')
-
- Гуру
- Сообщения: 2627
- Зарегистрирован: 29 мар 2007, 14:12
- Репутация: 34
- Откуда: Ukraine
Re: Python и русские буквы
Вижу . В Unicode HOWTO про это написаноyellow-sky писал(а):Мне кажется у товарища все таки проблема не с текстом исходника а с выводом значений.
Последний раз редактировалось Voltron 24 янв 2012, 12:37, всего редактировалось 1 раз.
-
- Участник
- Сообщения: 94
- Зарегистрирован: 05 июл 2010, 07:58
- Репутация: 0
Re: Python и русские буквы
В исходниках у меня все ок. Проблема получается при выводе:
import os, glob
L = []
for root, dirs, files in os.walk('N:\Фондовые материалы'):
L.append(root)
Спасибо за ответ. Пойду смотреть Unicode HOWTO.
А еще у меня по ходу дела вопрос: как в этом os.walk обозначить, чтобы прога заходила только в каждый 1-й вложенный каталог, а не во все подряд (2, 3 уровня и т.п.)?
import os, glob
L = []
for root, dirs, files in os.walk('N:\Фондовые материалы'):
L.append(root)
Спасибо за ответ. Пойду смотреть Unicode HOWTO.
А еще у меня по ходу дела вопрос: как в этом os.walk обозначить, чтобы прога заходила только в каждый 1-й вложенный каталог, а не во все подряд (2, 3 уровня и т.п.)?
Жизнь - это эксперимент, поставленный на себе.
-
- Участник
- Сообщения: 94
- Зарегистрирован: 05 июл 2010, 07:58
- Репутация: 0
Re: Python и русские буквы
Работаю в консоли под windows. У меня Питон 2,5 установленный за счет АркГИС-931.
Прочитал Unicode HOWTO. Там много написано про файлы, а вот про каталоги нашел только про строки '.' или u'.'
Проверил >>> sys.getfilesystemencoding() - 'mbcs'
Вижу, что прога работает: получается или
print os.listdir('D:\Test data')
['Test', '\xd2\xe5\xf1\xf2'] – пишет по-старому
или print os.listdir(u'D:\Test data')
[u'Test', u'\u0422\u0435\u0441\u0442'] – т.е. реакция есть, но русских букв нет.
А если сразу пишешь путь с русскими буквами, >>> print os.listdir(u'D:\Test data\Тест')
то .. WindowsError: [Error 3] : u'D:\\Test data\\\xd2\xe5\xf1\xf2\\*.*'
А вот куда бы приспособить unicode_var.encode('cp1251') так, к своему стыду, и не нашел.
Прочитал Unicode HOWTO. Там много написано про файлы, а вот про каталоги нашел только про строки '.' или u'.'
Проверил >>> sys.getfilesystemencoding() - 'mbcs'
Вижу, что прога работает: получается или
print os.listdir('D:\Test data')
['Test', '\xd2\xe5\xf1\xf2'] – пишет по-старому
или print os.listdir(u'D:\Test data')
[u'Test', u'\u0422\u0435\u0441\u0442'] – т.е. реакция есть, но русских букв нет.
А если сразу пишешь путь с русскими буквами, >>> print os.listdir(u'D:\Test data\Тест')
то .. WindowsError: [Error 3] : u'D:\\Test data\\\xd2\xe5\xf1\xf2\\*.*'
А вот куда бы приспособить unicode_var.encode('cp1251') так, к своему стыду, и не нашел.
Жизнь - это эксперимент, поставленный на себе.
-
- Гуру
- Сообщения: 2627
- Зарегистрирован: 29 мар 2007, 14:12
- Репутация: 34
- Откуда: Ukraine
Re: Python и русские буквы
Как-то такSerp писал(а):А вот куда бы приспособить unicode_var.encode('cp1251') так, к своему стыду, и не нашел.
Код: Выделить всё
dir = u'D:\Test data\Тест'
print dir.encode('cp866')
-
- Гуру
- Сообщения: 588
- Зарегистрирован: 30 мар 2009, 21:53
- Репутация: 55
- Откуда: Королев
Re: Python и русские буквы
Угу, именно так. Совсем разучился писать для мастдай консоли.Voltron писал(а):Как-то такSerp писал(а):А вот куда бы приспособить unicode_var.encode('cp1251') так, к своему стыду, и не нашел.Код: Выделить всё
dir = u'D:\Test data\Тест' print dir.encode('cp866')
-
- Участник
- Сообщения: 94
- Зарегистрирован: 05 июл 2010, 07:58
- Репутация: 0
Re: Python и русские буквы
Я на консоли пишу для обучения - так быстрее результат получается. Сделал скрипты (правда с выводом опять же в консоль) - тоже самое. Вобщем, я понял, что вы, как и все порядочные люди, просто используете только английские символы. У нас раньше тоже так было, но со временем обросли и русскими, т.к. виндовоз позволяет. Скрипт на VBA под Экселем собирает список каталогов по-русски за пару секунд, а тут получилась заморочка.
Кстати, в скрипте cp1251 нормально задалось в 1-й строке (# -*- и т.д.).
Файлы читает и путь понимает, если ему напрямую задать путь:
>>> reader = csv.reader(open("D:\Test data\Тест\Текст.csv", "rb"))
>>> for row in reader:
print row
['a', 'b', 'c']
['\xe0', '\xe1', '\xe2'] - здесь а,б,в. Т.е. все работает, но мне-то надо именно собрать список папок в каталоге.
Попробовал конвертнуть это \xe0' в нормальные буквы, чтобы дальше передать, но в файле cp1251.py указаны такие соответствия с юникодом:
u'\u0441' # 0xF1 -> CYRILLIC SMALL LETTER ES
u'\u0442' # 0xF2 -> CYRILLIC SMALL LETTER TE
Вот между ними-то он и пляшет - вместо 'Тест' печатает:
или ['\xd2\xe5\xf1\xf2'] или [u'\u0422\u0435\u0441\u0442'] - на выбор .
Ладно, надо еще хэлп почитать, может где что и попадется. Кто заглянет сюда даже через месяц - не стесняйтесь, пишите )
Ну и на счет 2-го вопроса тоже: как в этом os.walk обозначить, чтобы прога заходила только в каждый 1-й вложенный каталог, а не во все подряд (2, 3 уровня и т.п.)? (а то у ней времени не хватит)
Спасибо за помощь.
Кстати, в скрипте cp1251 нормально задалось в 1-й строке (# -*- и т.д.).
Файлы читает и путь понимает, если ему напрямую задать путь:
>>> reader = csv.reader(open("D:\Test data\Тест\Текст.csv", "rb"))
>>> for row in reader:
print row
['a', 'b', 'c']
['\xe0', '\xe1', '\xe2'] - здесь а,б,в. Т.е. все работает, но мне-то надо именно собрать список папок в каталоге.
Попробовал конвертнуть это \xe0' в нормальные буквы, чтобы дальше передать, но в файле cp1251.py указаны такие соответствия с юникодом:
u'\u0441' # 0xF1 -> CYRILLIC SMALL LETTER ES
u'\u0442' # 0xF2 -> CYRILLIC SMALL LETTER TE
Вот между ними-то он и пляшет - вместо 'Тест' печатает:
или ['\xd2\xe5\xf1\xf2'] или [u'\u0422\u0435\u0441\u0442'] - на выбор .
Ладно, надо еще хэлп почитать, может где что и попадется. Кто заглянет сюда даже через месяц - не стесняйтесь, пишите )
Ну и на счет 2-го вопроса тоже: как в этом os.walk обозначить, чтобы прога заходила только в каждый 1-й вложенный каталог, а не во все подряд (2, 3 уровня и т.п.)? (а то у ней времени не хватит)
Спасибо за помощь.
Жизнь - это эксперимент, поставленный на себе.
-
- Гуру
- Сообщения: 2627
- Зарегистрирован: 29 мар 2007, 14:12
- Репутация: 34
- Откуда: Ukraine
Re: Python и русские буквы
И это тоже. Но главная причина в другом, мы пользуемся правильными ОС, где нет такого бардака с кодировками .Serp писал(а):Вобщем, я понял, что вы, как и все порядочные люди, просто используете только английские символы.
Выше же написано. Объекты unicode перед выводом в консоль надо конвертировать в соответствующую кодировку, в данном случае CP866. Вот примерSerp писал(а):Я на консоли пишу для обучения - так быстрее результат получается. Сделал скрипты (правда с выводом опять же в консоль) - тоже самое.
Код: Выделить всё
# -*- coding: utf-8 -*-
import os
for root, dirs, files in os.walk( u"D:/Books/" ):
print "Looking in ", root.encode( "cp866" )
print "\tsubdirectories:"
for d in dirs:
print "\t",d.encode( "cp866" )
print "\tfiles:"
for f in files:
print "\t",f.encode( "cp866" )
print "\n"
Код: Выделить всё
Looking in D:\Books\Ф_Брукc_мл
subdirectories:
files:
Мифический_человекомесяц.rtf
Looking in D:\Books\О_Уайльд
subdirectories:
Пьесы
Сказки
files:
Портрет_Дориана_Грея.rtf
Looking in D:\Books\О_Уайльд\Пьесы
subdirectories:
files:
Веер_леди_Уиндермир.rtf
Женщина, не стоящая внимания.rtf
Идеальный муж.rtf
...
Никак. Вам надо свою проверку вставить внутри цикла обработки.Serp писал(а):Ну и на счет 2-го вопроса тоже: как в этом os.walk обозначить, чтобы прога заходила только в каждый 1-й вложенный каталог, а не во все подряд (2, 3 уровня и т.п.)? (а то у ней времени не хватит)
-
- Участник
- Сообщения: 94
- Зарегистрирован: 05 июл 2010, 07:58
- Репутация: 0
Re: Python и русские буквы
Ух, ты...!! Проверил - заработало.
Спасибо!
Ладно, буду теперь с циклами разбираться. А то почти 3 минуты каталог собирает, хотя в бэйсике до 1-го уровня всего пару секунд.
Спасибо!
Ладно, буду теперь с циклами разбираться. А то почти 3 минуты каталог собирает, хотя в бэйсике до 1-го уровня всего пару секунд.
Жизнь - это эксперимент, поставленный на себе.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 35 гостей