Видео ролики бесплатно онлайн

Смотреть красивое видео

Официальный сайт morning-news 24/7/365

Смотреть видео бесплатно

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.
Теперь распакуйте архив и перейдите в появившияся каталог:
1
2
tar -xzf python2-chardet-2.0.1.tgz
cd python2-chardet-2.0.1/


Теперь запустите скрипт setup.py с помошью python в качестве интерпретатора:
1
python setup.py install


Теперь модуль установлен. Можно пользоваться скриптом.



Собственно, сам скрипт:

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import os
import chardet
import codecs
from optparse import OptionParser

def code_detecter(filename):#in:path out:encoding

with open(filename) as codefile:
data = codefile.read(options.accuracy)
return chardet.detect(data)<'encoding'>

def code_dictionary_generator(filelist): #in:list or string out:dict
codedict = {}
for i in filelist:
codedict<i> = code_detecter(i)
return codedict

def hard_worker(options=None, args=None): #Собственно, работает. Узнаёт, выводит, перекодирует.
def decode(file_code_dict, prefix, rm): #(dict{path:encode}, prefix for new filename, remove:boolean)
for path, code in file_code_dict.iteritems():

source = codecs.open(path, 'r', code)
receiver = open(os.path.join(os.path.dirname(path), prefix + os.path.basename(path)), 'w') #Эта адова строка всего лишь добавляет префикс к имени вновь созданного файла.
for j in source.readlines():
receiver.write(j.encode(options.code))
source.close()
receiver.close()
if rm:
os.remove(path)
print path
print code
print ""

if options == None:
print "hard_worker from code_juggler say: Возникла подозрительная ошибка. Видимо, вы используете процедуру внутри другого модуля."
sys.exit()
if os.path.isdir(options.path) and options.ignore:
filelist = <os.path.join>
if i.endswith(options.extension) and os.path.isfile(os.path.join(options.path, i))> #Убрать адову конструкцию с join
elif os.path.isdir(options.path) and not options.ignore:
filelist =

for root, dirs, files in os.walk(options.path):
for one_file in files:
if one_file.endswith(options.extension):
filelist.append(os.path.join(root, one_file))
elif os.path.isfile(options.path):
listdir = options.path

codedict = code_dictionary_generator(filelist)
if options.show:
for path, code in codedict.iteritems():
print path
print code
print ""
else:
decode(codedict, options.prefix, options.remove)

if __name__ == '__main__':
parser = OptionParser()
parser.add_option("-p", "--path", action="store", type="string", dest="path", default=os.path.abspath(os.curdir),\
help=u"Задайте директорию, в которой будет работать скрипт. По умолчанию текущая.")
parser.add_option("-s", "--show-only", action="store_true", dest="show", default=False,\
help=u"Используйте для простого определения и вывода кодировки файла, без изменения.")
parser.add_option("-d", "--decode" ,action="store", type="string", dest="code", default='utf8',\
help=u"Задайте кодировку, на которую хотите заменить исходную. По умолчанию 'utf8'")
parser.add_option("--remove", action="store_true", dest="remove", default=False,\
help=u"Используйте для удаления исходных файлов. Игнорируется при наличии '-s'")
parser.add_option("-e", "--extension", action="store", type="string", dest="extension", default="",\
help=u"Расширение файлов, с которыми будет работать скрипт. По умолчанию все файлы.")
parser.add_option("--prefix", action="store", type="string", dest="prefix", default="re_",\
help=u"Префикс, который нужно добавить к вновь созданному файлу. По умолчанию 're_'")
parser.add_option("-i", "--ignore-subpath", action="store_true", dest="ignore", default=False, \
help=u"Используйте для игнорирования вложенных каталогов.")
parser.add_option("-a", "--accuracy", type="int", dest="accuracy", default=10000, \
help=u"Задайте точность определения кодировки. По умолчанию 10000.")
(options, args) = parser.parse_args()

if args:
print u"Странная ошибка. Внимательно проверьте параметры запуска. Обратите внимание на -p -d -e --prefix -a, если вы используете эти параметры."
sys.exit()
if options.prefix == "":
print u"У вас ничего не получится. Нельзя задавать пустой prefix."
sys.exit()
if options.accuracy &lt; 10000 and not options.show:
print u"Вы установили низкую точность определения кодировки. Может быть плохо. Продолжить?(y,n)",
dialog=raw_input()
if dialog != 'y' and dialog != 'Y':
sys.exit()

hard_worker(options, args)</os.path.join></i>




Скрипт нужно копипастнуть в файл, дать права на запуск (chmod filename +x, где filename - имя файла со скриптом) и можно пользоваться. Скрипт прекрасно себя чувствует в оффтопике, только нужно будет установить питон. Берегите отступы в файле. В питоне они важны.


Тэги:
+ 4 -
Похожие Поделиться

philosoft 06.01.2011 20:11 #
+ 7 -
А между тем есть enca
uscr 06.01.2011 20:37 #
+ 2 -
Совершенно верно.
philosoft 06.01.2011 23:21 #
+ 2 -
btw, -h у меня в этом скрипте прекрасно отрабатывается, да и в коде не видно никакой причины, для иного поведения.
uscr 07.01.2011 02:47 #
+ 0 -
Это странно. У меня на 3 машинах выпадает дикая ошибка.
iglezz 07.01.2011 03:06 #
+ 0 -
Названия кодировок искать в средней колонке второй с низу таблички на этой странице.

Логичнее было бы добавить:

"-l", "--list"
Показать список доступных кодировок.
uscr 07.01.2011 03:18 #
+ 0 -
Это было бы просто супер. Я даже хотел прикрутить проверку параметра -d на валидность, но напрочь забыл где в питоне получить список доступных кодировок, а нагуглить не удалось.
Ingvar16 11.01.2011 18:51 #
+ 0 -
Если просто текстовые файлы перегнать в utf-8,то можно просто так:

#!/bin/bash
IFS="
"
for i in $(find from ${PWD}$i -name "*.txt" );do
enconv $i
done
philosoft 15.01.2011 16:52 #
+ 2 -
Можно писать:IFS="\n"Конструкцияfor i in $(find from ${PWD}$i)бессмысленна:
  • переменная i к моменту вызова find'a пуста
  • from ${PWD} тоже лишне, ибо find и так по умолчанию работает в текущей директории, особенно с учётом того, что «гнутая» версия find'a не имеет опции from.
Ingvar16 15.01.2011 22:10 #
+ 0 -
Согласен.Этот скрипт имеет определённые недостатки (я не программист и написал его,взяв за основу чужой скрипт).
Но он работает.Я перегнал у себя уже несколько тысяч txt файлов в UTF-8 из cp1251.

Смотреть видео онлайн

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн