Skip to main content
 首页 » 编程设计

Python os.walk() 变音 u'\u0308'

2025年05月04日11lhb25

我在 OSX 机器上运行 Python 2.7。我正在尝试在 smb 共享上执行 os.walk。

for root, dirnames, filenames in os.walk("./test"): 
        for filename in filenames: 
 
            print filename 
 
            matchObj = re.match( r".*ö.*",filename,re.UNICODE) 

如果我使用上面的代码,只要文件名不包含变音符号,它就可以工作。 在我的 shell 中,变音符号打印得很好,但是当我将它们复制回 utf8 格式的 Textdeditor(在我的例子中是 Sublime)时,我得到:

screenshot 预期:

filename.jpeg 
filename_ö.jpg 

当然正则表达式失败了。 如果我像这样硬编码文件名:

re.match( r".*ö.*",'filename_ö',re.UNICODE) 

它工作正常。

我试过:

os.walk(u"./test") 
filename.decode('utf8') 

但给了我:

return codecs.utf_8_decode(input, errors, True) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0308' in position 10: ordinal not in range(128) 

u'\u0308' 是元音符号上方的点。

我猜我忽略了一些愚蠢的事情?

请您参考如下方法:

Unicode字符可以用多种形式表示;有“ö”,但也有可能使用“o”和单独的组合变音符号来表示相同的字符。 OS X 通常更喜欢分隔的变体,而您的编辑器似乎没有很好地处理它,这两个单独的字符也不匹配您的正则表达式。

如果您特别需要一种或另一种方式,则需要规范化您的 Unicode 数据。参见 unicodedata.normalize .您需要 NFC 规范化形式。