2010-01-08 113 views
3

我想用法语字母重命名文件。我正在使用glob浏览文件以及我在互联网上找到的一项功能,以删除法文字母。 supprime_accent似乎工作正常。但是,它不重命名由glob函数返回的文件。无法删除Python字符串返回的字符串中的法文字母

有谁知道可能是什么原因?它与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) 
+0

我相信英文字母中的每一个字母都是“法国字母”,不是吗? – 2010-01-08 15:20:53

+0

是的,我猜:)对不起,我的英语不好。你怎么称呼'é''à''è'...?重音字母? – luc 2010-01-08 15:53:21

+0

技术术语(当然是家喻户晓的词,没有??)是“变音符号”。 – 2010-01-08 15:56:27

回答

2

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

首先,您需要在您的源代码中使用unicode字符串,并且您需要tell Python what encoding the source code is in。不幸的是这样做是正确加倍你的表元音数量...: - \

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

1

试试这个问题的答案是,有问题我已经给我使用 latin-1 to ascii

,并通过unicode字符串glob的来,让Unicode文件名后面例如最终的解决方案

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

That'ok如果你有unicode字符串,但这不是由glog.glob和unicode(file_name)返回的内容引发错误 – luc 2010-01-08 15:57:32

+0

@luc glob会返回unicode,>>> glob.glob(u“c:\\ windows” ) [u'c:\\ windows'] – 2010-01-08 16:33:31

1

我已经成功解决了问题,将file_name转换为unicode和cp1252加密。

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

编辑:贾森用file_name.decode替换的unicode(FILE_NAME, 'CP1252')给了一个更好的解决方案(sys.getfilesystemencoding())