Python的glob模块和unix的find命令不识别非ascii

时间:2013-01-06 18:08:48

标签: python unix encoding

我使用的是Mac OS X 10.8.2

当我尝试查找文件名包含非ASCII字符的文件时,虽然我确定它们已经存在,但我没有得到任何结果。以控制台输入

为例
> find */Bärlauch*

我没有结果。但如果我尝试没有变形金刚,我会得到

> find */B*rlauch*
images/Bärlauch1.JPG

所以文件肯定存在。如果我用“ae”重命名文件替换“ä”,则找到该文件。

类似地,Python模块glob无法找到文件:

>>> glob.glob('*/B*rlauch*')
['images/Bärlauch1.JPG']
>>> glob.glob('*/Bärlauch*')
[]

我发现它必须与编码有关但我的终端设置为utf-8而我使用的是使用unicode字符串的Python 3.3.0。

2 个答案:

答案 0 :(得分:8)

Mac OS X在HFS +上使用非规范化字符始终作为文件名。使用unicodedata.normalize('NFD', pattern)对glob模式进行非规范化。

import unicodedata

glob.glob(unicodedata.normalize('NFD', '*/Bärlauch*'))

答案 1 :(得分:1)

Python程序基本上是文本文件。传统上,人们只使用ASCII字符集中的字符来编写它们,因此不必考虑它们写入的编码:所有字符集都同意如何解码ASCII字符。

您使用非ASCII字符编写了一个Python程序。因此,您的程序带有隐式编码(您没有提到过):要保存这样的文件,您必须决定如何在磁盘上表示a-umlaut。我猜想也许你的编辑为你选择了非Unicode的东西。

无论如何,有两种方法可以解决这样的问题:要么限制自己只能在程序的源代码中使用ASCII字符,要么可以向Python声明要让它读取特定的文本文件编码

要执行前者,您应该将a-umlaut替换为其Unicode转义序列(我认为是\x0228但目前无法测试)。要执行后者,您应该在文件顶部添加编码声明:

# -*- coding: <your encoding> -*-