Как в Python сохранить список в файл

Раздел: Ввод-вывод -> Файловый ввод-вывод

Методы сохранения списка в файл

Какое решение является наиболее универсальным и безопасным?

Самым распространенным способом сохранения списка с данными, которые могут быть представлены в виде строк, чисел, словарей или вложенных списков, является использование модуля json. Этот формат легко читается человеком, поддерживается многими языками программирования и позволяет восстанавливать структуру данных без потери типов.

import json

my_list = ["apple", "banana", 123, True, None, {"key": "value"}]

with open("list.json", "w", encoding="utf-8") as f:
    json.dump(my_list, f, ensure_ascii=False, indent=2)

ввод программ на python (ввод данных в программе python)

В этом примере список содержит строки, число, булево значение, None и словарь. После выполнения кода в файле list.json появится корректное JSON-представление. Параметр indent делает вывод более читаемым, а ensure_ascii=False позволяет сохранять символы, не входящие в ASCII (например, кириллицу).

Основные проблемы:

  • JSON не поддерживает сериализацию сложных объектов Python (экземпляры классов, функции, множества). Попытка сохранить такой список вызовет исключение TypeError. Решение – преобразовать объекты в сериализуемое представление или использовать библиотеку pickle.
  • При записи в файл в кодировке по умолчанию может возникнуть ошибка UnicodeEncodeError. Её предотвращает явное указание encoding="utf-8" и ensure_ascii=False.

Как сохранить список в текстовом виде для последующего просмотра человеком?

Самый простой вариант – преобразовать список в строку и записать её в файл. Для восстановления можно воспользоваться функцией eval, но это небезопасно при работе с недоверенными данными.

my_list = [1, 2, 3, 4]
with open("list.txt", "w", encoding="utf-8") as f:
    f.write(str(my_list))
# Чтение:
with open("list.txt", "r", encoding="utf-8") as f:
    restored = eval(f.read())
print(restored)  # [1, 2, 3, 4]

Python file io (ввод-вывод файлов в python)

Проблемы: eval выполняет произвольный код, что опасно. Лучше использовать ast.literal_eval. Кроме того, строковое представление не гарантирует сохранение типов (например, кортежи превратятся в строки).

Как записать каждый элемент списка в отдельную строку файла?

Если список состоит из строк, удобно воспользоваться методом writelines или циклом с write. При чтении строки можно собрать обратно методом splitlines или построчным чтением.

fruits = ["яблоко", "банан", "апельсин"]
with open("fruits.txt", "w", encoding="utf-8") as f:
    for fruit in fruits:
        f.write(fruit + "\n")

# Чтение:
with open("fruits.txt", "r", encoding="utf-8") as f:
    lines = [line.rstrip("\n") for line in f]
print(lines)  # ['яблоко', 'банан', 'апельсин']

Python temp files (временные файлы в python)

Для чисел потребуется преобразование в строку. При чтении необходимо следить за тем, чтобы пустая строка в конце файла не была интерпретирована как элемент списка.

Как сохранить список с произвольными объектами Python?

Модуль pickle позволяет сериализовать почти любые объекты, включая экземпляры пользовательских классов, функции (если они определены на верхнем уровне) и множества. Формат бинарный.

import pickle

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

points = [Point(0,0), Point(1,2), Point(3,4)]

with open("points.pkl", "wb") as f:
    pickle.dump(points, f)

with open("points.pkl", "rb") as f:
    restored = pickle.load(f)
print(restored[0].x, restored[0].y)  # 0 0

Python index files (индексация файлов в python)

Проблемы: файлы pickle небезопасны – их не следует загружать из ненадёжных источников, так как это может привести к выполнению произвольного кода. При изменении определения класса может возникнуть ошибка AttributeError или UnpicklingError. Версии Python различаются по схеме pickle, что может вызвать несовместимость.

Как сохранить список значений в формате CSV для таблицы?

Если список однороден (например, список строк или чисел), его можно сохранить как одну строку CSV. Модуль csv принимает итератор строк, поэтому список оборачивается в ещё один список.

import csv

my_list = ["a", "b", "c", 42]
with open("list.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(my_list)

# Чтение:
with open("list.csv", "r", encoding="utf-8") as f:
    reader = csv.reader(f)
    restored = next(reader)
print(restored)  # ['a', 'b', 'c', '42']

File python class (класс для работы с файлами в python)

Все элементы при чтении становятся строками. Чтобы восстановить типы, требуется ручное преобразование. Кроме того, если внутри элементов есть запятые или кавычки, модуль csv корректно их экранирует, но это усложняет чтение.

Как хранить список в файле с ключом для быстрого доступа?

Модуль shelve предоставляет удобное хранилище, похожее на словарь. Можно сохранить список под определённым ключом, а позже прочитать его без загрузки всего файла.

import shelve

my_list = [10, 20, 30]

with shelve.open("data.shlv") as db:
    db["numbers"] = my_list

with shelve.open("data.shlv") as db:
    restored = db["numbers"]
print(restored)  # [10, 20, 30]

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

- Python copy file (копирование файла в python)
- Python log file (логирование в файл в python)
- Python file methods (методы работы с файлами в python)

Дополнительные примеры работы со списками

Запись списка чисел с плавающей точкой в текстовый файл с заданным форматированием

Иногда требуется сохранить числа с определённой точностью, например, для научных расчётов. Можно использовать метод join с генератором строк.

Пример
values = [3.1415926, 2.7182818, 1.414213562]
with open("floats.txt", "w", encoding="utf-8") as f:
    f.write(", ".join(f"{v:.4f}" for v in values))
    f.write("\n")

with open("floats.txt", "r", encoding="utf-8") as f:
    data = f.read().strip()
restored = [float(x) for x in data.split(", ")]
print(restored)  # [3.1416, 2.7183, 1.4142]
Содержимое файла floats.txt:
3.1416, 2.7183, 1.4142

Сохранение списка объектов собственного класса с помощью pickle и множества

Список может содержать сложные структуры, например, множества или собственные классы. Pickle справляется с этим, но требует, чтобы классы были импортированы при загрузке.

Пример
import pickle

class Book:
    def __init__(self, title, year):
        self.title = title
        self.year = year
    def __repr__(self):
        return f"Book({self.title!r}, {self.year})"

library = [
    Book("1984", 1949),
    Book("Мастер и Маргарита", 1967),
    Book("Улисс", 1922)
]

with open("library.pkl", "wb") as f:
    pickle.dump(library, f, protocol=pickle.HIGHEST_PROTOCOL)

with open("library.pkl", "rb") as f:
    loaded = pickle.load(f)
print(loaded)  # [Book('1984', 1949), Book('Мастер и Маргарита', 1967), Book('Улисс', 1922)]
(вывод в консоль)

Запись многомерного списка в JSON с отступами и поддержкой не-ASCII символов

JSON удобен для структур любой вложенности. Параметр indent улучшает читаемость, а ensure_ascii=False сохраняет кириллицу.

Пример
import json

matrix = [
    [1, 2, 3],
    [4, 5, 6],
    ["один", "два", "три"]
]

with open("matrix.json", "w", encoding="utf-8") as f:
    json.dump(matrix, f, ensure_ascii=False, indent=4)

with open("matrix.json", "r", encoding="utf-8") as f:
    restored = json.load(f)
print(restored)  # [[1, 2, 3], [4, 5, 6], ['один', 'два', 'три']]
Содержимое файла matrix.json:
[
    [
        1,
        2,
        3
    ],
    [
        4,
        5,
        6
    ],
    [
        "один",
        "два",
        "три"
    ]
]

Сохранение списка кортежей в CSV с заголовками

Если список состоит из кортежей (или списков) одинаковой длины, его удобно превратить в таблицу CSV. Модуль csv позволяет записывать строки с заголовками.

Пример
import csv

records = [
    ("Alice", 30, "Engineer"),
    ("Bob", 25, "Designer"),
    ("Charlie", 35, "Manager")
]

with open("people.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(["Name", "Age", "Job"])
    writer.writerows(records)

with open("people.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row)
Содержимое файла people.csv:
Name,Age,Job
Alice,30,Engineer
Bob,25,Designer
Charlie,35,Manager

Вывод в консоль:
{'Name': 'Alice', 'Age': '30', 'Job': 'Engineer'}
{'Name': 'Bob', 'Age': '25', 'Job': 'Designer'}
{'Name': 'Charlie', 'Age': '35', 'Job': 'Manager'}

Запись списка чисел в бинарный файл с использованием struct

Для компактного хранения числовых данных (например, большого количества целых чисел) можно использовать модуль struct. Это позволяет сократить размер файла и ускорить чтение.

Пример
import struct

numbers = [100, 200, 300, 400, 500]
packed = struct.pack(f"{len(numbers)}i", *numbers)

with open("numbers.bin", "wb") as f:
    f.write(packed)

with open("numbers.bin", "rb") as f:
    data = f.read()
unpacked = list(struct.unpack(f"{len(data)//4}i", data))
print(unpacked)  # [100, 200, 300, 400, 500]
Размер файла: 20 байт (5 × 4).

Использование ast.literal_eval для безопасного восстановления списка из строки

Вместо опасного eval применяется ast.literal_eval, который разбирает только литералы: строки, числа, кортежи, списки, словари, булевы значения и None.

Пример
import ast

my_list = ["hello", 42, [1, 2, 3]]
with open("safe_list.txt", "w", encoding="utf-8") as f:
    f.write(repr(my_list))

with open("safe_list.txt", "r", encoding="utf-8") as f:
    restored = ast.literal_eval(f.read())
print(restored)  # ['hello', 42, [1, 2, 3]]
(вывод в консоль)

Сохранение списка в файл в Python - comments

En
сохранить список python (python)