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

无法删除Python glob返回的字符串中的法语字母,python,Python,我想用法语字母重命名文件。我正在使用glob浏览文件,并使用我在互联网上找到的一个功能删除法语字母。supprime\u口音似乎没问题。但是,它不会重命名glob函数返回的文件 有人知道原因是什么吗?它与全局编码有关吗 def supprime_accent(ligne): """ supprime les accents du texte source """ accents = { 'a': ['à', 'ã', 'á', 'â'], 'e':

我想用法语字母重命名文件。我正在使用glob浏览文件,并使用我在互联网上找到的一个功能删除法语字母。
supprime\u口音
似乎没问题。但是,它不会重命名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)

试着回答这个问题,在这个问题上,我已经给出了我正在使用的最终解决方案

并将一个unicode字符串传递给glob,以恢复unicode文件名,例如

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

通过使用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给出了一个更好的解决方案,用file_name.decode(sys.getfilesystemencoding())替换unicode(file_name,'cp1252')。

我在这里看到了两个潜在的问题

首先,您需要在源代码中使用unicode字符串,并且需要。不幸的是,正确操作会使表中的元音数翻倍…:-\

# -*- 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
标记。

我相信英文字母表中的每个字母都是“法文字母”,不是吗?是的,我想:)对不起,我的英文不好。你怎么称呼“é”?“è”。。。?重音字母?技术术语(当然是一个家喻户晓的词,不是??)是“变音符号”。如果您有unicode字符串,那么这是可以的,但glog.glob和unicode(文件名)返回的不是这个字符串,则会引发error@lucglob确实返回unicode,>>>glob.glob(u“c:\\windows”)[u'c:\\windows']