вторник, 9 августа 2011 г.

Распаковываю большой файл. Python

Есть у меня коллекторы, где собираются и обрабатываются flow-потоки с оборудования. Их надо обрабатывать, считать кто сколько и куда байтов послал/получил.
С изменением сети, объемы растут и наступил такой момент, что мой старый скрипт отказался распаковывать 850 метровый архив с ошибкой "Memory Error".
Спасибо, что добрый человек (Гриша, привет!) подсказал как справиться с этим. Ну и спасибо, конечно stackowerflow.com
Итак код:

def read_by_pieces(file_object, piece_size = 1048576): ## 1Mb
    while True:
        data = file_object.read(piece_size)
        if not data:
            break
        yield data

if __name__ == '__main__':
    import gzip
    gz = gzip.open ('d:\\2011-08-07_04.txt.gz') # largefile ~ 850 Mb
    ungz = open ('d:\\2011-08-07_04.txt', 'wb')
    for piece in read_by_pieces(gz, 10485760): ## 10 Mb
        ungz.write(piece)


В результате, распаковывается 850 Mb файл в 3.5 Гб файл за примерно 5 минут.
Я думаю, можно добиться и лучших результатов, но мне сейчас нужно именно такое наколенное решение.

понедельник, 8 августа 2011 г.

Параметры для скрипта. Python

Таких постов сотни, но я ж для себя пишу, правильно?
Передаем параметры из командной строки нашему скрипту


from optparse import OptionParser

parser = OptionParser()
parser.add_option("-r", "--remotehost", dest = "ftphost", help = "FTP host")
parser.add_option("-l", "--login", dest = "ftpu", help = "FTP login")
parser.add_option("-p", "--password", dest = "ftpp", help = "FTP password")
parser.add_option("-d", "--directory", dest = "ftpdir", 
help = "FTP directory", default = "\pub\")
(options, args) = parser.parse_args()

# read options
ftpdir = options.ftpdir
ftphost = options.ftphost
ftpu = options.ftpu
ftpp = options.ftpp



А теперь из ini-файла
Сначала пишем

import configparser
config = configparser.RawConfigParser ()
config.add_section('mail')
config.set ('mail', 'server', 'smtp.server.local')
config.set ('mail', 'from', 'user1@server.local')
config.set ('mail', 'to', 'user2@server.local')
with open('settings.ini', 'w') as cfile:
    config.write (cfile)




Теперь читаем


import configparser 
cfg = configparser.RawConfigParser ()
cfg.read ('settings.ini')
print (cfg.get ('mail', 'server'))
print (cfg.get ('mail', 'from'))
print (cfg.get ('mail', 'to'))