无法去除Python glob返回字符串中的法语字母

3 投票
3 回答
828 浏览
提问于 2025-04-15 17:48

我想给文件重命名,这些文件里有法语字母。我正在用一个叫做glob的工具来浏览这些文件,并且找到了一个网上的函数来去掉法语字母。这个叫做supprime_accent的函数看起来能正常工作。但是,它并没有重命名glob函数返回的文件。

有没有人知道这可能是什么原因呢?这和glob的编码有关吗?

def supprime_accent(ligne):
    """ supprime les accents du texte source """
    accents = { 'a': ['à', 'ã', 'á', 'â'],
                'e': ['é', 'è', 'ê', 'ë'],
                'i': ['î', 'ï'],
                'u': ['ù', 'ü', 'û'],
                'o': ['ô', 'ö'] }
    for (char, accented_chars) in accents.iteritems():
        for accented_char in accented_chars:
            ligne = ligne.replace(accented_char, char)
    return ligne

for file_name in glob.glob("attachments/*.jpg"):
    print supprime_accent(file_name)

3 个回答

1

我成功解决了这个问题,方法是把文件名转换成使用cp1252编码的unicode格式。

for file_name in glob.glob("attachments/*.jpg"):
    file_name = file_name.decode(sys.getfilesystemencoding())
    print unicodedata.normalize('NFKD', file_name).encode('ascii','ignore')

补充:Jason提供了一个更好的解决办法,把unicode(file_name, 'cp1252')替换成file_name.decode(sys.getfilesystemencoding())。

1

试试这个问题和它的答案,在问题中我给出了我正在使用的最终解决方案,链接在这里:latin-1 转 ascii

然后把一个unicode字符串传给glob,这样可以得到unicode格式的文件名,比如:

for file_name in glob.glob(u"attachments/*.jpg"):
    print file_name.encode('ascii', 'latin2ascii')
2

我看到这里有两个可能的问题。

首先,你需要在你的源代码中使用unicode字符串,并且你需要告诉Python你的源代码使用了什么编码。不幸的是,正确做这件事会让你表格中的元音字母数量翻倍... :-\

# -*- coding: UTF-8 -*-
...
accents = { u'a': [u'à', u'ã', u'á', u'â'],
            u'e': [u'é', u'è', u'ê', u'ë'],
            u'i': [u'î', u'ï'],
            u'u': [u'ù', u'ü', u'û'],
            u'o': [u'ô', u'ö'] }

其次,我觉得你需要把glob返回的文件名转换成unicode字符串。

import sys
file_name = file_name.decode(sys.getfilesystemencoding())

Python 3.0解决了这两个问题:文件名不需要解码,unicode字符串也不需要一个u标签。

撰写回答