У меня есть каталог с ~ 10 000 файлов изображений из внешнего источника.
Многие из имена файлов содержат пробелы и знаки препинания, которые не подходят для БД или Интернета. Я также хочу добавить номер SKU в конец каждого имени файла (для целей бухгалтерского учета). Многие, если не большинство имен файлов также содержат расширенные латинские символы. который я хочу сохранить для целей SEO (в частности, чтобы имена файлов точно отображали содержимое файла в Картинках Google)
Я сделал сценарий bash, который переименовывает (копирует) все файлы в желаемый результат. Скрипт bash сохраняется в UTF-8. После запуска он пропускает около 500 файлов (невозможно статистический файл ...).
Я бежал convmv -f UTF-8 -t UTF-8 в каталоге, и обнаружил, что эти 500 имен файлов не закодирован в UTF-8 (convmv может обнаруживать и игнорировать имена файлов уже в UTF-8)
Есть ли простой способ узнать который языковая кодировка, которую они используют в настоящее время?
Единственный способ, которым я смог понять себя, - это установить кодировку терминала в UTF-8, а затем перебрать все вероятные кодировки кандидатов с помощью convmv, пока не отобразится преобразованное имя, которое «выглядит правильно». У меня нет возможности быть уверенным, что все эти 500 файлов используют одну и ту же кодировку, поэтому мне придется повторить этот процесс 500 раз. Я бы хотел более автоматизированный метод, чем «выглядит правильно» !!!
На самом деле нет 100% точного способа, но есть способ дать хорошее предположение.
Существует диаграмма библиотеки Python, которая доступна здесь: https://pypi.python.org/pypi/chardet
например
Посмотрите, что установлено для текущей переменной LANG:
$ echo $LANG
en_IE.UTF-8
Создайте имя файла, которое нужно будет закодировать с помощью UTF-8
$ touch mÉ.txt
Измените нашу кодировку и посмотрите, что произойдет, когда мы попытаемся перечислить ее
$ ls m*
mÉ.txt
$ export LANG=C
$ ls m*
m??.txt
Хорошо, теперь у нас есть имя файла в кодировке UTF-8, а наша текущая локаль - C (стандартная кодовая страница Unix).
Итак, запустите python, импортируйте chardet и заставьте его прочитать имя файла. Я использую подстановку оболочки (т. Е. Расширение с помощью подстановочного символа *), чтобы получить свой файл. Измените "ls m *" на то, что будет соответствовать одному из ваших файлов примеров.
>>> import chardet
>>> import os
>>> chardet.detect(os.popen("ls m*").read())
{'confidence': 0.505, 'encoding': 'utf-8'}
Как видите, это только предположение. Насколько хорошее предположение показывает переменная "достоверность".
Вы можете найти это полезным для проверки текущего рабочего каталога (python 2.7):
import chardet
import os
for n in os.listdir('.'):
print '%s => %s (%s)' % (n, chardet.detect(n)['encoding'], chardet.detect(n)['confidence'])
Результат выглядит так:
Vorlagen => ascii (1.0)
examples.desktop => ascii (1.0)
Öffentlich => ISO-8859-2 (0.755682154041)
Videos => ascii (1.0)
.bash_history => ascii (1.0)
Arbeitsfläche => EUC-KR (0.99)
Чтобы рекурсивно пройти путь к корыту из текущего каталога, скопируйте его и вставьте в небольшой скрипт Python:
#!/usr/bin/python
import chardet
import os
for root, dirs, names in os.walk('.'):
print root
for n in names:
print '%s => %s (%s)' % (n, chardet.detect(n)['encoding'], chardet.detect(n)['confidence'])