Невозможно удалить французские буквы в строке, возвращаемой глобусом Python - PullRequest
3 голосов
/ 08 января 2010

Я хотел бы переименовать файлы с французскими буквами. Я использую glob для просмотра файлов и функцию, которую я нашел в Интернете, чтобы удалить французские буквы. supprime_accent, кажется, работает нормально. Однако он не переименовывает файлы, возвращаемые функцией 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 ]

2 голосов
/ 08 января 2010

Я вижу две потенциальные проблемы здесь.

Во-первых, вам нужно использовать строки юникода в вашем исходном коде, и вам нужно сообщить 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 исправил обе эти проблемы: имена файлов не нужно декодировать, а строки Юникода не нуждаются в теге u.

1 голос
/ 08 января 2010

Мне удалось решить проблему, преобразовав имя_файла в юникод с кодировкой 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')

Редактировать: Джейсон дал лучшее решение, заменив юникод (имя_файла, 'cp1252') на имя_файла_фида (sys.getfilesystemencoding ())

1 голос
/ 08 января 2010

попробуйте этот вопрос и ответы на него, в вопросе я дал окончательное решение, которое я использую латинский от 1 до ascii

и передать строку юникода в glob, чтобы вернуть имена файлов юникода, например,

for file_name in glob.glob(u"attachments/*.jpg"):
    print file_name.encode('ascii', 'latin2ascii')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...