Эта глава посвящена разнообразным способам хранения данных, каждый из которых оптимизирован для разных целей: плоским файлам, структурированным файлам и базам данных. Операции с файлами, не касающиеся ввода-вывода, рассматриваются в разделе «Файлы» главы 10.
В этой главе также будут показаны первые примеры использования нестандартных модулей Python — да-да, этот код не входит в стандартные библиотеки Python. Вы можете без особых проблем установить их с помощью команды pip. Более подробно об использовании этих модулей вы можете прочитать в приложении Г.
Ввод информации в файлы и ее вывод из них
Самый простой пример стойкого хранилища — это старый добрый файл, иногда его еще называют
Перед тем как что-то записать в файл или считать из него, вам нужно открыть его:
fileobj = open(filename, mode)
Кратко поясню фрагменты этого вызова:
• fileobj — это объект файла, возвращаемый функцией open();
• filename — это строка, представляющая собой имя файла;
• mode — это строка, указывающая на тип файла и действия, которые вы хотите над ним произвести.
Первая буква строки mode указывает на
• r означает чтение;
• w означает запись. Если файла не существует, он будет создан. Если файл существует, он будет перезаписан;
• x означает запись, но только если файла еще не существует;
• a означает добавление данных в конец файла, если он существует.
Вторая буква строки mode указывает на
• t (или ничего) означает, что файл текстовый;
• b означает, что файл бинарный.
После открытия файла вы вызываете функции для чтения или записи данных, они будут показаны в следующих примерах.
Наконец, вам нужно
Создадим файл, содержащий одну строку, в одной программе и считаем его в другой.
Запись в текстовый файл с помощью функции write()
По какой-то причине существует не так уж много лимериков о специальной теории относительности. В качестве источника данных придется использовать всего один:
>>> poem = '''There was a young lady named Bright,
… Whose speed was far faster than light;
… She started one day
… In a relative way,
… And returned on the previous night.'''
>>> len(poem)
150
Следующий код записывает это стихотворение в файл 'relativity' с помощью всего одного вызова:
>>> fout = open('relativity', 'wt')
>>> fout.write(poem)
150
>>> fout.close()
Функция write() возвращает число записанных байтов. Она не добавляет никаких пробелов или символов новой строки, как это делает функция print(). С помощью функции print() вы также можете записывать данные в текстовый файл:
>>> fout = open('relativity', 'wt')
>>> print(poem, file=fout)
>>> fout.close()
Отсюда возникает вопрос: какую функцию использовать — write() или print()? По умолчанию функция print() добавляет пробел после каждого аргумента и символ новой строки в конце. В предыдущем примере она добавила символ новой строки в файл relativity. Для того чтобы функция print() работала как функция write(), передайте ей два следующих аргумента:
• sep (разделитель, по умолчанию это пробел, ' ');
• end (символ конца файла, по умолчанию это символ новой строки, '\n').
Функция print() использует значения по умолчанию, если только вы не передадите ей что-то еще. Мы передадим ей пустые строки, чтобы подавить все лишние детали, обычно добавляемые функцией print():
>>> fout = open('relativity', 'wt')
>>> print(poem, file=fout, sep='', end='')
>>> fout.close()
Если исходная строка большая, вы можете записывать в файл ее фрагменты до тех пор, пока не запишете ее всю:
>>> fout = open('relativity', 'wt')
>>> size = len(poem)
>>> offset = 0
>>> chunk = 100
>>> while True:
…·····if offset > size:
…··········break