Метод file.readlines() в Python, получает список строк файла
Читает файл целиком, получает список строк из файла
Синтаксис:
file.readlines([sizehint])
Параметры:
- file — объект файла
- sizehint — int , количество байтов
Возвращаемое значение:
- списокстрок в текстовом режиме или байтовых объектов в двоичном режиме.
Описание:
Метод файла file.readlines() читает файловый объект file построчно, пока не достигнет конца файла EOF и возвращает список, содержащий строки или байтовые объекты файла в зависимости от режима, в котором открыт файл функцией open() . Конечный символ новой строки \n сохраняется в строке.
Если присутствует необязательный аргумент sizehint , то читаются целые строки, составляющие приблизительно sizehint байт (округляется до внутреннего размера буфера).
Пустая строка возвращается только по достижении конца файла, т. е. EOF встречается немедленно.
Помните, что файл может быть слишком большим для того чтобы разместиться полностью в оперативной памяти. В этом случае лучше считывать и обрабатывать файл кусками.
Примеры получения списка строк файла.
>>> text = 'This is 1st line\nThis is 2nd line\nThis is 3rd line\n' >>> fp = open('foo.txt', 'w+') >>> fp.write(text) # 51 >>> fp.seek(0) # 0 >>> fp.readlines() # ['This is 1st line\n', 'This is 2nd line\n', 'This is 3rd line\n'] >>> fp.seek(0) # 0 >>> fp.readlines(15) # ['This is 1st line\n'] >>> fp.readlines(20) # ['This is 2nd line\n', 'This is 3rd line\n'] >>> fp.readlines(20) # [] >>> fp.close()
Внимание! Функцию open() предпочтительнее использовать с оператором контекстного менеджера with . При использовании оператора with файл закрывать не нужно:
text = 'This is 1st line\nThis is 2nd line\nThis is 3rd line\n' # пишем with open('foo.txt', 'w') as fp: fp.write(text) #51 # читаем построчно с помощью `fp.readlines()` with open('foo.txt', 'r') as fp: data = fp.readlines() print(data) # ['This is 1st line\n', 'This is 2nd line\n', 'This is 3rd line\n'] # читаем построчно с помощью `for` with open('foo.txt', 'r') as fp: for line in fp: print(line.rstrip('\n')) # This is 1st line # This is 2nd line # This is 3rd line
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Метод file.close(), закрывает файл
- Метод file.flush(), очищает буфер чтения
- Метод file.fileno(), получает файловый дескриптор
- Метод file.isatty(), проверяет связь с терминалом
- Метод file.read(), читает весь файл или кусками
- Метод file.readline(), читает файл построчно
- Метод file.readlines(), получает список строк файла
- Метод file.seek(), перемещает указатель в файле
- Метод file.tell(), позиция указателя в файле
- Метод file.truncate(), усекает размер файла
- Метод file.write(), пишет данные в файл
- Метод file.writelines(), пишет список строк в файл
Метод file.readline() в Python, читает файл построчно
Метод файла file.readline() читает одну целую строку из файла. Конечный символ новой строки \n сохраняется в строке. Метод возвращает одну строку или байтовый объект в зависимости от режима, в котором открыт файл функцией open() .
Если необязательный аргумент size присутствует и неотрицателен, то метод читает строку частями по size байтов, пока не достигнет символ новой строки \n . Если size отрицателен, то считывается строка полностью.
Пустая строка возвращается только тогда, когда достигнут конец файла, т. е. EOF встречается немедленно.
- Прочитать файл кусками можно с помощью метода file.read() .
- Создать список строк из файла file.readlines() .
Примеры построчного чтения файла.
- Общий случай использования;
- Чтение файла при помощи цикла for ;
- Чтение строк файла кусками.
Общий случай использования метода файла file.readline() .
# подготовим файл 'foo.txt' >>> text = 'This is 1st line\nThis is 2nd line\nThis is 3rd line\n' >>> fp = open('foo.txt', 'w+') # запишем текст в файл 'foo.txt' >>> fp.write(text) # 51 # указатель в начало файла >>> fp.seek(0) # 0 # начинаем читать построчно >>> fp.readline() # 'This is 1st line\n' >>> fp.readline() # 'This is 2nd line\n' >>> fp.readline() # 'This is 3rd line\n' >>> fp.readline() # '' >>> fp.close()
Чтение файла при помощи цикла for .
Так как операция открытия файла open() возвращает поток, представляющий из себя генератор строк из файла, то можно итерироваться по нему при помощи функции next() .
>>> fp = open('foo.txt', 'r') >>> next(fp) # 'This is 1st line\n' >>> next(fp) # 'This is 2nd line\n' >>> next(fp) # 'This is 3rd line\n' >>> next(fp) # Traceback (most recent call last): # File "", line 1, in # StopIteration >>> fp.close()
Так как цикл for/in делает то же самое, а именно при прохождении по последовательности вызывает next , следовательно, более просто, читать файл построчно, без ущерба для оперативной памяти можно следующим образом.
Внимание! Функцию open() предпочтительнее использовать с оператором контекстного менеджера with . При использовании оператора with файл закрывать не нужно:
>>> with open('foo.txt', 'r') as fp: . for n, line in enumerate(fp, 1): . # Обработка строки 'line' . line = line.rstrip('\n') . print(f"Вывод строки: n>) - line>") . # Вывод строки: 1) - This is 1st line # Вывод строки: 2) - This is 2nd line # Вывод строки: 3) - This is 3rd line
Чтение строк файла кусками при помощи цикла while .
Возможно возникнет вопрос, зачем тогда вообще нужен метод файла file.readline() , если все так просто. Ответы просты. А если необходимо прочитать только одну строку? А если строка файла (до разделителя строки \n ) очень длинная и не умещается в оперативной памяти, то тогда приходит на помощь метод файла file.readline() , т.к. он умеет разбивать строку файла на куски.
>>> fp = open('foo.txt', 'r') # будем читать строку по 10 байт >>> line = fp.readline(10) >>> while line: . line = line.rstrip('\n') . print(line) . line = fp.readline(10) . # This is 1s # t line # This is 2n # d line # This is 3r # d line >>> fp.close()
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Метод file.close(), закрывает файл
- Метод file.flush(), очищает буфер чтения
- Метод file.fileno(), получает файловый дескриптор
- Метод file.isatty(), проверяет связь с терминалом
- Метод file.read(), читает весь файл или кусками
- Метод file.readline(), читает файл построчно
- Метод file.readlines(), получает список строк файла
- Метод file.seek(), перемещает указатель в файле
- Метод file.tell(), позиция указателя в файле
- Метод file.truncate(), усекает размер файла
- Метод file.write(), пишет данные в файл
- Метод file.writelines(), пишет список строк в файл
What is the difference between read() and readline() in python? [duplicate]
This question has been answered countless times, and the documentation does a good job of describing the differences, too. But here goes:
If you have a file ( test.txt ) like so:
first line second line third line
with open("test.txt", "r") as file: line = file.readline() print(line)
Will produce this output:
first line
That’s because readline just reads the next line.
If you use this code instead:
with open("test.txt", "r") as file: content = file.read() print(content)
first line second line third line
read() reads the entire contents of the file into a string. You can also give read() an optional argument, which designates the number of characters to read from the file:
with open("test.txt", "r") as file: content = file.read(15) print(content)
first line seco
Finally, the third function, which you didn’t mention, is readlines , which returns a list of lines (strings):
with open("test.txt", "r") as file: lines = file.readlines() print(lines)
['first line\n', 'second line\n', 'third line\n']
answered Aug 26, 2019 at 18:22
10.5k 2 2 gold badges 9 9 silver badges 15 15 bronze badges
There are a ton of other subtleties here. Like how subsequent calls to readline return subsequent lines, and that both consume the file handle, just at different rates. OP might expect to be able to do fh.read(); fh.read() and both be the same, but they will not be
Aug 26, 2019 at 18:26
Thank you @C.Nivs
Aug 27, 2019 at 14:12
The main difference is that read() will read the whole file at once and then print out the first characters that take up as many bytes as you specify in the parenthesis versus the readline() that will read and print out only the first characters that take up as many bytes as you specify in the parenthesis. You may want to use readline() when you’re reading files that are too big for your RAM.
answered Aug 26, 2019 at 18:27
141 6 6 bronze badges
-
The Overflow Blog
Linked
Related
Hot Network Questions
Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.10.27.43697
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Чтение файлов#
Посмотрим как считывать содержимое файлов, на примере файла r1.txt:
! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !
read #
Метод read — считывает весь файл в одну строку.
Пример использования метода read :
In [1]: f = open('r1.txt') In [2]: f.read() Out[2]: '!\nservice timestamps debug datetime msec localtime show-timezone year\nservice timestamps log datetime msec localtime show-timezone year\nservice password-encryption\nservice sequence-numbers\n!\nno ip domain lookup\n!\nip ssh version 2\n!\n' In [3]: f.read() Out[3]: ''
При повторном чтении файла в 3 строке, отображается пустая строка. Так происходит из-за того, что при вызове метода read , считывается весь файл. И после того, как файл был считан, курсор остается в конце файла. Управлять положением курсора можно с помощью метода seek .
readline #
Построчно файл можно считать с помощью метода readline :
In [4]: f = open('r1.txt') In [5]: f.readline() Out[5]: '!\n' In [6]: f.readline() Out[6]: 'service timestamps debug datetime msec localtime show-timezone year\n'
Но чаще всего проще пройтись по объекту file в цикле, не используя методы read. :
In [7]: f = open('r1.txt') In [8]: for line in f: . print(line) . ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !
readlines #
Еще один полезный метод — readlines . Он считывает строки файла в список:
In [9]: f = open('r1.txt') In [10]: f.readlines() Out[10]: ['!\n', 'service timestamps debug datetime msec localtime show-timezone year\n', 'service timestamps log datetime msec localtime show-timezone year\n', 'service password-encryption\n', 'service sequence-numbers\n', '!\n', 'no ip domain lookup\n', '!\n', 'ip ssh version 2\n', '!\n']
Если нужно получить строки файла, но без перевода строки в конце, можно воспользоваться методом split и как разделитель, указать символ \n :
In [11]: f = open('r1.txt') In [12]: f.read().split('\n') Out[12]: ['!', 'service timestamps debug datetime msec localtime show-timezone year', 'service timestamps log datetime msec localtime show-timezone year', 'service password-encryption', 'service sequence-numbers', '!', 'no ip domain lookup', '!', 'ip ssh version 2', '!', '']
Обратите внимание, что последний элемент списка — пустая строка.
Если перед выполнением split , воспользоваться методом rstrip , список будет без пустой строки в конце:
In [13]: f = open('r1.txt') In [14]: f.read().rstrip().split('\n') Out[14]: ['!', 'service timestamps debug datetime msec localtime show-timezone year', 'service timestamps log datetime msec localtime show-timezone year', 'service password-encryption', 'service sequence-numbers', '!', 'no ip domain lookup', '!', 'ip ssh version 2', '!']
seek #
До сих пор, файл каждый раз приходилось открывать заново, чтобы снова его считать. Так происходит из-за того, что после методов чтения, курсор находится в конце файла. И повторное чтение возвращает пустую строку.
Чтобы ещё раз считать информацию из файла, нужно воспользоваться методом seek , который перемещает курсор в необходимое положение.
Пример открытия файла и считывания содержимого:
In [15]: f = open('r1.txt') In [16]: print(f.read()) ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !
Если вызывать ещё раз метод read , возвращается пустая строка:
In [17]: print(f.read())
Но с помощью метода seek можно перейти в начало файла (0 означает начало файла):
In [18]: f.seek(0)
После того как с помощью seek курсор был переведен в начало файла, можно опять считывать содержимое:
In [19]: print(f.read()) ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !