owned this note
owned this note
Published
Linked with GitHub
# Работа с файлами
---
## Запись в файл
----
При работе над реальными проектами очень часто возникает необходимость записать в текстовый файл какие-дибо данные (например мы записываем логи работы нашего приложения). Есть уже готовые решения и библиотеки, но их использование не всегда эффективно, гораздо проще написать разовую функцию на начальных этапах.
----
Чтобы открыть текстовый файл на запись, необходимо применить режим w (перезапись) или a (дозапись). Затем для записи применяется метод write(str), в который передается записываемая строка. Стоит отметить, что записывается именно строка, поэтому, если нужно записать числа, данные других типов, то их предварительно нужно конвертировать в строку.
----
Запишем некоторую информацию в файл "hello.txt":
```python=
with open("hello.txt", "w") as file:
file.write("hello world")
```
----
В Python имеется аккуратно встроенный инструмент, применяя который вы можете заметно упростить чтение и редактирование файлов. Оператор with создает диспетчер контекста в Пайтоне, который автоматически закрывает файл для вас, по окончанию работы в нем.
Если мы откроем папку, в которой находится текущий скрипт Python, то увидем там файл hello.txt. Этот файл можно открыть в любом текстовом редакторе и при желании изменить.
----
Дозапись выглядит как добавление строку к последнему символу в файле, поэтому, если необходимо сделать запись с новой строки, то можно использовать эскейп-последовательность "\n".
Теперь дозапишем в этот файл еще одну строку:
```python=
with open("hello.txt", "a") as file:
file.write("\ngood bye, world")
```
----
Еще один способ записи в файл представляет стандартный метод print(), который применяется для вывода данных на консоль:
```python=
with open("hello.txt", "a") as hello_file:
print("Hello, world", file=hello_file)
```
---
## Чтение файлов
----
Для чтения файла он открывается с режимом r (Read), и затем мы можем считать его содержимое различными методами:
* readline(): считывает одну строку из файла
* read(): считывает все содержимое файла в одну строку
* readlines(): считывает все строки файла в список
----
Например, считаем выше записанный файл построчно:
```python=
with open("hello.txt", "r") as file:
for line in file:
print(line, end="")
```
----
Несмотря на то, что мы явно не применяем метод readline() для чтения каждой строки, но в при переборе файла этот метод автоматически вызывается для получения каждой новой строки. Поэтому в цикле вручную нет смысла вызывать метод readline. И поскольку строки разделяются символом перевода строки "\n", то чтобы исключить излишнего переноса на другую строку в функцию print передается значение end="".
----
Теперь явным образом вызовем метод readline() для чтения отдельных строк:
```python=
with open("hello.txt", "r") as file:
str1 = file.readline()
print(str1, end="")
str2 = file.readline()
print(str2)
```
----
Если файл небольшой, то его можно разом считать с помощью метода read():
```python=
with open("hello.txt", "r") as file:
content = file.read()
print(content)
```
----
И также применим метод readlines() для считывания всего файла в список строк:
```python=
with open("hello.txt", "r") as file:
contents = file.readlines()
str1 = contents[0]
str2 = contents[1]
print(str1, end="")
print(str2)
```
----
При чтении файла мы можем столкнуться с тем, что его кодировка не совпадает с ASCII. В этом случае мы явным образом можем указать кодировку с помощью параметра encoding:
```python=
filename = "hello.txt"
with open(filename, encoding="utf8") as file:
text = file.read()
```
---
## Задачи
----
1. Написать программу, которая записывает значение числа N в файл. Число N вводится с клавиатуры.
----
2. Написать программу, которая считывает число правильных ответов на тестовой части Олимпиады из файла Olimp.txt (Этот файл необходимо предварительно создать в своей папке в Блокноте и записать в него число правильных ответов). Если дано больше 40 ответов, то программа должна выдавать сообщение, что тесты пройдены, иначе – нет.
----
3. Написать программу, которая добавляет в текстовый файл Pupils.txt личную карточку учащегося. Программа задает пользователю несколько вопросов (Фамилия, имя, отчество, возраст, школа, класс, телефон). В одной строке создаваемого текстового файла должны находиться как вопрос, так и ответ на этот вопрос.
----
4. Написать программу, которая записывает последовательность чисел от 15 до -5 в файл Numbers.txt. В каждой строке файла должно находиться единственное число.
----
5. Напишите программу, которая читает из файла и выводит на экран числа из файла Numbers.txt, сформированного в предыдущей задаче.
----
6. Дан файл, содержащий два целых числа, записанных через пробел в единственной строке текстового файла. Найти сумму этих чисел и вывести ее на экран.
----
7. В текстовом файле Invite.txt записано в первой строке имя и фамилия учащегося, а во второй строке время проведения дня открытых дверей в центре КИТ в часах. Необходимо написать программу, которая считывает данные из текстового файла Invite.txt и рисует на экране приглашение на имя этого учащегося. В файл Invite.txt дописывается строка «Выполнено».
----
8. Доработать программу из предыдущего примера так, чтобы она выводила еще и минуты до начала дня открытых дверей. Минуты также нужно считывать из текстового файла.
----
9. Доработать программу из предыдущего примера так, чтобы она считывала данные последовательно из нескольких файлов. Имена файлов создаются с именами `Invite№.txt`, где `№` заменяется номером приглашения. Количество файлов с приглашениями вводится с клавиатуры. Программа выводит на экран приглашения для каждого файла.