2016-06-29 2 views
6

Я заметил, что если я перебираю файл, который я открыл, гораздо быстрее перебирать его без «чтения».Python: Когда я должен когда-либо использовать file.read() или file.readlines()?

т.е.

l = open('file','r') 
for line in l: 
    pass (or code) 

гораздо быстрее, чем

l = open('file','r') 
for line in l.read()/l.readlines(): 
    pass (or code) 

2-й петли займет около 1.5x, как много времени (я использовал timeit над точно такой же файл, и результаты были 0,442 против 0,660), и даст тот же результат.

Итак - когда я должен когда-либо использовать .read() или .readlines()?

Так как мне всегда нужно перебирать файл, который я читаю, и после того, как я усердно изучил, насколько болезненно медленный .read() может быть на больших данных - я не могу себе представить, чтобы он когда-либо использовал его снова.

+4

Просьба уточнить. является измерением 'timeit' для' read' или для 'readlines'?Я бы ожидал, что цикл 'read' займет больше времени, потому что он возвращает одну строку, поэтому повторение по ней будет проходить по-символу. Если ваш файл имеет в среднем 100 символов в строке, то код в цикле 'for line in l.read() будет выполняться в сто раз больше, чем код в цикле' for line in l: '. – Kevin

+0

это также для readlines(). Удивительно, что почти нет разницы во времени между read() или readlines() ... –

ответ

4

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

f.readline() считывает одну строку файла, что позволяет пользователю анализировать одну строку, не обязательно считывая весь файл. Использование f.readline() также позволяет упростить применение логики при чтении файла, чем полная линейная итерация, например, когда файл изменяется форматно.

Использование синтаксиса for line in f: позволяет пользователю перебирать файл по строке, как указано в вопросе.

(Как отмечалось в другом ответе, эта документация очень хорошо читать):

https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects

EDIT: Ранее утверждали, что Readline() может быть использован, чтобы пропустить линию во время для итерации цикла. Однако, это не работает в Python 2.7, и, возможно, является сомнительной практикой, так что это требование было удалено.

EDIT: Добавлен пример использования при f.readline() и f.read()

+1

Смешение 'readline' с циклом' for' над файлом на самом деле не работает; 'readline' не понимает буферизацию' next'. Если вы хотите пропустить строку в цикле 'for', вы должны вызвать' next' в файле. – user2357112

+0

Я только что проверил это с помощью python 3.4. readline(), похоже, перемещает буфер цикла вперед. Позвольте мне проверить python 2 очень быстро – Checkmate

+0

Ах, вы правы для python 2.7. Я отредактирую свой ответ. Спасибо, это хорошо знать! – Checkmate

0

Надеюсь, это поможет!

https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects

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

Извините за все изменения!

Для считывания строк из файла вы можете перебрать объект файла. Это память эффективно, быстро и приводит к простому коду:

for line in f: 
    print line, 

This is the first line of the file. 
Second line of the file 
+0

Это не точное описание API для C или Python. – user2357112

+0

Я решил, что не буду объяснять это очень хорошо, поэтому я оставил свой ответ прямо из документации. – Rudi

+0

C по умолчанию не выполняет чтение файлов. Существует даже не стандартная функция для чтения файлов по строкам вообще в C; 'getline' является расширением POSIX. Кроме того, цикл над 'f.read()' не читает весь файл на каждой итерации, и он не перебирает строки. – user2357112

Смежные вопросы