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

Файлы обычно классифицируются как текстовые и бинарные. Текстовые файлы содержат символьные данные и строки, в то время как бинарные – поток байтов. Например, изображения читаются побайтово.

Работа с бинарными файлами может быть более сложной. Обычно для их обработки используют специальные модули Python, такие как pickle или struct. В этом уроке будут разобраны основные методы чтения текстовых файлов и записи в них.

Функция open() – открытие файла

Для открытия файла используется встроенная в Python функция open(). Она обычно принимает один или два аргумента. Первый аргумент – это имя файла или полный путь, если файл исключительно не находится в том же каталоге, что и скрипт. Второй аргумент указывает на режим, в котором файл открывается.

Основные режимы: чтение ('r') и запись ('w'). Открытый в режиме чтения файл недоступен для записи, можно лишь читать данные. В режиме записи добавлять данные возможно, но считать нельзя.

Если файл открыт в режиме 'w', предшествующие данные будут удалены, и файл станет пустым. Чтобы сохранить текущие данные и добавить новые, стоит выбрать режим дозаписи ('a').

При отсутствии файла, режим 'w' создаст новый. Чтобы гарантированно создать новый файл без риска случайного перезаписи, можно использовать режим 'x'. Он создаёт новый файл, а если файл с указанным именем уже существует, будет выброшено исключение.

По умолчанию open() открывает файл в текстовом режиме чтения, если режим не указан. Чтобы открыть файл в бинарном режиме, добавьте к символу режима 'b'. Символ 't' указывает на текстовый режим, но его чаще всего опускают, так как это состояние по умолчанию.

Недопустимо использовать только тип файла, например, open("имя_файла", 'b') выдаст ошибку, даже при чтении. Правильное использование: open("имя_файла", 'rb'). Текстовые файлы можно открыть с командой open("имя_файла"), поскольку режимы 'r' и 't' предполагаются по умолчанию.

Открытие с помощью open() возвращает файл как объект, который нужно либо связать с переменной, чтобы не потерять, либо сразу же прочитать.

Чтение файла

Метод read() позволяет прочитать содержимое файла полностью или частично, по указанному количеству байт. Пусть в файле data.txt находится следующее содержимое:

one - 1 - I
two - 2 - II
three - 3 - III
four - 4 - IV
five - 5 - V

Чтение файла:

>>> f1 = open('data.txt')
>>> f1.read(10)
'one - 1 - '
>>> f1.read()
'I\ntwo - 2 - II\nthree - 3 - III\nfour - 4 - IV\nfive - 5 - V\n'
>>> f1.read()
''
>>> type(f1.read())
<class 'str'>

Сначала считываются десять байтов, соответствующие десяти символам. Хотя файл не является бинарным, доступно побайтовое чтение. Последующее вызов read() извлекает оставшийся текст. После этого объект f1 становится пустым.

Заметьте, метод read() возвращает строку, а конец строки как '\n'.

Для построчного чтения файла можно использовать метод readline():

>>> f1 = open('data.txt')
>>> f1.readline()
'one - 1 - I\n'
>>> f1.readline()
'two - 2 - II\n'
>>> f1.readline()
'three - 3 — III\n'

Метод readlines() считывает все строки и формирует их в список:

>>> f1 = open('data.txt')
>>> f1.readlines()
['one - 1 - I\n', 'two - 2 - II\n', 'three - 3 - III\n', 'four - 4 - IV\n', 'five - 5 - V\n']

Объект файлового типа является итерируемым, что позволяет извлекать его элементы итерационно. Это означает, что данные можно читать в цикле, игнорируя методы чтения:

>>> f1 = open('data.txt')
>>> for i in open('data.txt'):
...     print(i)
...
one - 1 - I

two - 2 - II

three - 3 - III

four - 4 - IV

five - 5 - V

>>> 

Вывод включает лишние пустые строки. Это происходит из-за того, что функция print() преобразует '\n' в переход на новую строку и добавляет ещё один переход. Можно создать список строк файла без '\n':

>>> nums = []
>>> for i in open('data.txt'):
...     nums.append(i[:-1])
...
>>> nums
['one - 1 - I', 'two - 2 - II', 'three - 3 - III', 'four - 4 - IV', 'five - 5 - V']

Переменной i присваивается текущая строка файла. Через оператор среза отбрасывается последний символ, поскольку '\n' — это один символ.

Запись в файл

Методы write() и writelines() используются для записи в файл. Второй метод позволяет передавать в файл структуру данных:

>>> l = ['tree', 'four']
>>> f2 = open('newdata.txt', 'w')
>>> f2.write('one')
3
>>> f2.write('two')
4
>>> f2.writelines(l)

Метод write() возвращает количество записанных символов.

Закрытие файла

После завершения работы с файлом важно его закрыть, чтобы освободить ресурсы памяти. Это делается методом close(). Свойство closed файлового объекта помогает узнать закрыто ли файл.

>>> f1.close()
>>> f1.closed
True
>>> f2.closed
False

При открытии файла в заголовке цикла (for i in open('fname')), интерпретатор автоматически закрывает файл после завершения цикла.

Практическая работа

  1. Создайте файл nums.txt с несколькими числами, записанными через пробел. Напишите программу, которая посчитает и выведет общую сумму чисел, хранящихся в этом файле.

Вопросы для самопроверки:

  1. Какие модули Python обычно используют для работы с бинарными файлами?
  2. Чем текстовые файлы отличаются от бинарных?
  3. Какие аргументы принимает функция open() и что они определяют?
  4. Что произойдет с данными в файле, если открыть его в режиме записи ("w")?
  5. Какой режим открытия файла следует использовать, чтобы добавить новые данные без удаления существующих?
  6. Как читать файл построчно в Python?
  7. Почему важно закрывать файл после завершения работы с ним?

Программа курса:

  1. Описание курса
  2. Эволюция и основы языков программирования

    История программирования в кратком и понятном изложении. Что такое машинный язык, почему появились ассемблеры, языки высокого уровня и объектно-ориентированные. Зачем нужен транслятор, и почему он может быть либо компилятором, либо интерпретатором.

  3. Знакомство с основами Python

    Особенности языка Python, работа в интерактивном режиме и подготовка файлов с исходным кодом.

  4. Типы данных и переменные в Python

    Базовые типы данных в Python: целое, вещественное числа, строки. Изменение типа данных с помощью встроенных функций. Понятие об операциях и переменных. Присваивание значения переменной.

  5. Ввод и вывод данных с Python функциями

    Для вывода на экран в Python 3.x используется функция print(). Вывод может быть предварительно отформатирован. Для ввода данных с клавиатуры используется функция input(), которая возвращает в программу строку.

  6. Логические выражения и операторы в Python

    Логические выражения. Логические операторы языка Python: == (равно), != (не равно), (больше), = (больше или равно), and (логическое И), or (логическое ИЛИ), not (отрицание).

  7. Ветвление и условные операторы в Python

    Управление потоком программы с помощью операторов if-else. Создание логических ветвлений, обработка условий и выполнение разных блоков кода в Python.

  8. Изучите обработку ошибок и исключений в Python

    Общее представление об ошибках и исключениях в языке программирования Python. SyntaxError, NameError, TypeError, ValueError, ZeroDivisionError. Обработка исключений с помощью инструкции try-except.

  9. Множественное ветвление с if-elif-else в Python

    Оператор множественного ветвления языка Python позволяет организовать более двух веток выполнения программы без необходимости вложения условных операторов друг в друга. Конструкция включает одну ветку if, произвольное количество elif и необязательную ветку else.

  10. Цикл while и его применение в Python

    С помощью циклов в программировании организуется многократное следующее друг за другом выполнение одних и тех же участков кода. Бывают циклы с условием и со счетчиком. К первым относится цикл while, или цикл "пока".

  11. Изучите функции и их применение в Python

    Функции - важный элемент структурного программирования. Они позволяют обособить участок кода, выполняющий определенную задачу. В дальнейшем к нему можно обращаться из разных мест программы по имени, которым он назван. В языке Python функции определяются с помощью оператора def.

  12. Локальные и глобальные переменные в Python

    В программировании важное значение имеет представление о локальных и глобальных переменных. Локальные переменные существуют внутри функций и не доступны за ее пределами. Глобальные переменные видны во всей программе.

  13. Оператор return и возврат значений в Python

    С помощью оператора return можно вернуть значение из тела функции в основную программу. В языке программирования Python можно вернуть несколько значений, перечислив их через запятую после оператора return. Также в функции может быть несколько return, но всегда выполняется только один из них.

  14. Параметры и аргументы функций в Python

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

  15. Встроенные функции Python для работы

    Язык программирования Python включает множество встроенных функций. В предыдущих уроках мы использовали такие функции как print() и input(), а также функции преобразования типов данных. В этом уроке рассматриваются встроенные функции для работы с символами и числами.

  16. Использование модулей в Python

    Использование модулей в программировании позволяет изолировать код, выполняющий частные задачи, в отдельные файлы. После чего обращаться к нему из разных программ. Создание модулей - следующий шаг после функций, когда участок кода обособляется внутри одного файла-программы. Для языка Python есть множество встроенных и сторонних модулей.

  17. Генерация псевдослучайных чисел в Python

    Для генерации псевдослучайных чисел в языке программирования Python используются функции модуля random. Функция random() генерирует вещественное число от 0 до 1. Функции randint() и randrange() производят целые псевдослучайные числа в указанных диапазонах.

  18. Изучение списков в Python - основы и операции

    Списки в Python - это аналог массивов в других языках программирования. Однако список может содержать элементы разных типов. В терминологии Python список - это изменяемая упорядоченная структура данных. Можно заменять его элементы, добавлять и удалять их, брать срезы. В язык встроены методы для работы со списками.

  19. Изучение цикла for в Python

    Цикл for в языке программирования Python предназначен для перебора элементов структур данных (списков, словарей, кортежей, множеств) и многих других объектов. Это не цикл со счетчиком, каковым является for во многих других языках. Нередко цикл for используется совместно с функцией range(), генерирующей объекты-диапазоны.

  20. Строки в Python - методы и срезы

    В Python строки - это неизменяемые последовательности символов или подстрок. Из них, так же как из списков, можно извлекать отдельные символы с помощью индексов или подстроки с помощью взятия срезов. В языке Python есть множество встроенных строковых методов, позволяющих упростить обработку строк.

  21. Кортежи - неизменяемые структуры данных

    Кортежи в Python - это неизменяемые структуры данных, состоящие из элементов одного или разных типов. Кортежи подобны спискам и обычно используются для защиты последних от изменений. Преобразование одного в другой выполняется с помощью встроенных функций tuple() и list().

  22. Словари в Python - работа с ключами и значениями

    Словарь в Python - это изменяемая неупорядоченная структура данных, элементами которой являются пары "ключ:значение". В словари можно добавлять и удалять элементы, изменять значения ключей. В Python словари имеют ряд методов, упрощающих работу с ними.

  23. Работа с файлами в Python

    В языке программирования Python открытие файлов выполняется с помощью функции open(), которой передается два аргумента - имя файла и режим. Файл может быть открыт в режиме чтения, записи, добавления. Также может быть указан тип файла - текстовый или бинарный. Для файлов есть ряд встроенных методов чтения, записи и др.