Буферизация файлов Python

60
5

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

with open("file.txt") as f: 
for line in f:
# do something

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

Python io docs:

Это рабочий фрагмент

import io
sio = io.StringIO( open("file.txt").read() )
for line in sio:
print(line)
sio.seek(0)
for line in sio:
print(line)
sio.close()

или обертывание его в диспетчере контекста с помощью оператора

import io
with io.StringIO( open("file.txt").read() ) as sio:
for line in sio:
print(line)
sio.seek(0)
for line in sio:
print(line)
#sio.close()

Вопросы

Это "хороший" способ сделать это, какие альтернативы? Что происходит с файлом, используемым для чтения файла (нет способа явно close() он таким образом)? Где я могу узнать больше о буферизации Python io (я думаю, что я что-то читал о том, что Python оптимизирует несколько попыток доступа к файлам путем буферизации автоматически)?

спросил(а) 2017-05-17T17:41:00+03:00 3 года, 8 месяцев назад
1
Решение
94

То, что вы делаете, уже правильно. Цитата из этого ответа: Как читать большой файл, строка за строкой в python

Оператор with обрабатывает открытие и закрытие файла, в том числе, если во внутреннем блоке создается исключение. В for line in f рассматривается файловый объект f как итеративный, который автоматически использует буферизованное управление вводами и памятью, поэтому вам не нужно беспокоиться о больших файлах.

ответил(а) 2017-05-17T17:44:00+03:00 3 года, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема