Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 19, 2012 12:49:48

Luke
От:
Зарегистрирован: 2010-11-29
Сообщения: 30
Репутация: +  3  -
Профиль   Отправить e-mail  

кодировка в путях возвращаемых модулями, как узнать ? как сделать одинаковой.

например такой скрипт:

#!/usr/bin/env python
# -*- coding: utf_8 -*-
import sys
import glob
path = sys.path
print type(path[0]), path
listfiles=glob.glob(ur"D:\Documents and Settings\Пользователь\Рабочий стол\*.txt")
print type(listfiles[0]), listfiles
raw_input()
Запускается с рабочего стола например.
На английской системе все работает, как получить то же но на русской или китайской (где выводит сплошные крякозяблы) ?
1 sys.path элементы имеют тип str, кодировка неизвестна в общем случае
2 listfiles элементы типа unicode. Отличается от sys.path
3 как сделать
listfiles=glob.glob(path[0]+ur"*.txt")
4 как сделать чтоб sys.path элементы возвращались типа unicode? glob может вернуть и типа str
5 как все это читаемо вывести в консоль? угадывать кодировку для decode ?

Всё писать на английском не предлагать !, вам же не предлагают писать на асемблере.



Офлайн

#2 Ноя. 19, 2012 17:53:11

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

кодировка в путях возвращаемых модулями, как узнать ? как сделать одинаковой.

Luke
1 sys.path элементы имеют тип str, кодировка неизвестна в общем случае
http://docs.python.org/2/library/sys.html#sys.getfilesystemencoding

Luke
4 как сделать чтоб sys.path элементы возвращались типа unicode?
some_path = unicode(sys.path[0], sys.getfilesystemencoding())

Luke
5 как все это читаемо вывести в консоль? угадывать кодировку для decode ?
Печатать Юникод. Но символы, которых нет в виндово-консольной кодировке cp866 не распечатаются все равно.

Офлайн

#3 Ноя. 19, 2012 20:23:48

Luke
От:
Зарегистрирован: 2010-11-29
Сообщения: 30
Репутация: +  3  -
Профиль   Отправить e-mail  

кодировка в путях возвращаемых модулями, как узнать ? как сделать одинаковой.

Спасибо за ответ.
Судя по документации на винде файловые имена в юникоде, зачем их переводят в “mbcs” непонял.

some_path = unicode(sys.path[0], sys.getfilesystemencoding())
работает, но это несколько не то чего я хотел, это кодирует один элемент списка. Можно ли заставить модуль sys.path сразу возвращать список в юникоде (аналогично glob), нечто вроде sys.wcspath (как в си).
print нормально выводит отдельные юникод строки, а вот списки нет, это можно как то исправить ? или только в цикле поэлементно выводить?

Наверно это всё уже обсуждалось, но не могу найти. Поиск на форуме не работает странно работает с русскими словами, неужели тоже проблемы с кодировкой. “Печатать Юникод” - найдено 0 !, хотя из поста выше.



Отредактировано Luke (Ноя. 19, 2012 20:44:28)

Офлайн

#4 Ноя. 19, 2012 21:12:50

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

кодировка в путях возвращаемых модулями, как узнать ? как сделать одинаковой.

Luke
работает, но это несколько не то чего я хотел, это кодирует один элемент списка. Можно ли заставить модуль sys.path сразу возвращать список в юникоде
Вроде только вручную:
encoding = sys.getfilesystemencoding()
unipath = [unicode(x, encoding) for x in sys.path]

Luke
print нормально выводит отдельные юникод строки, а вот списки нет, это можно как то исправить ? или только в цикле поэлементно выводить?
Можно извратиться:
lst = [u'Тест', u'Тест']
print lst
print repr(lst).decode("unicode_escape") 
# [u'\u0422\u0435\u0441\u0442', u'\u0422\u0435\u0441\u0442']
# [u'Тест', u'Тест']
или http://softwaremaniacs.org/forum/python/25696/

Не понятно, зачем может понадобится печать списка, кроме как для отладки. Если бы Вы объяснили, зачем все это, возможно предложили бы другие решения.

Офлайн

#5 Ноя. 19, 2012 22:15:24

Luke
От:
Зарегистрирован: 2010-11-29
Сообщения: 30
Репутация: +  3  -
Профиль   Отправить e-mail  

кодировка в путях возвращаемых модулями, как узнать ? как сделать одинаковой.

Печать списка именно для отладки.
Вообще пытаюсь выяснить нормальный способ работы над строчками в Python. Чтобы их можно было все однозначно обрабатывать, складывать, печатать (как английские) без постоянных траблов с кодировками. Думал обрабатывать всё в юникоде. Часто попадаются программы на python не способные работать при русских символах в путях (например имя пользователя, или рабочий стол)

Задача скрипта - обработать все файлы с изображениями из директории (и поддиректорий) в которой он находится. Папка, файлы естественно могут иметь имена на русском. Сразу напоролся на траблы с путями, но даже посмотреть их для отладки - проблема.



Офлайн

#6 Ноя. 20, 2012 02:50:49

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

кодировка в путях возвращаемых модулями, как узнать ? как сделать одинаковой.

Luke
Задача скрипта - обработать все файлы с изображениями из директории (и поддиректорий) в которой он находится. Папка, файлы естественно могут иметь имена на русском. Сразу напоролся на траблы с путями, но даже посмотреть их для отладки - проблема.
эти проблемы (неудобства) во втором питоне
в третьем нормально отображается
>>> import glob
>>> glob.glob('*.txt')
['файл.txt']
>>>



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version