Статьи

Совет: как читать очень большие текстовые файлы с помощью Python

Позвольте мне начать с вопроса, нужен ли нам Python для чтения больших текстовых файлов? Разве нашего обычного текстового процессора или текстового редактора не достаточно для этого? Когда я упоминаю здесь большие, я имею в виду очень большие файлы!

Что ж, давайте посмотрим на доказательства того, нужен ли нам Python для чтения таких файлов или нет.

Чтобы провести наш эксперимент, нам нужен очень большой текстовый файл. В этом руководстве мы получим этот файл с веб-сайта UCSC Genome Bioinformatics . В частности, мы будем использовать файл hg38.fa.gz , который, как описано здесь , выглядит следующим образом:

«Мягкая маска» последовательности сборки в одном файле. Повторения из RepeatMasker и Tandem Repeats Finder (с периодом 12 или менее) показаны в нижнем регистре; неповторяющаяся последовательность показана в верхнем регистре.

Я не хочу, чтобы вы волновались, если вы не поняли вышеприведенное утверждение, так как оно связано с терминологией Genetics. В этом руководстве важна концепция чтения очень больших текстовых файлов с использованием Python.

Загрузите hg38.fa.gz (пожалуйста, будьте осторожны, hg38.fa.gz файла составляет 938 МБ). Вы можете использовать 7-zip, чтобы распаковать файл, или любой другой инструмент, который вы предпочитаете.

После того, как вы распакуете файл, вы получите файл с именем hg38.fa Переименуйте его в hg38.txt чтобы получить текстовый файл.

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

Сначала я попытался использовать Microsoft Word, чтобы открыть файл, и получил следующее сообщение:

Microsoft Word не может открыть файл, потому что он слишком большой

Хотя открытие файла также не работало с использованием WordPad и Notepad на компьютере под управлением Windows, оно открывалось с помощью TextEdit на компьютере Mac OS X.

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

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

1
2
3
4
5
6
input_file = open(‘hg38.txt’,’r’)
output_file = open(‘output.txt’,’w’)
 
for lines in range(500):
    line = input_file.readline()
    output_file.write(line)

Обратите внимание, что мы читаем 500 строк из hg38.txt , строка за строкой, и записываем эти строки в новый текстовый файл output.txt , который должен выглядеть так, как показано в этом файле .

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

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

Мы можем просто сделать это, используя Python для чтения текстового файла через экран терминала, следующим образом (навигация по файлу по 50 строк за раз):

1
2
3
4
5
6
7
8
input_file = open(‘hg38.txt’,’r’)
 
while(1):
    for lines in range(50):
        print input_file.readline()
    user_input = raw_input(‘Type STOP to quit, otherwise press the Enter/Return key ‘)
    if user_input == ‘STOP’:
        break

Как вы можете видеть из этого скрипта, теперь вы можете читать и перемещаться по большому текстовому файлу сразу, используя ваш терминал. Всякий раз, когда вы хотите выйти, вам просто нужно ввести STOP (с учетом регистра) в вашем терминале.

Я уверен, что вы заметите, как плавно Python позволяет перемещаться по такому чрезвычайно большому текстовому файлу без каких-либо проблем. Python снова доказывает, что является языком, стремящимся сделать нашу жизнь проще!