我在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)
如果我使用上面的代码,只要文件名不包含变音符号,它就可以工作。
在我的外壳中,变音符打印得很好,但是当我将它们复制回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标准化表格。
关于python - Python os.walk()变音u'\u0308',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33647067/