Форум сайта python.su
Я пытался читать и гуглить, но найденное было сложновато. Хотелось бы получить пример, уверен, что это раз плюнуть любому специалисту. Спасибо.
У меня простая задача. Пытаюсь получить список файлов из папки, в пути есть кириллица.
Мой код:
import os
basedir = "C:/temp/куку"
os.listdir(basedir)
Офлайн
import os
basedir = "C:/temp/куку".decode()
os.listdir(basedir)
Офлайн
Не знаю как на маздайке, но у меня так работало:
basedir = u"/home/rodegast/РусскийКаталог/"
Офлайн
basedir = “C:/temp/куку”.decode()
выдает ошибку
basedir = u“C:/temp/куку”
работает!
Большое спасибо. Мне казалось я это пробовал, но видимо запутался в папках. Да, это было Win, Python 2.5.2
Офлайн
Питон для windows file names использует кодировку mbsc.
Для самого питона может стоять другая - например, проставляют в начале файла
# -*- coding: <encoding-name> -*-
Чтобы работало всегда, нужно
basedir = u“/home/rodegast/РусскийКаталог/”
basedir = basedir.encode('mbsc')
Последняя строка автоматически подменяется на Py_FileSystemDefaultEncoding если аргумент был в unicode - и ее в принципе можно опустить.
Для некитайских языков Py_FileSystemDefaultEncoding совпадает с установками винды. Т.е если в control panel стоит cp1251 - то mbsc именно она и есть.
Существуют и другие чудеса. MBSC пытается выдать максимально похожий по начертанию символ.
Т.е. если язык по умолчанию русский, а нужно перекодировать немецкое ‘a’ с амляутом (две точки над буквой) - получится просто английское ‘a’.
Надеюсь, в такие дебри залезать не прийдется.
Обратите внимание - изначально basedir была в юникоде, по правилам для конкретного модуля, в котором эта строка встретилась.
Если был просто ascii - нужно переконвертировать сначала в unicode, а потом в mbsc.
Например
basedir = “/home/rodegast/РусскийКаталог/”
basedir = basedir.decode('cp1251')
basedir = basedir.encode('mbsc')
P.S.
В тройке введено хорошее правило - строки только в unicode. Избавляет от путанницы. Но тройка будет в массовом использовании только через год-два, так что пока приходится уделять особое внимание кодировкам - и частота задаваемых вопросов на этом форуме тому подтверждение.
Офлайн
my_path=(sys.path).decode('cp1251') # !!! спасло ****************
#.encode('mbsc')
# LookupError: unknown encoding: mbsc
p.s. спасло, но как-то локально, в другом месте того же блока кода не проканало. не помогают так же кодировки 866, koi. Кто-нить дайте ссылочку на урок по работе с юникодом.
Отредактировано (Окт. 21, 2010 21:53:10)
Офлайн