Найти в Дзене

Python. Основы синтаксиса. Работа с файлом. Часть 6

Оглавление

Всем привет!

В этой статье я расскажу о том как работать с файлами.

Чтобы понять что же такое файл, то давайте представим библиотеку, где каждая книга лежит на своем месте и в ней есть какой-то последовательный набор информации, хранятся на определённой полке.

То есть файл— это набор последовательных данных, который расположен в определённой области памяти компьютера.

У файла есть его формат или как принято говорить расширение файла. Расширением файла является то, что идет после его наименования

"наименование"."расширение файла"

Он показывает какие данные хранятся в этом файле.

Для работы с файлами в Python есть метод open, который на вход принимает ряд аргументов.

open(имя файла, режим доступа), где 1. имя файла это строка с наименование файла и его расширением (test.txt), 2. режим доступа, который определяет как будет производиться работа с файлом.

Список режимов доступа к файлу в Python:

  1. r - Открывает файл только для чтения. Указатель стоит в начале файла.
  2. rb - Открывает файл для чтения в двоичном формате. Указатель стоит в начале файла.
  3. r+ - Открывает файл для чтения и записи. Указатель стоит в начале файла.
  4. rb+ - Открывает файл для чтения и записи в двоичном формате. Указатель стоит в начале файла.
  5. w - Открывает файл только для записи. Указатель стоит в начале файла. Создает файл с именем имя_файла, если такового не существует.
  6. wb - Открывает файл для записи в двоичном формате. Указатель стоит в начале файла. Создает файл с именем имя_файла, если такового не существует.
  7. w+ - Открывает файл для чтения и записи. Указатель стоит в начале файла. Создает файл с именем имя_файла, если такового не существует.
  8. wb+ - Открывает файл для чтения и записи в двоичном формате. Указатель стоит в начале файла. Создает файл с именем имя_файла, если такового не существует.
  9. a - Открывает файл для добавления информации в файл. Указатель стоит в конце файла. Создает файл с именем имя_файла, если такового не существует.
  10. ab - Открывает файл для добавления в двоичном формате. Указатель стоит в конце файла. Создает файл с именем имя_файла, если такового не существует.
  11. a+ - Открывает файл для добавления и чтения. Указатель стоит в конце файла. Создает файл с именем имя_файла, если такового не существует.
  12. ab+ - Открывает файл для добавления и чтения в двоичном формате. Указатель стоит в конце файла. Создает файл с именем имя_файла, если такового не существует

Если не передавать никакой режим доступа, то по умолчанию отработает режим r.

Чтение файла

Давайте теперь напишем программу, которая умеет читать файл и выводить содержимое файла в консоль программы.

Предварительно я создал, для удобства, в корне проекта файл, который буду читать.

Для чтений данных с файла есть метод read, которым я воспользуюсь.

Текст, который содержит файл: Привет, я текстовый файл, который хотят читать снова и снова

Листинг 1
# Создаём переменную file и вызываем метод open
file = open('test.txt', 'r')

# Читаем файл и выводим данные в консоль
data = file.read()

# Выведем считанные данные в консоль.
print(data)
Вывод:
Привет я текстовый файл, который хотят читать снова и снова

Как мы видим вывод не разобрать. Для того, что вывести данные хранящиеся в файле в нужно кодировке, необходимо её указать.

Листинг 2
# Создаём переменную file и вызываем метод open
# Необходимо задать кодировку, чтобы работать с символами, который указаны в файле.
file = open('test.txt', 'r', encoding="utf-8")

# Читаем файл и выводим данные в консоль
data = file.read()

# Выведем считанные данные в консоль.
print(data)
Вывод:
Привет я текстовый файл, который хотят читать снова и снова

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

Листинг 3
file = open('test.txt', 'r', encoding="utf-8")
data = file.read()

# Закрываем работу с файлом освобождаем память
file.close()

Метод read позволяет частично считывать данные из файла. Для этого в метод read необходимо передать целое число, которое будет означать сколько байт требуется считать из файла.

Листинг 4
file = open('test.txt', encoding="utf-8")
# Передаем в метод read сколько байт хотим считать
data = file.read(6)
print(data)
Вывод: Привет
Если передать например 10 байт, то получим такой результат:
Вывод: Привет я т

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

Файл можно пройти итерационно, то есть в цикле. Для этого нужно воспользоваться методом open и запустить цикл for по нашему файлу.

Я добавил в тестовый файл ещё немного информации.

Листинг 5
file = open('test.txt', encoding="utf-8")
# Запустим чтение файла в цикле и выводим в консоль данные
for data in file:
print(data)
Вывод:
Привет я текстовый файл, который хотят читать снова и снова
У меня есть ещё одна строка
И ещё одна строка
И вот это уже 4 строка

Как видно из примеров выше, я снова забыл о методе close, который нужно вызывать после работы с файлом.

Чтобы каждый раз не писать метод close, можно воспользоваться специально конструкцией with, которая позволяет открыть файл и закрыть автоматически, когда мы закончим работать с файлом.

Листинг 6
with open('test.txt', encoding="utf-8") as file:
for data in file:
print(data)
Вывод:
Привет я текстовый файл, который хотят читать снова и снова
У меня есть ещё одна строка
И ещё одна строка
И вот это уже 4 строка

Можно заметить, что конструкция очень удобная и не нужно переживать за то, что ты забыл вызвать метод close в конце.

Запись в файл

Перейдём к самой интересно части статьи, а именно к тому, как записывать данные в файл.

Для записи данные в файл используется режим w(write) и метод write/writelines.

Метод write - записывает последовательность символов.

Метод writelines - записывает последовательность строк, то есть список, который в него передали.

!!! ⚠️При работе записью важно знать, что если файла не было, то программа его создаст, если файл есть, то программа его полностью перезапишет ⚠️!!!

Разберем несколько примеров и напишем небольшую программу

Листинг 7
# Выставляем режим w - write
# Писать будем в файл write_data
# Файл будет создан автоматически
with open('write_data.txt', 'w', encoding="utf-8") as file_write:
file_write.write("Привет, это первая запись в файл!")

# А теперь прочитаем, что записалось в файл
# и выведем в консоль
file_read = open('write_data.txt', 'r', encoding="utf-8")
data = file_read.read()
print(data)
file_read.close()
Вывод: Привет, это первая запись в файл!

Как видно из примера, мы записали какой-то текст в файл и затем прочитали этот файл и вывели в консоль то, что в него записалось.

Но если мы захотим записать ещё что-то, то наш наш текст будет "слипаться".

Листинг 8
# Выставляем режим w - write
# Писать будем в файл write_data
# Файл будет создан автоматически
with open('write_data.txt', 'w', encoding="utf-8") as file_write:
file_write.write("Привет, это первая запись в файл!")
file_write.write("Привет, это вторя запись в файл!")

# А теперь прочитаем, что записалось в файл
# и выведем в консоль
file_read = open('write_data.txt', 'r', encoding="utf-8")
data = file_read.read()
print(data)
file_read.close()
Вывод: Привет, это первая запись в файл!Привет, это вторя запись в файл!

Наши записи слиплись, потому что программа будет все писать в одну строчку, а для того, чтобы этого избежать и сделать перенос нужно добавить спец. символ - \n (newline). Это символ никак не отобразится и перенесёт новую запись в файл на следующую строчку.

Листинг 9
# Выставляем режим w - write
# Писать будем в файл write_data
# Файл будет создан автоматически
# Добавим спец. символ \n
with open('write_data.txt', 'w', encoding="utf-8") as file_write:
file_write.write("Привет, это первая запись в файл!\n")
file_write.write("Привет, это вторя запись в файл!")

# А теперь прочитаем, что записалось в файл
# и выведем в консоль
file_read = open('write_data.txt', 'r', encoding="utf-8")
data = file_read.read()
print(data)
file_read.close()
Вывод:
Привет, это первая запись в файл!
Привет, это вторя запись в файл!

Как видно, спец. символ отработал корректно и новая запись в файл находится на своём месте.

Аналогичная работа будет и с методом writelines только вместо строки будет передаваться список строк.

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

Листинг 10
# Реализуем метод который будет принимать файл и вопрос
def write(file, question):
question_data = question
write_data = input(question_data + '\n')
file.write(f'Вопрос: {question_data}\n Ответ: {write_data}\n')
with open('write_data.txt', 'w', encoding="utf-8") as file_write:
# Реализуем переменную вопроса и ответа
write(file_write, "Как тебя зовут?")
write(file_write, 'Сколько тебе лет?')
write(file_write, 'Из какого ты города?')
Консоль:
Как тебя зовут?
Дима
Сколько тебе лет?
30
Из какого ты города?
Москва
Файл:
Вопрос: Как тебя зовут?
Ответ: Дима
Вопрос: Сколько тебе лет?
Ответ: 30
Вопрос: Из какого ты города?
Ответ: Москва

Это были основные методы работы с файлом. Тема обширная и писать про неё можно много.

В следующей статье мы разберём как работать с строками, которые получили из файла и напишем интересную программу.

Если информация для тебя интересная, то подписывайся чтобы не пропустить новые публикации, а так же ставь лайк и комментируй.

Другие статьи канала:

Изучаю язык программирования Python. Основы синтаксиса. Методы. Часть 5.1
Изучаю языки програмирования17 марта 2023