Поиск по сайту:

Как читать большие текстовые файлы в Python


Объект Python File предоставляет различные способы чтения текстового файла. Популярным способом является использование метода readlines(), который возвращает список всех строк в файле. Однако чтение большого текстового файла нецелесообразно, так как все содержимое файла будет загружено в память.

Чтение больших текстовых файлов в Python

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

import resource
import os

file_name = "/Users/pankaj/abcdef.txt"

print(f'File Size is {os.stat(file_name).st_size / (1024 * 1024)} MB')

txt_file = open(file_name)

count = 0

for line in txt_file:
    # we can process file line by line here, for simplicity I am taking count of lines
    count += 1

txt_file.close()

print(f'Number of Lines in the file is {count}')

print('Peak Memory Usage =', resource.getrusage(resource.RUSAGE_SELF).ru_maxrss)
print('User Mode Time =', resource.getrusage(resource.RUSAGE_SELF).ru_utime)
print('System Mode Time =', resource.getrusage(resource.RUSAGE_SELF).ru_stime)

Когда мы запускаем эту программу, получается:

File Size is 257.4920654296875 MB
Number of Lines in the file is 60000000
Peak Memory Usage = 5840896
User Mode Time = 11.46692
System Mode Time = 0.09655899999999999

  • Я использую модуль ОС для печати размера файла.
  • Модуль ресурсов используется для проверки использования памяти и процессорного времени программой.

Мы также можем использовать оператор with, чтобы открыть файл. В этом случае нам не нужно явно закрывать файловый объект.

with open(file_name) as txt_file:
    for line in txt_file:
        # process the line
        pass

Что делать, если в большом файле нет строк?

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

with open(file_name) as f:
    while True:
        data = f.read(1024)
        if not data:
            break
        print(data)

Приведенный выше код будет считывать данные файла в буфер размером 1024 байта. Затем мы печатаем его на консоль. Когда весь файл будет прочитан, данные станут пустыми, а оператор break завершит цикл while. Этот метод также полезен при чтении двоичных файлов, таких как изображения, PDF, текстовые документы и т. д. Вот простой фрагмент кода для создания копии файла.

with open(destination_file_name, 'w') as out_file:
    with open(source_file_name) as in_file:
        for line in in_file:
            out_file.write(line)

Ссылка: Вопрос StackOverflow