Разделитель больших текстовых файлов на маленькие Python

  • Автор темы AllenaAston
  • Дата начала
A

AllenaAston

Original poster
Ребятки, кто-то тут написал подобное на дельфи, я ради интереса написал такое же самое на питоне.
Должно есть базы любого размера, память не нагружать, работает в 1 поток.

Использовать так:

python split_base.py base_name.txt 50000
где base_name.txt - путь к базе, а 50000 - количество строк на сколько надо разделить базу.


split_base.py
Код:
# *-* coding: utf-8 *-*
import os
import sys
from itertools import chain, islice
try:
    from utils import timeit
    from memory_profiler import profile
except Exception:
    timeit = lambda x: x
    profile = lambda x: x


# На сколько разделять линий по умолчанию
SPLIT_LINES = 100000


def lines_count(file):
    with open(file, 'r') as f:
        return len(f.readlines())

@profile 
def file_info(filename):
    filesize = os.stat(filename).st_size / 1048576
    print("Имя базы: %s" % filename)
    print("Размер базы: %.2f MB" % filesize)
    if filesize < 100:
        filelines = lines_count(filename)
        print("Количество строк: %d" % filelines)

def chunks(iterable, n):
    iterable = iter(iterable)
    while True:
        yield chain([next(iterable)], islice(iterable, n-1))

def split_file(file, line_num):
    with open(file) as bigfile:
        for i, lines in enumerate(chunks(bigfile, line_num)):
            file_split = '{}_{}.txt'.format(file[:-4], i)
            with open(file_split, 'w') as f:
                f.writelines(lines)

@timeit
def main():
    global SPLIT_LINES
    if len(sys.argv) > 1:
        filename = sys.argv[1]
    else:
        print('Не указан путь к базе')
        exit()
    if len(sys.argv) > 2:
        SPLIT_LINES = sys.argv[2]

    file_info(filename)
    split_file(filename, SPLIT_LINES)

if __name__ == '__main__':
    main()

utils.py - декоратор замера скорости работы
Код:
import time

def timeit(f):
    def timed(*args, **kw):
        ts = time.time()
        result = f(*args, **kw)
        te = time.time()
        print('func:%r args:[%r, %r] took: %2.4f sec' % \
          (f.__name__, args, kw, te-ts))
        return result

    return timed


Скопипастите файлики в split_base.py и utils.py соответственно.
Ну или скачайте:

Готов ответить на любые вопросы по работе скрипта.