Pandas, Анализ данных

Простая обработка больших файлов. Часть 1.

Время прочтения: 3 мин.

При работе в банке аудиторам регулярно приходится работать с файлами большого объёма, содержащими миллионы строк информации. Средствами EXCEL, а порой даже средствами ACCESS, обрабатывать подобные файлы становится невозможно. В таком случае можно воспользоваться средствами PYTHON.

Мы рассмотрим случай, когда у нас нет возможности загрузить файл целиком в оперативную память, даже с использованием функционала языков программирования. В таком случае мы будем загружать файл по частям, и посмотрим, как можно уменьшить объём информации, загружаемой в память, и получить на выходе файл, с которым можно работать. Один из вариантов —  это разделить файл на несколько частей меньшего размера.

Для чтения файла мы откроем его как текстовый файл, и будем обрабатывать построчно:

with open('example.csv', 'r', encoding = 'utf-8-sig' ) as f:
    print(f.readline())

В данном примере показано как можно открыть файл и прочитать первую строчку.

В зависимости от имеющихся задач можно просто разделить исходный, большой файл, на несколько файлов меньшего размера, например, следующим образом:

counter = 0
file_no = 0
with open('example.csv', 'r', encoding = 'utf-8-sig' ) as file:
    new_file = open ('out' + str(file_no) + '.csv', 'w', encoding = 'utf-8-sig')
    for line in file: 
        new_file.write(line)
        counter +=1
        if counter == 100000:
            counter = 0
            new_file.close()
            file_no +=1
            new_file = open ('out' + str(file_no) + '.csv', 'w', encoding = 'utf-8-sig')
    new_file.close()

Мы одновременно открываем файл для чтения и для записи. По мере чтения строк мы записываем их в новый файл, одновременно с этим накапливая счётчик. Как только счётчик достигает установленного нами значения (в примере — это 100 000) мы сохраняем накопленные значения в файл, и открываем новый файл для продолжения записи. Так можно легко сформировать более удобные для обработки файлы.

Если мы можем отфильтровать исходные данные заранее, это будет ещё лучше. Для этого можно искать текст во всей строке, в дальнейшем фильтруя файл меньшего размера по более конкретным значениям. Для этого код выше можно модифицировать следующим образом:

    ...
    for line in file: 
        if('abc' in line):
            new_file.write(line)
            counter +=1
        if counter == 100000:
            ...

Здесь мы проверяем, содержится ли требуемое значение в каждой из строк по мере их чтения, и, если она нам подходит, мы сохраняем её. Подобный подход хорошо применим в случае, когда нам нужно искать малое количество достаточно специфических строк. Однако, если строка поиска будет встречаться в большинстве строк файла, или строк, которые нужно найти, большое количество (например, фильтрация по большому списку ФИО, ИНН, и так далее), или поиск требуется проводить по относительным условиям (сумма операции больше заданной), то требуется применить другие методы, о которых будет рассказано в следующей статье (в части 2).

Существует множество методов для обработки большого объёма данных даже в условиях технических ограничений. Мы рассмотрели только базовый пример, который, тем не менее, поможет работать даже без наличия продвинутых навыков программирования и опыта в работе со средами разработки. С помощью данного примера можно самостоятельно начать обрабатывать файлы, которые до этого приходилось передавать другим сотрудникам.

Советуем почитать