Проблема переименования файлов с помощью python, некоторые символы отказываются меняться (возможно, проблема с изменением кодировки) - PullRequest
0 голосов
/ 21 февраля 2019

Я искал вокруг, но хотя я видел некоторые проблемы, похожие на мои, мне не удалось получить достаточно информации, чтобы решить мою проблему ...

Мой коллега работает надСайт Wordpress, и у них возникают проблемы с просмотром некоторых изображений (они не будут отображаться в слайд-шоу).Изображения, которые не показывались, были названы по-гречески, поэтому они предположили, что это была проблема с именами.Поэтому я подумал, что помогу, написав скрипт для массового переименования указанных изображений с греческого на греческий (форма греческого языка, использующая латинские символы и популярная среди греков в первые дни Интернета - для тех, кто не знаком с термином).

Я протестировал скрипт со всеми видами греческих символов, он отлично работал, включая знаки, характерные для греческого языка.

Когда я запускал скрипт на изображениях, которыеЯ хотел переименовать, хотя некоторые изображения показали проблему.Они переименовывали некоторые акцентированные символы во французские акцентированные символы (например, от ά до à и т. Д.), Но когда я добавил их в словарь (я использовал словарь для разбора имен и заменил греческие буквы), они отказались изменить.

Например, для этого имени файла «palaiá-póli-4-768x480» я запускал сценарий дважды: первый преобразовал его из «Παλαιά-Πόλη-4-768x156» в указанное выше имя, а второй запуск ничего не сделал, даже после добавления »á ":" a "и" ó ":" o "к карте символов (которой раньше не было, поскольку á и á не являются греческими символами.)

Мой сценарий выглядит следующим образом:

import os


char_migrate = {
    "ς": 's',
    'ε': 'e', 'ρ': 'r', "τ": "t", "υ": "y", "θ": "th", "ι": "i", "ο": "o", "π": "p", "α": "a",
    "σ": "s", "δ": "d", "φ": "f", "γ": "g", "η": "i", "ξ": "x", "κ": "k", "λ": "l",
    "ζ": "z", "χ": "x", "ψ": "ps", "ω": "o", "β": "v", "ν": "n", "μ": "m",
    "Ε": "e", "Ρ": "r", "Τ": "t", "Υ": "y", "Θ": "th", "Ι": "i", "Ο": "o", "Π": "p", "Α": "a",
    "Σ": "s", "Δ": "d", "Φ": "f", "Γ": "g", "Η": "i", "Ξ": "x", "Κ": "k",
    "Λ": "l", "Ζ": "z", "Χ": "x", "Ψ": "ps", "Ω": "o", "Β": "v", "Ν": "n", "Μ": "m",
    "Έ": "e", "Ά": "a", "Ύ": "y", "Ί": "i", "Ό": "o", "Ή": "i", "Ώ": "o",
    "έ": "e", "ά": "a", "ύ": "y", "ί": "i", "ό": "ο", "ή": "i", "ώ": "o",
    "ϋ": "i", "ϊ": "i", "ΐ": "i", "ΰ": "i",
    "Ϊ": "i", "Ϋ": "i"
}


os.chdir('C:/Users/alift/Desktop/RenameTestFolder')
for f in os.listdir():
    name = f
    new_name = ""
    for l in name:
        if l in char_migrate:
            b = char_migrate[l]
            new_name += b
        else:
            new_name += l
    os.rename(f, new_name)

Пока я пытался добавить .encode (encoding = "xxx") для new_name внутри os.rename, пробовал Unicode, UTF-8 и Ansi (только UTF-8 заставил мой скрипт работать безошибки, но я прочитал, что это кодировка по умолчанию, которую использует python, и я не получил никаких результатов).

В конце концов, моя проблема, вероятно, заключается в том, что вместо этого мне нужно пакетно изменить кодировкусмены партииимена, как я, но я не знаю, как это сделать.

Любые советы или понимание?Спасибо за ваше время!

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Остерегайтесь акцентированных символов в Юникоде может быть кошмаром, потому что большинство из них существуют в 2 различных формах: составлены и разложены.Например, латинский à - это ЛАТИНСКОЕ МАЛЕНЬКОЕ ПИСЬМО А С GRAVE U + 00E0.Но это может быть '\u0061\u0300', ЛАТИНСКОЕ МАЛЕНЬКОЕ ПИСЬМО А, сопровождаемое КОМБИНИРОВАНИЕМ СКОРОСТИ.Модуль unicodedata предоставляет функцию normalize для преобразования в любую из этих форм.Единственный способ их различить - это сбросить их гекса-коды, но они не равны для каждого оператора равенства строк Python.

Поэтому, когда что-то идет не так и используются акцентированные символы:

  1. сбросьте шестнадцатеричные коды, чтобы лучше понять, что происходит под капотом
  2. используйте нормализованную форму для ограничения проблемы устранения неоднозначности

    >>> print hex(ord(normalize('NKFC', '\u0061\u0300')))
    0x6e
    
0 голосов
/ 21 февраля 2019

Я думаю, что это может быть Windows, потому что я запускаю ваш скрипт под Linux / Python 3, и он работает безупречно.

Input file:
Παλαιά-Πόλη-4-768x156.txt
Output file:
palaia-pοli-4-768x156.txt
...