假设我有 3 个文件夹,分别名为“Grégory MM”、“Loïc RR”和“Danièle RR”(空格和重音字母)。
然后我使用以下代码获取仅首字母大写的所有名称:
import glob
names = [ x.title() for x in glob.glob('*') ]
如果文件夹是通过终端使用 mkdir
创建的,我会得到预期的结果:
>>> names
['Loïc Rr', 'Danièle Rr', 'Grégory Mm']
如果文件夹是从 Finder 创建的,我得到:
>>> names
['LoïC Rr', 'DanièLe Rr', 'GréGory Mm']
每个重音字母后的第一个字母大写。这是一种已知的行为吗?我怎样才能避免它?
Python 版本 3.7.0
系统:macOS Mojave 10.14.1
并且 sys.getfilesystemencoding()
返回 'utf-8'
最佳答案
这很可能与重音字母是否使用组合重音字符或单个重音代码点有关。我不知道您的系统上实际有什么文件名,但将名称以 NFC 形式(带有单重音代码点):
>>> x = 'Loïc Rr'
>>> unicodedata.normalize('NFC', x).title()
'Loïc Rr'
在 NFD 形式(结合重音字符)中,重音后没有大写:
>>> unicodedata.normalize('NFD', x).title()
'Loi\u0308C Rr'
我们得到了资本。
看起来title()
认为组合字符标记了单词边界。 NFC 规范化可以有所帮助,但对于不存在专用代码点的怪异重音组合则无济于事。为了实现更强大的处理,您可能需要寻找比 Python 内置字符串方法更强大的 Unicode 处理库。
关于python - str.title() 和 Mac 上的编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53859788/