Сохранение списка в файл на языке Python

Раздел: Ввод-вывод -> Работа с форматами данных

Запись списка в файл на Python

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

Основной и наиболее эффективный способ - использование менеджера контекста with open() в комбинации с методами write() или writelines(). Это гарантирует корректное закрытие файла даже при возникновении исключений.

# Запись списка строк построчно
items = ['строка1', 'строка2', 'строка3']
with open('output.txt', 'w', encoding='utf-8') as f:
    f.writelines(line + '\n' for line in items)

запись список python (запись списка в файл на python)

Метод writelines() принимает итератор строк. В примере после каждой строки добавлен символ перевода строки, иначе все элементы окажутся склееными. Для списка чисел необходимо сначала преобразовать каждый элемент в строку:

numbers = [10, 20, 30]
with open('numbers.txt', 'w') as f:
    f.write('\n'.join(str(n) for n in numbers))

Типичные проблемы:

  • Забыть добавить символ новой строки - файл будет содержать одну длинную строку.
  • Игнорирование кодировки (encoding='utf-8') приводит к ошибкам при работе с не-ASCII символами.
  • Попытка записать нестроковый объект без преобразования - TypeError.

Как записать список строк в файл, чтобы каждая строка была на новой строке?

Уже приведённый выше пример с writelines() является решением. Альтернатива - цикл с write():

lines = ['first', 'second', 'third']
with open('lines.txt', 'w', encoding='utf-8') as f:
    for line in lines:
        f.write(line + '\n')

Если файл открыт в режиме 'a' (добавление), данные будут дописываться в конец. Важно не перепутать режимы 'w' и 'a'.

Как записать список чисел в файл?

Числа требуется преобразовать в строки. Удобно использовать генератор и метод join():

nums = [1, 2, 3, 4]
with open('nums.txt', 'w') as f:
    f.write(' '.join(map(str, nums)))

Такой способ создаёт строку с числами, разделёнными пробелами. Для построчной записи применяйте \n вместо пробела.

Если числа содержат дробную часть, результат может зависеть от локали. Рекомендуется явно форматировать через format() или f-строки.

Как записать список в файл в формате CSV?

Модуль csv упрощает запись табличных данных. Список строк или чисел превращается в строку CSV:

import csv
data = ['Alice', 'Bob', 'Charlie']
with open('people.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow(data)  # одна строка
    # или writer.writerows([data]) для одного ряда

Параметр newline='' предотвращает дублирование пустых строк на Windows.

При записи списка списков удобно использовать writerows(). Если данные содержат запятые или кавычки, модуль csv корректно экранирует их.

Как записать список в файл в формате JSON?

JSON - универсальный способ обмена данными. Модуль json сериализует любой список, поддерживающий базовые типы:

import json
data = ['apple', 'banana', 123, {'key': 'value'}]
with open('data.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

Аргумент ensure_ascii=False позволяет записывать символы Unicode в читаемом виде, indent добавляет отступы для удобства.

Если список содержит несериализуемые объекты (например, дату, пользовательские классы), возникнет TypeError. Требуется либо преобразовать данные, либо написать собственный кодировщик.

Как сохранить список с сохранением типов данных с помощью pickle?

Модуль pickle позволяет сохранять практически любые объекты Python, включая списки с вложенными структурами:

import pickle
my_list = ['text', 42, 3.14, None, {'a': [1,2]}]
with open('list.pkl', 'wb') as f:
    pickle.dump(my_list, f)

Файл открывается в бинарном режиме ('wb'). Данные сохраняются в собственном формате pickle, нечитаемом для человека.

Файлы pickle могут быть небезопасными при загрузке из ненадёжных источников. Используйте только для внутреннего хранения. Версии Python могут быть несовместимы (особенно между Python 2 и 3).

Как записать большой числовой список в файл эффективно с помощью NumPy?

Для массивов чисел библиотека NumPy предоставляет быстрые методы сохранения:

import numpy as np
arr = np.array([1.5, 2.7, 3.9])
np.savetxt('array.txt', arr, fmt='%.2f')  # текстовый формат
# или бинарный формат:
np.save('array.npy', arr)

savetxt позволяет задавать формат чисел, разделители, заголовки. save сохраняет в бинарном формате .npy с метаданными.

Если данные не являются массивом NumPy, перед сохранением его нужно преобразовать. Для огромных массивов бинарный формат быстрее и экономит место.

Расширенные примеры записи списков в файлы

1. Запись списка словарей в JSON с красивым форматированием

Пример
import json
students = [
    {'name': 'Иван', 'age': 20, 'grade': 4.5},
    {'name': 'Мария', 'age': 19, 'grade': 5.0}
]
with open('students.json', 'w', encoding='utf-8') as f:
    json.dump(students, f, ensure_ascii=False, indent=4, sort_keys=True)
# Результат в файле students.json:
# [
#     {
#         "age": 20,
#         "grade": 4.5,
#         "name": "Иван"
#     },
#     {
#         "age": 19,
#         "grade": 5.0,
#         "name": "Мария"
#     }
# ]

2. Запись списка в CSV с пользовательским разделителем

Пример
import csv
rows = [
    ['10.01.2025', 'Товар А', 1200],
    ['11.01.2025', 'Товар Б', 800]
]
with open('sales.csv', 'w', newline='', encoding='windows-1251') as f:
    writer = csv.writer(f, delimiter=';')
    writer.writerow(['Дата', 'Наименование', 'Сумма'])
    writer.writerows(rows)
# Файл sales.csv (разделитель ; ):
# Дата;Наименование;Сумма
# 10.01.2025;Товар А;1200
# 11.01.2025;Товар Б;800

3. Запись списка строк с автоматическим добавлением новой строки через with и append

Пример
log_entries = ['Старт процесса', 'Ошибка чтения', 'Завершение']
with open('log.txt', 'a', encoding='utf-8') as f:
    for entry in log_entries:
        f.write(entry + '\n')
# Каждый вызов дописывает записи в конец файла.

4. Запись списка чисел с различными форматами

Пример
numbers = [0.123456, 1.234567, 12.345678]
with open('formatted.txt', 'w') as f:
    f.write('\n'.join(f'{num:10.3f}' for num in numbers))
# Результат (выровнено вправо, 3 знака после запятой):
#     0.123
#     1.235
#    12.346

5. Запись списка кортежей с помощью pickle (сложная структура)

Пример
import pickle
data = [
    (1, 'один', [10, 20]),
    (2, 'два', {'a': 100, 'b': 200})
]
with open('complex.pkl', 'wb') as f:
    pickle.dump(data, f, protocol=pickle.HIGHEST_PROTOCOL)
# Файл сложно прочитать напрямую, но загрузка restore_data = pickle.load(open('complex.pkl','rb')) вернёт исходную структуру.

6. Запись списка в текстовый файл с указанием кодировки и обработкой ошибок

Пример
texts = ['Привет', 'мир', '!']
try:
    with open('text_utf16.txt', 'w', encoding='utf-16', errors='replace') as f:
        f.writelines(line + '\n' for line in texts)
except IOError as e:
    print(f'Ошибка записи: {e}')
# Файл будет сохранен в кодировке UTF-16, нечитаемой в обычном текстовом редакторе.

Проблемы и их решения

  • TypeError: write() argument must be str, not int - преобразуйте число в строку: f.write(str(num)).
  • UnicodeEncodeError - явно укажите кодировку, поддерживающую нужные символы, например encoding='utf-8'.
  • Файл не появляется на диске - проверьте, закрыт ли файл. Используйте менеджер контекста with.
  • При записи в CSV каждая строка разделяется двумя пустыми строками - добавьте newline='' при открытии файла.

Для отладки можно выводить записываемую информацию в консоль с помощью print перед вызовом записи.

Запись списка в файл на Python - comments

En
запись список python (python)