Функция Python readlines(n) поведение
Я прочитал документацию, но что делает readlines(n)? Под readlines(n) я подразумеваю readlines(3) или любое другое число.
Когда я запускаю readlines(3), он возвращает то же самое, что readlines().
3 ответа
Необязательный аргумент должен означать, сколько (приблизительно) байтов считывается из файла. Файл будет читаться дальше, пока не закончится текущая строка:
readlines([size]) -> list of strings, each a line from the file.
Call readline() repeatedly and return a list of the lines so read.
The optional size argument, if given, is an approximate bound on the
total number of bytes in the lines returned.
Другая цитата:
Если задан необязательный параметр sizehint, он читает столько байтов из файла и еще достаточно, чтобы завершить строку, и возвращает строки из этого.
Вы правы в том, что для небольших файлов это мало что дает, что интересно:
In [1]: open('hello').readlines()
Out[1]: ['Hello\n', 'there\n', '!\n']
In [2]: open('hello').readlines(2)
Out[2]: ['Hello\n', 'there\n', '!\n']
Можно подумать, что это объясняется следующей фразой в документации:
Читайте до EOF, используя readline() и возвращайте список, содержащий прочитанные строки. Если присутствует необязательный аргумент sizehint, вместо чтения до EOF читаются целые строки, составляющие приблизительно байты sizehint (возможно, после округления до внутреннего размера буфера). Объекты, реализующие файловый интерфейс, могут игнорировать sizehint, если он не может быть реализован или не может быть реализован эффективно.
Однако даже когда я пытаюсь прочитать файл без буферизации, он, похоже, ничего не меняет, а это означает, что подразумевается какой-то другой вид внутреннего буфера:
In [4]: open('hello', 'r', 0).readlines(2)
Out[4]: ['Hello\n', 'there\n', '!\n']
В моей системе этот размер внутреннего буфера составляет около 5 тыс. Байт / 1,7 тыс. Строк:
In [1]: len(open('hello', 'r', 0).readlines(5))
Out[1]: 1756
In [2]: len(open('hello', 'r', 0).readlines())
Out[2]: 28080
В нем перечислены строки, через которые простирается заданный размер символа 'n', начиная с текущей строки.
Пример: в text
файл с содержанием
one
two
three
four
open('text').readlines(0)
возвращается ['one\n', 'two\n', 'three\n', 'four\n']
open('text').readlines(1)
возвращается ['one\n']
open('text').readlines(3)
возвращается ['one\n']
open('text').readlines(4)
возвращается ['one\n', 'two\n']
open('text').readlines(7)
возвращается ['one\n', 'two\n']
open('text').readlines(8)
возвращается ['one\n', 'two\n', 'three\n']
open('text').readlines(100)
возвращается ['one\n', 'two\n', 'three\n', 'four\n']
В зависимости от размера файла readlines(подсказка) должна возвращать меньший набор строк. Из документации:
f.readlines() returns a list containing all the lines of data in the file.
If given an optional parameter sizehint, it reads that many bytes from the file
and enough more to complete a line, and returns the lines from that.
This is often used to allow efficient reading of a large file by lines,
but without having to load the entire file in memory. Only complete lines
will be returned.
Таким образом, если ваш файл имеет 1000 строк, вы можете передать, скажем, 65536, и он будет считывать только столько байтов за раз +, что достаточно для завершения следующей строки, возвращая все строки, которые полностью прочитаны.