Запись в текстовый файл
Чтобы открыть текстовый файл на запись, необходимо применить режим w (перезапись) или a (дозапись). Затем для записи применяется метод write(str), в который передается записываемая строка. Стоит отметить, что записывается именно строка, поэтому, если нужно записать числа, данные других типов, то их предварительно нужно конвертировать в строку.
Запишем некоторую информацию в файл “hello.txt”:
| 1 2 | with open("hello.txt", "w") as file:file.write("hello world") |
Если мы откроем папку, в которой находится текущий скрипт Python, то увидем там файл hello.txt. Этот файл можно открыть в любом текстовом редакторе и при желании изменить.
Теперь дозапишем в этот файл еще одну строку:
| 1 2 | with open("hello.txt", "a") as file:file.write("\ngood bye, world") |
Дозапись выглядит как добавление строку к последнему символу в файле, поэтому, если необходимо сделать запись с новой строки, то можно использовать эскейп-последовательность “\n”. В итоге файл hello.txt будет иметь следующее содержимое:
| 1 2 | hello worldgood bye, world |
Еще один способ записи в файл представляет стандартный метод print(), который применяется для вывода данных на консоль:
| 1 2 | with open("hello.txt", "a") as hello_file:print("Hello, world", file=hello_file) |
Для вывода данных в файл в метод print в качестве второго параметра передается название файла через параметр file. А первый параметр представляет записываемую в файл строку.
Чтение файла
Для чтения файла он открывается с режимом r (Read), и затем мы можем считать его содержимое различными методами:
- readline(): считывает одну строку из файла
- read(): считывает все содержимое файла в одну строку
- readlines(): считывает все строки файла в список
Например, считаем выше записанный файл построчно:
| 1 2 3 | with open("hello.txt", "r") as file:for line in file:print(line, end="") |
Несмотря на то, что мы явно не применяем метод readline() для чтения каждой строки, но в при переборе файла этот метод автоматически вызывается для получения каждой новой строки. Поэтому в цикле вручную нет смысла вызывать метод readline. И поскольку строки разделяются символом перевода строки “\n”, то чтобы исключить излишнего переноса на другую строку в функцию print передается значение end="".
Теперь явным образом вызовем метод readline() для чтения отдельных строк:
| 1 2 3 4 5 | with open("hello.txt", "r") as file:str1 = file.readline()print(str1, end="")str2 = file.readline()print(str2) |
Консольный вывод:
hello world good bye, world
Метод readline можно использовать для построчного считывания файла в цикле while:
| 1 2 3 4 5 | with open("hello.txt", "r") as file:line = file.readline()while line:print(line, end="")line = file.readline() |
Если файл небольшой, то его можно разом считать с помощью метода read():
| 1 2 3 | with open("hello.txt", "r") as file:content = file.read()print(content) |
И также применим метод readlines() для считывания всего файла в список строк:
| 1 2 3 4 5 6 | with open("hello.txt", "r") as file:contents = file.readlines()str1 = contents[0]str2 = contents[1]print(str1, end="")print(str2) |
При чтении файла мы можем столкнуться с тем, что его кодировка не совпадает с ASCII. В этом случае мы явным образом можем указать кодировку с помощью параметра encoding:
| 1 2 3 | filename = "hello.txt"with open(filename, encoding="utf8") as file:text = file.read() |
Теперь напишем небольшой скрипт, в котором будет записывать введенный пользователем массив строк и считывать его обратно из файла на консоль:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # имя файлаFILENAME = "messages.txt"# определяем пустой списокmessages = list() for i in range(4):message = input("Введите строку " + str(i+1) + ": ")messages.append(message + "\n")# запись списка в файлwith open(FILENAME, "a") as file:for message in messages:file.write(message)# считываем сообщения из файлаprint("Считанные сообщения")with open(FILENAME, "r") as file:for message in file:print(message, end="") |
Пример работы программы:
Введите строку 1: hello Введите строку 2: world peace Введите строку 3: great job Введите строку 4: Python Считанные сообщения hello world peace great job Python