[python] os.listdir

Petr Hlávka petrhlavka na gmail.com
Pátek Prosinec 1 11:09:39 CET 2006


Dobrý den,

On 12/1/06, Novák Jan - Topinfo s.r.o. <jan.novak na topinfo.cz> wrote:
> Narazil jsem na zajímavé chování os.listdir, pokud máte v souborech
> diakritiku.
> Co myslíte, je to chyba, není to chyba? Minimálně by to mělo být uvedeno v
> dokumentaci!
>
> Je-li na Linuxu kódování utf-8, chyba se projevila pouze v běhu scriptu přes
> CGI? (tak na to přišel kolega který pracoval na Fedoře s utf-8), pokud ne
> projeví se to vždy. Ve 2.5 nevím jak se to chová?
>
> os.listdir Python documentace
> Changed in version 2.3: On Windows NT/2k/XP and Unix, if path is a Unicode
> object, the result will be a list of Unicode objects..
>
> http://kofoto.rosdahl.net/trac/wiki/UnicodeInPython
> os.listdir(u"path") returns Unicode strings for names that can be decoded
> with sys.getfilesystemencoding() but silently returns byte strings for names
> that can't be decoded. That is, the return value of os.listdir(u"path") is
> potentially a mixed list of Unicode and byte strings.
>
> Python/2.4.2 (WXP)
> >>> import os, sys
> >>> sys.getfilesystemencoding()
> 'mbcs'
> >>> os.listdir(u'path')
> ['aaa.txt', 'bbb.txt', '\xe8e\x9atina.txt', 'ccc.txt']
> >>> os.listdir(u'path')
> [u'aaa.txt', u'bbb.txt', u'\u010de\u0161tina.txt', u'ccc.txt']
> >>> ...OK 3. je unicode
>
> Python/2.4.4 (Debian)
> >>> import os, sys
> >>> sys.getfilesystemencoding()
> 'ANSI_X3.4-1968'
> >>> os.listdir('path')
> ['aaa.txt', 'bbb.txt', '\xe8e\xb9tina.txt', 'ccc.txt']
> >>> os.listdir(u'path')
> [u'aaa.txt', u'bbb.txt', '\xe8e\xb9tina.txt', u'ccc.txt']
> >>> ...? 3. není unicode
>

podle mě se to chová přesně, jak se píše na
http://kofoto.rosdahl.net/trac/wiki/UnicodeInPython,
'\xe8e\xb9tina.txt' není asi v kódování ANSI_X3.4-1968 (netuším jaké
to je) a proto není převedeno na unicode. Problém bude zřejmě v
nastavení locales, u mě vrací

>>> sys.getfilesystemencoding()
'ISO-8859-2'

a os.lisdir(u'...') funguje správně i na české jména souborů. Pokud
spustím python jako

LC_ALL=C python

chová se to úplně stejně jako ve Vašem případě.

  S pozdravem Petr Hlávka.


Další informace o konferenci Python