Online video hd

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

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

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


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

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

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

06.01.11 18:51 uscr

Скрипты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
2
3

python setup.py
 

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



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

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
#!/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(options.path, i) for i in os.listdir(options.path) \
                    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 < 10000 and not options.show:
        print u"Вы установили низкую точность определения кодировки. Может быть плохо. Продолжить?(y,n)",
        dialog=raw_input()
        if dialog != 'y' and dialog != 'Y':
            sys.exit()
   
    hard_worker(options, args)



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


Посты Комментарии
Последние посты
    Посты Комментарии
    Последние комментарии
      Посты Комментарии
      Изменения
        Посты Комментарии Изменения Черновики Избранное
        Черновики (все)
          Посты Комментарии Изменения Черновики Избранное
          Избранное (всё)
            Посты Комментарии Изменения Черновики Избранное
            Лучшие блоги (все 150)
            Топ пользователей Топ блогов
            Топ пользователей Топ блогов
            Элита (все 3041 из 226 городов)
            Топ пользователей Топ блогов
            В сети: shidoh, lampslave, doraneko, eugenez

            Новенькие: panic1329, panic, kuzmoha, lirikne, Apollo
            welinux.ru

            В хорошем качестве hd видео

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


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

            Online video HD

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

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

            Full HD video online

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

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

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