Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 29, 2009 09:29:25

sim
От:
Зарегистрирован: 2009-08-29
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Список файлов из папки с кириллицей в названии

Я пытался читать и гуглить, но найденное было сложновато. Хотелось бы получить пример, уверен, что это раз плюнуть любому специалисту. Спасибо.

У меня простая задача. Пытаюсь получить список файлов из папки, в пути есть кириллица.

Мой код:

import os
basedir = "C:/temp/куку"
os.listdir(basedir)
и ошибка:

Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
WindowsError: The system cannot find the path specified: ‘c:\\temp\\\x
aa\xe3\xaa\xe3/*.*’



Офлайн

#2 Авг. 29, 2009 10:28:59

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Список файлов из папки с кириллицей в названии

import os
basedir = "C:/temp/куку".decode()
os.listdir(basedir)
так работает?

У меня ФС в utf-8 и ошибка не возникает, подозреваю, если перекодировать путь в юникод, то должно сработать. Симулировал ошибку перекодированием basedit в cp1251. Питон 2.6, линупс.



Офлайн

#3 Авг. 29, 2009 10:32:51

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2790
Репутация: +  185  -
Профиль   Отправить e-mail  

Список файлов из папки с кириллицей в названии

Не знаю как на маздайке, но у меня так работало:

basedir = u"/home/rodegast/РусскийКаталог/"



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#4 Авг. 29, 2009 10:37:37

sim
От:
Зарегистрирован: 2009-08-29
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Список файлов из папки с кириллицей в названии

basedir = “C:/temp/куку”.decode()

выдает ошибку

basedir = u“C:/temp/куку”

работает!

Большое спасибо. Мне казалось я это пробовал, но видимо запутался в папках. Да, это было Win, Python 2.5.2



Офлайн

#5 Авг. 29, 2009 12:26:55

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Список файлов из папки с кириллицей в названии

Питон для 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. Избавляет от путанницы. Но тройка будет в массовом использовании только через год-два, так что пока приходится уделять особое внимание кодировкам - и частота задаваемых вопросов на этом форуме тому подтверждение.



Офлайн

#6 Окт. 19, 2010 21:37:16

Didis
От:
Зарегистрирован: 2010-01-17
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Список файлов из папки с кириллицей в названии

my_path=(sys.path).decode('cp1251') # !!! спасло ****************
#.encode('mbsc')
# LookupError: unknown encoding: mbsc

p.s. спасло, но как-то локально, в другом месте того же блока кода не проканало. не помогают так же кодировки 866, koi. Кто-нить дайте ссылочку на урок по работе с юникодом.



Отредактировано (Окт. 21, 2010 21:53:10)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version