Чем отличается read от readline python
Перейти к содержимому

Чем отличается read от readline python

  • автор:

file.readlines

Считать файл можно также при помощи конструктора list():

 with open('my_file.txt') as f: 
my_lines = list(f) # ['The first line.\n', '\n', 'The last line.\n']

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

  • Для считывания файла кусками используйте read().
  • Для считывания по одной строке используйте readline().
  • Для записи строк можно использовать writelines().

Синонимы поиска: file.readlines, file, readlines

Чем отличается read от readline python

Чтобы открыть текстовый файл на запись, необходимо применить режим w (перезапись), a (дозапись) или r+ / w+ (чтение и запись) . Затем для записи применяется метод write(str) , в который передается записываемая строка. Стоит отметить, что записывается именно строка, поэтому, если нужно записать числа, данные других типов, то их предварительно нужно конвертировать в строку.

Запишем некоторую информацию в файл «hello.txt»:

with open("hello.txt", "w") as file: file.write("hello world") print("Файл записан")

Если мы откроем папку, в которой находится текущий скрипт Python, то увидем там файл «hello.txt». Этот файл можно открыть в любом текстовом редакторе и при желании изменить.

Теперь дозапишем в этот файл еще одну строку:

with open("hello.txt", "a") as file: file.write("\nhello work") print("Файл изменен")

Дозапись выглядит как добавление строки к последнему символу в файле, поэтому, если необходимо сделать запись с новой строки, то можно использовать эскейп-последовательность «\n». В итоге файл hello.txt будет иметь следующее содержимое:

hello world hello work

Для записи списка строк имеется метод writelines() . В качестве параметра он принимает список строк:

lines = ["Hello Word\n", "Hello Work\n", "Hello World\n"] with open("hello2.txt", "a") as file: file.writelines(lines) print("Список строк записан в файл")

Стоит учитывать, что, если мы хотим, чтобы каждая строка из списка располагалась на отдельной строке в файле, то строка в списке должна заканчиваться на символ «\n».

Еще один способ записи в файл представляет стандартный метод print() , который применяется для вывода данных на консоль:

with open("hello.txt", "a") as myfile: print("\nhello metanit.com", file=myfile)

Для вывода данных в файл в метод print в качестве второго параметра передается название файла через параметр file. А первый параметр представляет записываемую в файл строку.

Чтение файла

Для чтения файла он открывается с режимом r (Read), и затем мы можем считать его содержимое различными методами:

  • readline() : считывает одну строку из файла
  • read() : считывает все содержимое файла в одну строку
  • readlines() : считывает все строки файла в список

Например, считаем выше записанный файл построчно:

with open("hello.txt", "r") as file: for line in file: print(line)

Несмотря на то, что мы явно не применяем метод readline() для чтения каждой строки, но в при переборе файла этот метод автоматически вызывается для получения каждой новой строки. Поэтому в цикле вручную нет смысла вызывать метод readline. Консольный вывод:

hello world hello work hello metanit.com

Однако поскольку функция print неявно добавляет к каждой строке перевод строки «\n», а строки в записанном файлетакже разделяются символом перевода строки «\n», то получается, что каждая строка оканчивается двойным «\n». и чтобы исключить излишнего переноса на другую строку в функцию print можно передать значение end=»» .

with open("hello.txt", "r") as file: for line in file: print(line, end="")

Теперь явным образом вызовем метод readline() для чтения отдельных строк:

with open("hello.txt", "r") as file: str1 = file.readline() # считываем первую строку print(str1, end="") str2 = file.readline() # считываем вторую строку print(str2)
hello world hello work

Метод readline можно использовать для построчного считывания файла в цикле while:

with open("hello.txt", "r") as file: line = file.readline() while line: print(line, end="") line = file.readline()

Если файл небольшой, то его можно разом считать с помощью метода read() :

with open("hello.txt", "r") as file: content = file.read() print(content)

И также применим метод readlines() для считывания всего файла в список строк:

with open("hello.txt", "r") as file: contents = file.readlines() str1 = contents[0] str2 = contents[1] print(str1, end="") print(str2)

При чтении файла мы можем столкнуться с тем, что его кодировка не совпадает с ASCII. В этом случае мы явным образом можем указать кодировку с помощью параметра encoding :

filename = "hello.txt" with open(filename, encoding="utf8") as file: text = file.read()

Чтение и запись

Для открытия файла сразу для чтения и записи применяются флаги:

  • r+ : если файл не найден, то генерируется исключение FileNotFoundError
  • w+ : если файл не существует, то он автоматически создается. Если файл существует, то он перезаписывается

Например, запишем и считаем из файла данные:

with open("hello.txt", "w+") as file: file.write("Hello world\nHello work\n") # сначала записываем данные file.seek(0) # перемещаемся к первому байту в файле content = file.read() # считываем данные print(content)

Перемещение по файлу

Для перемещения по файлу после его открытия применяется метод seek() . В него передается индекс байта, к которому надо переместить указатель в файле. Например, в примере выше после записи указатель в файле автоматически устанавливается на конец файла. И считывания данных идет с позиции, на которой стоит указатель. И чтобы его сдвинуть в самое начало, применяется вызов

file.seek(0)

Аналогичным образом мы можем перемещаться по файлу на нужную позицию. Например, считаем данные, начиная с 5-го символа:

with open("hello.txt", "w+") as file: file.write("Hello world\n") # сначала записываем данные file.seek(6) # перемещаемся к шестому байту в файле content = file.read() # считываем данные print(content) # world

Пример работы с файлами

Теперь напишем небольшой скрипт, в котором будет записывать введенный пользователем массив строк и считывать его обратно из файла на консоль:

# имя файла FILENAME = "messages.txt" # запись строки в файл def write(): message = input("Введите строку: ") with open(FILENAME, "a") as file: file.write(message + "\n") # чтение файла файл def read(): with open(FILENAME, "r") as file: for message in file: print(message, end="") print() # перевод строки для разделения меню и вывода while(True): selection = int(input("1.Запись в файл\t\t2.Чтение файла\t\t3.Выход\nВыберите действие: ")) match selection: case 1: write() case 2: read() case 3: break case _: print("Некорректный ввод") print("Программа завершена")

Пример работы программы:

1.Запись в файл 2.Чтение файла 3.Выход Выберите действие: 1 Введите строку: Hello World 1.Запись в файл 2.Чтение файла 3.Выход Выберите действие: 1 Введите строку: Hello METANIT.COM 1.Запись в файл 2.Чтение файла 3.Выход Выберите действие: 2 Hello World Hello METANIT.COM 1.Запись в файл 2.Чтение файла 3.Выход Выберите действие: 3 Программа завершена

Чтение файлов#

Посмотрим как считывать содержимое файлов, на примере файла 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 !

Python 3.8.3. Функция «readline» читает не строку целиком, а некоторое количество символов с начала строки

Я хочу присвоить переменной значение, равное содержанию определённой строки. В коде ниже я хочу получить значение второй строки из файла ‘list.txt’.

f = open('list.txt', 'r') text = f.readline(2) print(text) 

Получаю следующее:

>>> text 'ab' 

То есть, функция readline принимает в качестве аргумента не номер строки, а количество символов с начала первой строки. Я пробовал задавать число большее, чем символов в первой строке, но получал только полное значение первой строки. Почему так происходит?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *