Python и русские буквы

Все остальное, мало относящееся к ГИС.
Ответить
Serp
Участник
Сообщения: 94
Зарегистрирован: 05 июл 2010, 07:58
Репутация: 0

Python и русские буквы

Сообщение Serp » 23 янв 2012, 12:01

Добрый день!
Начал тут недавно изучать Python. Решил сделать список папок в каталоге, чтобы пристегнуть к аркгисовскому Моделбилдеру, но че-то не соображу, как научить его понимать русские буквы. Получается типа ['N:\\\xce\xf2\xe4\xe5\xeb\xfb\\\ ... и т.п.

Кто в курсе, подскажите что делать.
Заранее спасибо.
Жизнь - это эксперимент, поставленный на себе.

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Python и русские буквы

Сообщение Voltron » 23 янв 2012, 15:47

Типичная проблема :-). Используйте UTF-8 для исходников, т.е. код редактируйте в редакторе, который умеет UTF-8, а в самое начало файла добавьте строку

Код: Выделить всё

# -*- coding: utf-8 -*-
Далее, ознакомтесь с Unicode HOWTO

yellow-sky
Гуру
Сообщения: 588
Зарегистрирован: 30 мар 2009, 21:53
Репутация: 55
Откуда: Королев

Re: Python и русские буквы

Сообщение yellow-sky » 23 янв 2012, 19:14

Мне кажется у товарища все таки проблема не с текстом исходника а с выводом значений.
Попробуйте: unicode_var.encode('utf-8')
или, если вы в консоли windows: unicode_var.encode('cp1251')

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Python и русские буквы

Сообщение Voltron » 23 янв 2012, 20:41

yellow-sky писал(а):Мне кажется у товарища все таки проблема не с текстом исходника а с выводом значений.
Вижу :-). В Unicode HOWTO про это написано
Последний раз редактировалось Voltron 24 янв 2012, 12:37, всего редактировалось 1 раз.

Serp
Участник
Сообщения: 94
Зарегистрирован: 05 июл 2010, 07:58
Репутация: 0

Re: Python и русские буквы

Сообщение Serp » 24 янв 2012, 04:42

В исходниках у меня все ок. Проблема получается при выводе:
import os, glob
L = []
for root, dirs, files in os.walk('N:\Фондовые материалы'):
L.append(root)

Спасибо за ответ. Пойду смотреть Unicode HOWTO.
А еще у меня по ходу дела вопрос: как в этом os.walk обозначить, чтобы прога заходила только в каждый 1-й вложенный каталог, а не во все подряд (2, 3 уровня и т.п.)?
Жизнь - это эксперимент, поставленный на себе.

Serp
Участник
Сообщения: 94
Зарегистрирован: 05 июл 2010, 07:58
Репутация: 0

Re: Python и русские буквы

Сообщение Serp » 24 янв 2012, 12:10

Работаю в консоли под 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') так, к своему стыду, и не нашел.
Жизнь - это эксперимент, поставленный на себе.

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Python и русские буквы

Сообщение Voltron » 24 янв 2012, 12:32

Serp писал(а):А вот куда бы приспособить unicode_var.encode('cp1251') так, к своему стыду, и не нашел.
Как-то так

Код: Выделить всё

dir = u'D:\Test data\Тест'
print dir.encode('cp866')

yellow-sky
Гуру
Сообщения: 588
Зарегистрирован: 30 мар 2009, 21:53
Репутация: 55
Откуда: Королев

Re: Python и русские буквы

Сообщение yellow-sky » 24 янв 2012, 15:39

Voltron писал(а):
Serp писал(а):А вот куда бы приспособить unicode_var.encode('cp1251') так, к своему стыду, и не нашел.
Как-то так

Код: Выделить всё

dir = u'D:\Test data\Тест'
print dir.encode('cp866')
Угу, именно так. Совсем разучился писать для мастдай консоли.

Serp
Участник
Сообщения: 94
Зарегистрирован: 05 июл 2010, 07:58
Репутация: 0

Re: Python и русские буквы

Сообщение Serp » 25 янв 2012, 13:10

Я на консоли пишу для обучения - так быстрее результат получается. Сделал скрипты (правда с выводом опять же в консоль) - тоже самое. Вобщем, я понял, что вы, как и все порядочные люди, просто используете только английские символы. У нас раньше тоже так было, но со временем обросли и русскими, т.к. виндовоз позволяет. Скрипт на 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 уровня и т.п.)? (а то у ней времени не хватит)
Спасибо за помощь.
Жизнь - это эксперимент, поставленный на себе.

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Python и русские буквы

Сообщение Voltron » 25 янв 2012, 13:48

Serp писал(а):Вобщем, я понял, что вы, как и все порядочные люди, просто используете только английские символы.
И это тоже. Но главная причина в другом, мы пользуемся правильными ОС, где нет такого бардака с кодировками :-).
Serp писал(а):Я на консоли пишу для обучения - так быстрее результат получается. Сделал скрипты (правда с выводом опять же в консоль) - тоже самое.
Выше же написано. Объекты unicode перед выводом в консоль надо конвертировать в соответствующую кодировку, в данном случае CP866. Вот пример

Код: Выделить всё

# -*- 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 уровня и т.п.)? (а то у ней времени не хватит)
Никак. Вам надо свою проверку вставить внутри цикла обработки.

Serp
Участник
Сообщения: 94
Зарегистрирован: 05 июл 2010, 07:58
Репутация: 0

Re: Python и русские буквы

Сообщение Serp » 26 янв 2012, 07:17

Ух, ты...!! Проверил - заработало.
Спасибо!
Ладно, буду теперь с циклами разбираться. А то почти 3 минуты каталог собирает, хотя в бэйсике до 1-го уровня всего пару секунд.
Жизнь - это эксперимент, поставленный на себе.

Ответить

Вернуться в «Все остальное»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 35 гостей