Файлы в 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) — загружает объект из потока байт.

Объекты, которые могут быть сериализованы:

  • NoneTrueFalse.
  • Числа.
  • Строки.
  • Кортежи, списки, множества, словари, содержащие только сериализуемые с помощью 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 и возвращает десериализованный объект.

Дополнительная информация:


Сравнение json и pickle

Характеристикаjsonpickle
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оздать файл, ввести в него значения, прочитать, очистить от табуляций и переносов строки, и записать в этот же файл переписав его. Учтите, что табуляция может быть и внутри строки.

Подпишитесь на рассылку

Если это было вам полезно — вы можете сказать нам спасибо!