Файлы в Python
fh = open(f_name, options)
fh.close()
with open(f_name, options) as fh:
pass
Режимы открытия файла:
'r'
— открытие на чтение (является значением по умолчанию).'w'
— открытие на запись, содержимое файла удаляется, если файла не существует, создается новый.'x'
— открытие на запись, если файла не существует, иначе исключение.'a'
— открытие на дозапись, информация добавляется в конец файла.'b'
— открытие в двоичном режиме.'t'
— открытие в текстовом режиме (является значением по умолчанию).'+'
— открытие на чтение и запись.
Режимы могут комбинироваться (например 'rt'
— режим по умолчанию).
Методы чтения данных из файла
read()
— читает файл от указателя текущей позиции до конца файла.read(n)
— читает n символов из файла в случае открытия в текстовом режиме, или n байт в бинарном режиме.readline()
— читает строку из файла.readlines()
— возвращает список строк, содержащихся в файле.for-loop
— файл, помещенный в цикл for, будет поочередно возвращать строки.
Методы записи в файл
write(string)
— пишет строку в файл.writelines(iterable)
— пишет в файл список строк, которые содержатся в итерируемом объекте. Символ переноса строки автоматически не добавляется!
Прочие методы работы с файлом
seek()
— перемещает указатель файла.tell()
— возвращает текущий указатель файла.
Сериализация
Часто случается необходимость передать определенные объекты по различным каналам связи, или сохранить в файл.
Для решения этой задачи используется сериализация — она позволяет преобразовать объект языка программирования(в нашем случае Python) в последовательность байт или текст(в зависимости от формата сериализации).
Процесс преобразования объекта называется сериализацией.
Обратный процесс(из бит в объект) — десериализация.
Pickle
Pickle — встроенный в Python модуль.
Обратите внимания, что pickle — небезопасный модуль. Будьте осторожны и десериализуйте только известные вам объекты.
Основные методы работы с pickle:
pickle.dump(obj, file)
— записывает сериализованный объект в файл.pickle.dumps(obj)
— возвращает сериализованный объект.pickle.load(file)
— загружает объект из файла.pickle.loads(data)
— загружает объект из потока байт.
Объекты, которые могут быть сериализованы:
None
,True
,False
.- Числа.
- Строки.
- Кортежи, списки, множества, словари, содержащие только сериализуемые с помощью pickle объекты.
- Функции, определенные в модуле(не внутри других объектов). (Не лямбда-функции, только обычные).
- Встроенные фукнции.
- Классы определенные в модуле.
- Экземпляры классов, при соблюдении определенных условий(подробнее, в документации).
Дополнительная информация
JSON
JSON(JavaScript Object Notation) — текстовый формат обмена данными. Несмотря на название, с JavaScript он прямо не зависит, и используется повсеместно.
Синтаксис JSON. JSON-текст представляет собой одну из двух структур:
- Набор пар ключ:значение.
- Упорядоченный набор значений.
Очевидно, что это очень похоже на структуры данных Python: словарь и список.
Значения могут быть следующими:
- запись — неупорядоченный набор пар ключ:значение, заключенные в фигурные скобки
{}
. - одномерный массив — упорядоченное множество значений.
- целое либо вещественное число.
- литералы true, false или null.
- строка — упорядоченная последовательность символов unicode, заключенная в двойные кавычки.
Преимущества JSON:
- Подходит для сериализации сложных структур.
- Применяется в веб-приложениях для обмена данными.
- Человеко-читаемый.
В Python за работу с JSON применяется модуль json.
Основные методы работы с json:
json.dump(obj, file, indent=None)
— сериализует объект в json строку и записывает в файл. indent — позволяет задать отступы для вложенных структур.json.dumps(obj)
— сериализует объект и возвращает строку.json.load(file)
— десериализует файл содержащий json.json.loads(data)
— десериализует строку data и возвращает десериализованный объект.
Дополнительная информация:
- https://docs.python.org/3/library/json.html — документация модуля.
- https://jsonformatter.curiousconcept.com/# — веб-сервис, позволяющий форматировать строку для человеко-читаемого вида.
Сравнение json и pickle
Характеристика | json | pickle |
---|---|---|
Human-readable: | да | нет |
Сериализуется в: | текст | бинарные данные |
Используется: | повсеместно | только в python |
Сериализует: | built-in объекты | может сериализовать в том числе классы и экземпляры |
Безопасность: | безопасен | уязвим для вредоносного кода |
Code Snippets
Работа с файлами
# Запись в файл чтение из файла.
fh = open('text.txt', 'w')
fh.write("""line1
line2
line3""")
fh.close()
fh = open('text.txt', 'r')
print(fh.read())
fh.close()
line1 line2 line3
# Использование различных методов чтения из файла.
fh = open('text.txt', 'w')
fh.write("""line1
line2
line3
line4""")
fh.close
fh = open('text.txt', 'r')
print(fh.read(2))
print(fh.readline())
print('hi')
print(fh.read())
fh.close()
li ne1 hi line2 line3 line4
# Использование open в контекстном менеджере.
with open('text.txt', 'w') as fh:
fh.write( # Более аккуратный способ многострочного ввода
"line1\n"
"line2\n"
"line3\n"
"line4\n"
)
with open('text.txt', 'r') as fh:
print(fh.readlines())
['line1\n', 'line2\n', 'line3\n', 'line4\n']
# Чтение файла с использованием for-loop. with open('text.txt', 'w') as fh: # Плохой способ ввода. Наши отступы останутся в файле. fh.write("""line1 line2 line3 line4""") with open('text.txt', 'r') as fh: for line in fh: print(line)
line1 line2 line3 line4
# Использование writelines. Разделитель не вставляется.
with open('text.txt', 'w') as fh:
fh.writelines([
"string1",
"string2",
])
with open('text.txt', 'r') as fh:
print(fh.readlines())
['string1string2']
JSON
# Сериализуем объект в строку.
import json
obj = {
"title": "my_title",
"authors": ["Maxim", "Pavel", "Ivan"],
"protected": None,
}
str_ = json.dumps(obj)
print(str_, type(str_), sep='\n')
{"title": "my_title", "authors": ["Maxim", "Pavel", "Ivan"], "protected": null} <class 'str'>
# Сериализуем объект в файл с указанием смещения.
import json
obj = {
"title": "my_title",
"authors": ["Maxim", "Pavel", "Ivan"],
"protected": None,
}
with open('file.txt', 'w') as fh:
json.dump(obj, fh, indent=' ')
with open('file.txt') as fh:
print(fh.read())
{ "title": "my_title", "authors": [ "Maxim", "Pavel", "Ivan" ], "protected": null }
# Десериализуем строку.
import json
str_ = '[{"title": "my_title", "other": "other_title"}, "value"]'
obj = json.loads(str_)
print(obj, type(obj))
print(obj[0], type(obj[0]))
[{'title': 'my_title', 'other': 'other_title'}, 'value'] <class 'list'> {'title': 'my_title', 'other': 'other_title'} <class 'dict'>
Pickle
# Сериализуем объект.
import pickle
obj = {'1': 1, '2': 2}
serialized = pickle.dumps(obj)
print(serialized, type(serialized), sep='\n')
b'\x80\x03}q\x00(X\x01\x00\x00\x001q\x01K\x01X\x01\x00\x00\x002q\x02K\x02u.' <class 'bytes'>
# Сериализуем объект в файл.
import pickle
obj = {'1': 1, '2': 2}
with open('file.txt', 'wb') as fh:
str_ = pickle.dump(obj, fh)
with open('file.txt', 'rb') as fh:
serialized = fh.read()
print(serialized)
b'\x80\x03}q\x00(X\x01\x00\x00\x001q\x01K\x01X\x01\x00\x00\x002q\x02K\x02u.'
# Десериализуем строку.
import pickle
obj = {'1': 1, '2': 2}
with open('file.txt', 'wb') as fh:
pickle.dump(obj, fh)
with open('file.txt', 'rb') as fh:
deserialized = pickle.load(fh)
print(deserialized, type(deserialized))
{'1': 1, '2': 2} <class 'dict'>
Задачи для закрепления материала
- Cоздать файл, ввести в него значения, прочитать, очистить от табуляций и переносов строки, и записать в этот же файл переписав его. Учтите, что табуляция может быть и внутри строки.
Подпишитесь на рассылку