Tim*_*Tim 1 python unicode os.walk
我在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)
Run Code Online (Sandbox Code Playgroud)
如果我使用上面的代码,只要文件名不包含变音符号就行.在我的shell中,变音符号被打印得很好但是当我将它们复制回utf8格式化的Textdeditor(在我的例子中是Sublime)时,我得到:
截图 预期:
filename.jpeg
filename_ö.jpg
Run Code Online (Sandbox Code Playgroud)
当然正则表达式失败了.如果我硬编码文件名,如:
re.match( r".*ö.*",'filename_ö',re.UNICODE)
Run Code Online (Sandbox Code Playgroud)
它工作正常.
我试过了:
os.walk(u"./test")
filename.decode('utf8')
Run Code Online (Sandbox Code Playgroud)
但是给了我:
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)
Run Code Online (Sandbox Code Playgroud)
u'\u0308' 是变音之上的圆点.
我猜想我会忽略一些愚蠢的东西?
Unicode字符可以以各种形式表示; 有"ö",但是也可以使用"o"和单独组合变音符来表示相同的角色.OS X通常更喜欢分离的变体,并且您的编辑器似乎没有优雅地处理它,这两个单独的字符也不匹配您的正则表达式.
如果您需要某种方式或另一种方法,则需要规范化 Unicode数据.见unicodedata.normalize.您想要NFC标准化表格.