Некоторые из наиболее распространенных задач в программировании связаны с чтением, записью или манипулированием данными. По этой причине особенно полезно уметь работать с различными форматами файлов, в которых хранятся разные типы данных. В этой статье мы расскажем, как обрабатывать текстовые файлы в Python 3.
Например, рассмотрим программу на Python, которая проверяет список пользователей для контроля доступа. Список пользователей может храниться в виде текстового файла, позволяя вам проверять доступ или изменять разрешения. Для решения подобных задач в Python есть возможность открывать, читать, записывать и закрывать файлы.
Скачивайте книги ТОЛЬКО на русском языке у нас в телеграм канале: PythonBooksRU
Для проработки этого руководства у вас должен быть установлен Python 3, а также настроена локальная среда программирования на вашем компьютере.
Справочная информация
Python очень гибок и может легко работать с различными форматами файлов, включая, но не ограничиваясь следующими:
Тип файла | Описание |
---|---|
Обычный текст | Обычные текстовые файлы хранят данные, которые представляют собой только символы (или строки) и исключают любые структурированные метаданные |
CSV | В CSV-файлах значения разделяются запятыми (или другими разделителями) для структурирования хранимых данных, позволяя сохранять данные в формате таблицы |
HTML | Файлы на языке гипертекстовой разметки хранят структурированные данные, предназначенные для отображения браузером, и обычно используются на сайтах |
JSON | JavaScript Object Notation - это простой и эффективный формат, что делает его одним из наиболее часто используемых форматов для хранения и передачи структурированных данных |
Этот материал будет посвящен работе с обычными текстовыми файлами.
Примечание редакции: о работе с CSV-файлами читайте в статье “Как прочитать CSV-файл в Python”.
Создание текстового файла
Прежде чем начать работу, необходимо убедиться, что у нас есть файл для работы. Для этого откройте редактор кода и создайте новый обычный текстовый файл days.txt.
В новом файле введите несколько строк текста с перечислением дней недели:
Monday Tuesday Wednesday Thursday Friday Saturday Sunday
Затем сохраните файл и запишите его местоположение. В данном примере наш пользователь sammy сохранил файл под именем /home/sammy/days.txt. Абсолютный путь к файлу понадобится в дальнейшем, когда мы будем открывать файл в Python.
Теперь, когда у вас есть файл для обработки, вы можете приступить к написанию кода.
Открываем текстовые файлы в Python 3
В своем редакторе кода создайте новый файл Python и назовите его files.py.
Чтобы открыть файл в Python, нам сначала нужно каким-то образом связать файл на диске с переменной в Python. Этот процесс называется открытием файла, а переменная – файловым дескриптором.
Для начала нужно указать Python, где находится файл. Местоположение файла часто называют путем к файлу. В нашем примере это /home/sammy/days.txt. Создайте переменную для хранения информации о пути.
path = '/home/sammy/days.txt'
Теперь можно использовать функцию Python open()
, чтобы открыть наш файл days.txt. Функция open()
требует в качестве первого аргумента путь к файлу. Она также принимает множество других параметров, из которых наиболее важным является необязательный параметр mode
. Это необязательная строка, определяющая режим, в котором будет открыт файл. Выбор режима зависит от того, что вы хотите сделать с файлом. Вот некоторые из доступных режимов:
- ‘r’ : используется для чтения из файла
- ‘w’ : используется для записи в файл
- ‘a’ : используется для добавления в файл
- ‘r+’ : используется для чтения файла и записи в тот же файл.
В этом примере мы хотим только читать из файла, поэтому мы будем использовать режим ‘r’. Используйте функцию open()
для открытия файла days.txt и присвойте результат переменной days_file
.
days_file = open(path, 'r')
Теперь, когда вы открыли файл, давайте прочтем его содержимое.
Читаем текстовые файлы в Python 3
Поскольку наш текстовый файл открыт, мы можем манипулировать им (т.е. читать из него) через переменную, которой он был присвоен. Python предоставляет три связанные операции для чтения информации из файла. Давайте немного разберемся, как работает каждая из них.
Использование read
Функция read()
возвращает все содержимое файла в виде одной строки. Например:
days_file.read()
Результат будет следующим:
'Monday\nTuesday\nWednesday\nThursday\nFriday\nSaturday\nSunday\n'
Примечание: \n
– это символ новой строки. При непосредственном взаимодействии с Python (например, при простом запуске python из командной строки), он будет использовать \n
для отображения новой строки. Вы также можете использовать его для обозначения новой строки при создании собственных строк.
Использование readline
Функция readline()
возвращает следующую строку файла до очередного символа новой строки включительно. Проще говоря, эта операция читает файл построчно.
days_file.readline()
Результат будет следующим:
'Monday\n'
Как только вы прочитаете строку с помощью операции readline
, текущая точка, с которой должно происходить чтение файла, переместится на следующую строку. Если снова вызвать эту фукнцю, она вернет следующую строку в файле:
days_file.readline()
Вывод:
'Tuesday\n'
Использование readlines
И, наконец, readlines()
возвращает список строк в файле, где каждый элемент списка представляет собой одну строку.
days_file.readlines()
Вывод:
['Monday\n', 'Tuesday\n', 'Wednesday\n', 'Thursday\n', 'Friday\n', 'Saturday\n', 'Sunday\n']
При чтении из файлов следует помнить, что после того, как файл был прочитан с помощью одной из операций чтения, он не может быть прочитан снова. Например, если сначала выполнить days_file.read()
, а затем days_file.readlines()
, то вторая операция вернет пустую строку. Поэтому, если вы захотите прочитать из файла, вам придется сначала открыть новую файловую переменную или использовать метод seek()
, что выходит за рамки данного руководства. Если вы хотите узнать больше, в Python есть отличная документация по этим методам.
Теперь, когда мы научились читать из файла, давайте узнаем, как записывать в новый файл.
Запись данных в текстовые файлы в Python 3
В этом шаге вы запишете новый файл с заголовком Days of the Week, за которым последует содержимое первого файла. Сначала создайте переменную title
(заголовок).
title = 'Days of the Week\n'
Вам также потребуется хранить дни недели в переменной, которую мы назовем days
. Следующий код открывает файл в режиме чтения, читает файл и сохраняет возвращенный результат операции чтения в нашей новой переменной days
.
path = '/home/sammy/days.txt' days_file = open(path, 'r') days = days_file.read()
Теперь, когда у вас есть переменные для заголовка и дней недели, вы можете начать запись в новый файл. Сначала укажите местоположение файла. Опять же, мы будем использовать каталог /home/sammy/, поэтому наш путь будет /home/sammy/new_days.txt. Затем вы можете открыть новый файл в режиме записи, используя функцию open()
с указанным режимом 'w'
.
new_path = '/home/sammy/new_days.txt' new_days = open(new_path, 'w')
Примечание: если файл new_days.txt уже существует до открытия файла, его старое содержимое будет перезаписано, поэтому будьте осторожны при использовании режима 'w'
!
После того как новый файл открыт, вы можете добавить данные, используя метод write()
. Этот метод принимает один строковый параметр и записывает эти данные в файл. Если вы хотите начать новую строку в файле, вы должны явно указать символ новой строки \n
. Когда мы присвоили переменной title
значение ‘Days of the Week\n’, символ новой строки был включен.
Запишите в файл заголовок, а затем дни недели. Возможно, будет полезно добавить несколько операторов print для вывода того, что мы записываем в файл. Это часто практикуется для отслеживания хода выполнения скриптов.
new_days.write(title) print(title) new_days.write(days) print(days)
И наконец, когда вы закончите работу с файлом, нужно закрыть его.
Как закрывать файлы в Python 3
Закрывая файл, вы завершаете связь с файлом на диске. Это также гарантирует, что другие программы смогут получить доступ к этому файлу, и сохраняет ваши данные в безопасности. Если вы не используете операторы with
(о них мы еще поговорим), всегда следите за тем, чтобы файлы закрывались.
Для этого примера закройте все наши файлы с помощью метода close()
.
days_file.close() new_days.close()
Использование with
Рекомендуемый способ работы с файлами в Python 3 (часто называемый питоническим способом) заключается в использовании операторов with
. Эти утверждения представляют собой сокращенные способы задать контекст, в котором выполняется работа, а после завершения этого контекста автоматически позаботиться об окончательных деталях, чтобы предотвратить распространенные ошибки. В случае работы с файлами оператор with
автоматически закроет файл.
Как и любой блок в Python, например, определение функции, оператор if
или цикл, оператор with
имеет форму простого оператора, за которым следует двоеточие и блок кода с отступом. Вот пример кода, который открывает файл и печатает его содержимое:
with open('/home/sammy/days.txt', 'r') as days_file: days = days_file.read() print(days)
Давайте пошагово рассмотрим, что делает этот код. Как и раньше, мы открываем файл с помощью встроенной функции Python open()
, передавая путь к файлу и параметры режима. Однако, поскольку мы используем оператор with
, вместо того, чтобы присвоить полученный хэндл файла переменной с помощью =
, мы присваиваем его с помощью ключевого слова as
. Это часть полного синтаксиса оператора with
:
with action as result: . . .
После символа :
мы переходим к следующей строке и делаем отступ в коде – именно так Python организует функциональные блоки. Как и раньше, у нас есть доступ к хэндлу файла в переменной days_file
, поэтому мы можем вызвать метод read()
, чтобы получить все содержимое и распечатать его.
Обратите внимание, что при этом не вызывается метод close()
. Это потому, что как только код покидает этот блок (то есть, как только следующая строка кода не имеет отступа либо файл заканчивается), контекст оператора with
знает, что нужно автоматически закрыть эти файлы. Преимуществом этого является не только то, что вам не нужно постоянно помнить о закрытии файлов, но и то, что вся ваша логика работы с конкретным файлом визуально и логически разделена в этом блоке. Такая структура помогает сохранить чистоту и читабельность кода.
Применяем with в нашем коде
Давайте перепишем наш код, применив оператор with
:
with open(path, 'r') as days_file, open(new_path, 'w') as new_days: days = days_file.read() new_days.write(title) new_days.write(days) print(title) print(days)
Теперь код стал гораздо более организованным. Как и прежде, мы начинаем с определения некоторых переменных: путей к двум нашим файлам и заголовка, который мы будем использовать как заголовок нового файла. После этого мы используем оператор with
, открываем наши два файла и сохраняем результаты в переменных с соответствующими именами. Как и раньше, мы читаем содержимое файла days_file
, затем записываем заголовок и это содержимое в new_days
. Наконец, в конце блока мы выводим прочитанные значения title
и days
.
Примечание: в отличие от некоторых других блоков в Python, переменные, определенные внутри блоков with
, доступны за пределами этой области видимости.
Хотя в некоторых случаях вам понадобится метод close()
, описанный ранее, и важно знать, как он работает, чаще всего при работе с файлами в Python вы будете использовать операторы with
.
Проверка нашего кода
Прежде чем запускать свой код, неплохо бы убедиться, что все выглядит правильно. Конечный продукт должен выглядеть примерно так:
path = '/home/sammy/days.txt' new_path = '/home/sammy/new_days.txt' title = 'Days of the week\n' with open(path, 'r') as days_file, open(new_path, 'w') as new_days: days = days_file.read() new_days.write(title) new_days.write(days) print(title) print(days)
После сохранения кода откройте терминал и запустите ваш Python-скрипт, как показано ниже:
python files.py
Примечание редакции: рекомендуем почитать “Как запустить скрипт Python”.
Выходные данные будут выглядеть следующим образом:
Days of the Week Monday Tuesday Wednesday Thursday Friday Saturday Sunday
Теперь еще раз проверьте, что код полностью сработал, открыв новый файл (new_days.txt). Если все прошло успешно, он должен содержать следующее:
Days of the Week Monday Tuesday Wednesday Thursday Friday Saturday Sunday
Заключение
В этом уроке мы рассмотрели, как работать с обычными текстовыми файлами и манипулировать ими в Python 3. Теперь вы можете открывать, читать, записывать и закрывать файлы. Python предоставляет множество других полезных методов для работы со вводом и выводом данных, а также документацию, из которой можно узнать больше.
Перевод статьи Michelle Morales «How To Handle Plain Text Files in Python 3».
Пингбэк: Подсчет слов в строке или файле при помощи Python