LINUX.ORG.RU

[python] os.listdir и русские имена файлов и директорий

 


0

1

На диске есть разделы с русскими именами файлов и директорий. Питоновские os.walk, os.listdir и другие аналогичные функции читают такие имена файлов и директорий как, "???????". Последующая обрабодка файлов с такими именами невозможна:

In [18]: z = os.listdir(theDir)

In [19]: print z

['python-outfile.txt', '??? ???????']

In [20]: [os.path.isdir(f) for f in z]

Out[20]: [False, False]

В данном случае второй файл (тот, который с вопросиками) является директорией под гордым именем «Мои Рисунки».

Как решить эту проблему?

★★

Мб настроить эти ваши локали:

$ mkdir лол
$ python
Python 2.6.4 (r264:75706, Dec 11 2009, 18:24:54) 
[GCC 4.3.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.listdir(".")
['\xd0\xbb\xd0\xbe\xd0\xbb']
>>> os.listdir(os.listdir(".")[0])
[]
>>> print os.listdir(".")[0]
лол
>>> 
redixin ★★★★
()

если у Вас имена директорий в cp1251 есть смысл скастовать .decode('cp1251') на получаемую строку с именем

shty ★★★★★
()
Ответ на: комментарий от shty

если имена cp1251, но fs их декодирует в кодировку локали, то python вполне может получить utf8. вот из нее и надо декодировать.

А вообще, где-то в глубине питона есть функция, которая возращает кодировку, в которой отдаются имена файлов.

Надо сразу все переделывать в unicode и больше не иметь мозг ни себе, ни ОС

namezys ★★★★
()
Ответ на: комментарий от namezys

если имена cp1251, но fs их декодирует в кодировку локали, то python вполне может получить utf8. вот из нее и надо декодировать.

os.listdir понимает unicode, ЕМНИП

а вот ненастроенная локаль - это возможно

Надо сразу все переделывать в unicode и больше не иметь мозг ни себе, ни ОС

yep!

shty ★★★★★
()

use python3

anonymous
()
Ответ на: комментарий от shty

Он то понимает, только хранит строчки все равно в кодировке локали, а уменно utf8, и обработку ведет по байтово, а не посимволно

namezys ★★★★
()

>Как решить эту проблему?

перейти на UTF-8 и забыть про кодировки вообще.

Deleted
()

Значит так. Проблема в том, что os.listdir и ко возвращают юникодовые названия файлов и библиотек только если параметер передаваеммый им является юникодовой строкой

In [78]: print repr(theDir)
'i:\\dad'

In [79]: [s for s in os.listdir(theDir)]
Out[79]: ['My pictures', 'python-outfile.txt', '??? ?????????']

In [80]: [os.path.isdir(s) for s in os.listdir(theDir)]
Out[80]: [False, False, False]

In [81]: theDir = unicode(theDir)

In [82]: print repr(theDir)
u'i:\\dad'

In [83]: [s for s in os.listdir(theDir)]
Out[83]: 
[u'My pictures',
 u'python-outfile.txt',
 u'\u043c\u043e\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b']



Как видно, передавая юникодовый параметер мы получаем юникодовую строку
In [122]: lst = os.listdir(u'./')

In [123]: lst
Out[123]: 
[u'My pictures',
 u'python-outfile.txt',
 u'\u043c\u043e\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b']

In [124]: os.listdir(lst[-1])
Out[124]: 
[u'2005_09_24_23.jpg',
 u'Thumbs.db',
 u'\u043c\u043e\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b 001.jpg',
 u'\u043c\u043e\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b 002.jpg',
 u'\u043c\u043e\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b 003.jpg',
 u'\u043c\u043e\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b 004.jpg',
 u'\u043c\u043e\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b 005.jpg',
 u'\u043c\u043e\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b 006.jpg',
 u'\u043c\u043e\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b 007.jpg',
 u'\u043c\u043e\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b 008.jpg',
 u'\u043c\u043e\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b 009.jpg',
 u'\u043c\u043e\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b 010.jpg']

phrm ★★
() автор топика

Переименовать директории и файлы латиницей и больше никогда не давать директориям и файлам русских имен, нарушителей лишать доступа к машине.

AIv ★★★★★
()
Ответ на: комментарий от anonymous

>The future is now, ага.

Да всё ок. В future русского языка нет.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.