Всем привет!
В этой статье я расскажу о том как работать с файлами.
Чтобы понять что же такое файл, то давайте представим библиотеку, где каждая книга лежит на своем месте и в ней есть какой-то последовательный набор информации, хранятся на определённой полке.
То есть файл— это набор последовательных данных, который расположен в определённой области памяти компьютера.
У файла есть его формат или как принято говорить расширение файла. Расширением файла является то, что идет после его наименования
"наименование"."расширение файла"
Он показывает какие данные хранятся в этом файле.
Для работы с файлами в Python есть метод open, который на вход принимает ряд аргументов.
open(имя файла, режим доступа), где 1. имя файла это строка с наименование файла и его расширением (test.txt), 2. режим доступа, который определяет как будет производиться работа с файлом.
Список режимов доступа к файлу в Python:
- r - Открывает файл только для чтения. Указатель стоит в начале файла.
- rb - Открывает файл для чтения в двоичном формате. Указатель стоит в начале файла.
- r+ - Открывает файл для чтения и записи. Указатель стоит в начале файла.
- rb+ - Открывает файл для чтения и записи в двоичном формате. Указатель стоит в начале файла.
- w - Открывает файл только для записи. Указатель стоит в начале файла. Создает файл с именем имя_файла, если такового не существует.
- wb - Открывает файл для записи в двоичном формате. Указатель стоит в начале файла. Создает файл с именем имя_файла, если такового не существует.
- w+ - Открывает файл для чтения и записи. Указатель стоит в начале файла. Создает файл с именем имя_файла, если такового не существует.
- wb+ - Открывает файл для чтения и записи в двоичном формате. Указатель стоит в начале файла. Создает файл с именем имя_файла, если такового не существует.
- a - Открывает файл для добавления информации в файл. Указатель стоит в конце файла. Создает файл с именем имя_файла, если такового не существует.
- ab - Открывает файл для добавления в двоичном формате. Указатель стоит в конце файла. Создает файл с именем имя_файла, если такового не существует.
- a+ - Открывает файл для добавления и чтения. Указатель стоит в конце файла. Создает файл с именем имя_файла, если такового не существует.
- 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
Вопрос: Из какого ты города?
Ответ: Москва
Это были основные методы работы с файлом. Тема обширная и писать про неё можно много.
В следующей статье мы разберём как работать с строками, которые получили из файла и напишем интересную программу.
Если информация для тебя интересная, то подписывайся чтобы не пропустить новые публикации, а так же ставь лайк и комментируй.
Другие статьи канала: