uscr 06.01.2011 18:51
Скрипты — Code juggler - велосипед для изменения кодировки текстовых файлов.
Зачем ты это сделал?!Недавно мне понадобилось перегнать в utf-8 больше трёх сотен файлов. Проблема усугублялась тем, что файлы были созданы в очень разных кодировках. Разгребать это руками - весьма унылое занятие... Беглый гуглёж не порадовал. Решено было вместо обеденного перерыва размять косточки и вспомнить няшный python. За обеденный перерыв я написал кривенький скрипт, который освободил мне время для весёлой фермы самообразования. После этого я решил оформить своего уродца в некое подобие серьёзной программы. Но...
Прошло 7 месяцев.
За 7 месяцев я мог успеть написать операционную систему. Я мог бегло выучить иностранный язык. Я мог проявить себя и поиметь головокружительный карьерный рост. Уж во всяком случае я мог довести до совершенства простенький скрипт из 40 строк. Но я успел только напрочь забыть логику своего творения. Буквально 3 дня назад я вспомнил о нём и решил, что новогодние каникулы - отличное время для доведения подобных дел до конца. Оказалось, что проще переписать код заново, чем разгребать те адовы заросли. Я хотел реализовать сразу слишком много. На этом, пожалуй, остановлю затянувшееся предисловие и перейду к делу.
Описание
Название "Code juggler" прошу понимать как "Жонглёр кодировками". Да, да. Code - не правильно. Правильно - Encode. Но писать названия проектов без ошибок - моветон. Скрипт умеет работать с каталогом и менять кодировку файлов в нём. Кроме того, может просто показать кодировку файлов из каталога. Вот, собственно и всё. Теперь опишу параметры, которые можно передавать скрипту:
"-p", "--path"
Задайте директорию, в которой будет работать скрипт. По умолчанию будет принята директория, из которой запущен скрипт.
"-s", "--show-only"
Если передана эта опция, скрипт просто покажет кодировку каждого файла. Больше ничего не произойдёт.
"-d", "--decode"
Собственно, кодировка, в которую хотим перекодировать. Если кодировка не задана, будет использоваться "utf8". Названия кодировок искать в средней колонке второй с низу таблички на этой странице.
"--remove"
Если задать эту опцию, исходный файл после изменения кодировки будет удалён.
"-e", "--extension"
Можно задать расширение для файлов с которыми нужно работать.
"--prefix"
Префикс, который нужно добавить к вновь созданному файлу. По умолчанию "re_". Наприер, если изначально файл назывался foo.txt, то после обработки название изменится на re_foo.txt.
"-i", "--ignore-subpath"
Если передан этот параметр, скрипт не полезет во вложенные каталоги.
"-a", "--accuracy"
Через этот параметр задаётся точность определения кодировки. Фактически - это число байт, которое будет прочитано из определяемого файла. По умолчанию читает 10000 байт. Дело в том что если сделать это число слишком большим, скрипт будет работать крайне медленно. Если сделать число слишком маленьким, скрипт не сможет точно определить кодировку (скорее всего выплюнет 'ascii'). 10000 - это экспериментально определённая "золотая середина". У меня на тестовых файлах (сохранённые html странички в разных кодировках) при величине 10000 не было ни одной ошибки.
Итак, коротенький список фич:
Автоматическое определение кодировки исходного файла.
Возможность работать только с файлами с определённым расширением (вернее, окончанием).
Возможность удалить исходные файлы автоматически.
Планы на будущее:
Причесать код.
Прикрутить возможность задавать несколько расширений.
Прикрутить возможность задавать игнорируемые расширения.
Прикрутить возможность задавать глубину обхода вложенных каталогов.
Планы на далёкое будущее:
Прикрутить возможность задавать имена файлов по регулярным выражениям.
Прикрутить возможность задавать несколько каталогов.
Написать ОС на основе моего скрипта.
Дисклеймер:
Это альфа версия. В идеале глюков быть не должно, но они возможны. Кроме того, подсказка по опциям (scriptname -h) не работает. Над этим уже размышляют лучшие умы человечества.
Скрипт использует сторонний модуль, который у вас может быть не установлен.
Установка описана под спойлером:
Перейдите по ссылке и скачайте архив для Python 2.
Теперь распакуйте архив и перейдите в появившияся каталог:
Теперь запустите скрипт setup.py с помошью python в качестве интерпретатора:
Теперь модуль установлен. Можно пользоваться скриптом.
Теперь распакуйте архив и перейдите в появившияся каталог:
1 |
|
Теперь запустите скрипт setup.py с помошью python в качестве интерпретатора:
1 |
|
Теперь модуль установлен. Можно пользоваться скриптом.
Собственно, сам скрипт:
Скрипт нужно копипастнуть в файл, дать права на запуск (chmod filename +x, где filename - имя файла со скриптом) и можно пользоваться. Скрипт прекрасно себя чувствует в оффтопике, только нужно будет установить питон. Берегите отступы в файле. В питоне они важны.
philosoft 06.01.2011 20:11 #
+ 7 -
А между тем есть enca
btw, -h у меня в этом скрипте прекрасно отрабатывается, да и в коде не видно никакой причины, для иного поведения.
Названия кодировок искать в средней колонке второй с низу таблички на этой странице.
Логичнее было бы добавить:
"-l", "--list"
Показать список доступных кодировок.
Это было бы просто супер. Я даже хотел прикрутить проверку параметра -d на валидность, но напрочь забыл где в питоне получить список доступных кодировок, а нагуглить не удалось.
Если просто текстовые файлы перегнать в utf-8,то можно просто так:
#!/bin/bash
IFS="
"
for i in $(find from ${PWD}$i -name "*.txt" );do
enconv $i
done
Можно писать:
IFS="\n"
Конструкцияfor i in $(find from ${PWD}$i)
бессмысленна:
- переменная i к моменту вызова find'a пуста
- from ${PWD} тоже лишне, ибо find и так по умолчанию работает в текущей директории, особенно с учётом того, что «гнутая» версия find'a не имеет опции from.