Найти - Пользователи
Полная версия: кодировка в путях возвращаемых модулями, как узнать ? как сделать одинаковой.
Начало » Python для новичков » кодировка в путях возвращаемых модулями, как узнать ? как сделать одинаковой.
1
Luke
например такой скрипт:
#!/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 ?

Всё писать на английском не предлагать !, вам же не предлагают писать на асемблере.
reclosedev
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 не распечатаются все равно.
Luke
Спасибо за ответ.
Судя по документации на винде файловые имена в юникоде, зачем их переводят в “mbcs” непонял.
some_path = unicode(sys.path[0], sys.getfilesystemencoding())
работает, но это несколько не то чего я хотел, это кодирует один элемент списка. Можно ли заставить модуль sys.path сразу возвращать список в юникоде (аналогично glob), нечто вроде sys.wcspath (как в си).
print нормально выводит отдельные юникод строки, а вот списки нет, это можно как то исправить ? или только в цикле поэлементно выводить?

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

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

Задача скрипта - обработать все файлы с изображениями из директории (и поддиректорий) в которой он находится. Папка, файлы естественно могут иметь имена на русском. Сразу напоролся на траблы с путями, но даже посмотреть их для отладки - проблема.
py.user.next
Luke
Задача скрипта - обработать все файлы с изображениями из директории (и поддиректорий) в которой он находится. Папка, файлы естественно могут иметь имена на русском. Сразу напоролся на траблы с путями, но даже посмотреть их для отладки - проблема.
эти проблемы (неудобства) во втором питоне
в третьем нормально отображается
>>> import glob
>>> glob.glob('*.txt')
['файл.txt']
>>>
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB