我正在开发一个库,我想保持平台、文件系统和 Python2.x/3.x 的独立性。但是,我不知道如何以独立于平台/文件系统的方式全局查找文件并将文件名与正则表达式进行匹配。
例如。 (在 Mac 上,使用 IPython、Python 2.7):
In[7]: from glob import glob
In[8]: !touch 'ü-0.é' # Create the file in the current folder
In[9]: glob(u'ü-*.é')
Out[9]: []
In[10]: import unicodedata as U
In[11]: glob(U.normalize('NFD', u'ü-*.é'))
Out[11]: [u'u\u0308-0.e\u0301']
但是,这在 Linux 或 Windows 上不起作用,我需要unicode.normalize('NFC', u'ü-*.é')
。当我尝试将文件名与正则表达式匹配时,会出现同样的问题:只有 unicode 正则表达式规范化为NFD
在 Mac 上匹配文件名,而只有NFC
正则表达式匹配在 Linux/Windows 上读取的文件名(我使用re.UNICODE
两种情况下都标记)。
有处理这个问题的标准方法吗?
我的希望是就像sys.getfilesystemencoding()
返回文件系统的编码,将存在一个返回底层文件系统使用的 Unicode 规范化的函数。
然而,我既找不到这样的函数,也找不到对其进行功能测试的安全/标准方法。
Mac + HFS+
使用 NFD 标准化:https://apple.stackexchange.com/a/10484 https://apple.stackexchange.com/a/10484
Linux + Windows 使用 NFC 标准化:http://qerub.se/filenames-and-unicode-normalization-forms http://qerub.se/filenames-and-unicode-normalization-forms
代码链接:https://github.com/musically-ut/seqfile/blob/feat-unicode/seqfile/seqfile.py https://github.com/musically-ut/seqfile/blob/feat-unicode/seqfile/seqfile.py