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

Знание того, как записать элементы списка в файл на Python, может быть полезным. Этот урок покажет вам, как сделать это несколькими способами.

Обычный подход к записи элементов списка в файл с использованием Python заключается в том, чтобы сначала перебрать элементы списка с помощью цикла for. Затем использовать объект файла для записи каждого элемента списка в файл как часть каждой итерации цикла. Объект файла должен быть открыт в режиме записи.

Существует множество ситуаций, когда запись элементов списка в файл может оказаться полезной.

Давайте рассмотрим несколько примеров!

Программа Python для записи списка в файл на Python с использованием цикла

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

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

Давайте посмотрим, как можно взять список строк ниже и сохранить каждую строку в текстовом файле с помощью Python.

months = ['January', 'February', 'March', 'April']

В первой программе Python мы откроем файловый объект в режиме записи, а затем используем цикл for для записи каждого элемента нашей структуры данных в файл:

output_file = open('months.txt', 'w')

for month in months:
    output_file.write(month)

output_file.close()

Используя встроенную функцию Python open(), мы открываем новый файл в режиме записи. Каждая итерация цикла for записывает элемент списка months в файл. Мы записываем в текстовый файл, используя метод write объекта file.

Затем закройте файловый объект, как только запишете в него все элементы списка.

Теперь давайте посмотрим, как выглядит содержимое файла, используя команду cat (или любой текстовый редактор).

$ cat months.txt
JanuaryFebruaryMarchApril

Похоже, нам не хватает символов новой строки в конце каждой строки. Давайте добавим новую строку в метод write в каждой итерации цикла for:

output_file = open('months.txt', 'w')

for month in months:
    output_file.write(month+'\n')

output_file.close()

Теперь результат выглядит намного лучше:

$ cat months.txt
January
February
March
April

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

Я хочу посмотреть, что произойдет, если мы не откроем файл в режиме записи.

Замените следующую строку в коде Python:

output_file = open('months.txt', 'w')

Со следующим…

output_file = open('months.txt')

Обратите внимание, что мы удалили второй аргумент, переданный функции open(), который сообщал функции о необходимости открыть файл в режиме записи.

Вот ошибка, которую мы получим при запуске нашего кода с Python 3, если не удалим файл months.txt, созданный в предыдущем примере:

$ python write_list_to_file.py
Traceback (most recent call last):
  File "write_list_to_file.py", line 6, in <module>
    output_file.write(month+'\n')
IOError: File not open for writing

Ошибка говорит нам, что файл не был открыт для записи. Не передавая второй параметр в функцию open(), мы открыли файл в режиме чтения.

Если вы используете Python 2, вы увидите следующую ошибку:

IOError: File not open for writing

Если удалить файл months.txt и перезапустить программу, вы получите другую ошибку.

Питон 2

Traceback (most recent call last):
  File "write_list_to_file.py", line 3, in 
    output_file = open('months.txt')
IOError: [Errno 2] No such file or directory: 'months.txt'

Питон 3

Traceback (most recent call last):
  File "write_list_to_file.py", line 3, in <module>
    output_file = open('months.txt')
FileNotFoundError: [Errno 2] No such file or directory: 'months.txt'

Интерпретатор Python пытается открыть файл в режиме чтения, но, учитывая, что файл не существует, мы получаем ошибку «Нет такого файла или каталога».

Метод записи списка в файл с использованием оператора with open

Вместо того чтобы помнить о необходимости закрыть файловый объект после завершения цикла for, мы можем использовать оператор Python with open.

Оператор «with open» создает менеджер контекста, и этот синтаксис автоматически закрывает файловый объект, когда он вам больше не нужен.

Вот как становится наш код Python…

months = ['January', 'February', 'March', 'April']

with open('months.txt', 'w') as output_file:
    for month in months:
        output_file.write(month+'\n')

Гораздо лаконичнее!

Выполните его и убедитесь, что каждый элемент в списке записан в файл, как и ожидалось.

Синтаксис для записи списка в файл с использованием метода строки join

Интересно, можно ли заменить цикл for одной строкой, использующей метод строки join().

Метод объединения строк объединяет элементы последовательности в одну строку, где каждый элемент отделен от другого строкой, к которой применяется метод объединения.

Может быть, проще показать это в оболочке Python 🙂

>>> months = ['January', 'February', 'March', 'April']
>>> '#'.join(months)
'January#February#March#April'

В этом примере я использовал символ #, потому что так легче увидеть, как # используется для разделения элементов в списке.

Обратите внимание, что разделительный символ # не появляется после последнего элемента.

Итак, вот результат, если мы используем этот подход в нашей программе и заменим символ # на символ новой строки:

output_file = open('months.txt', 'w')
output_file.write('\n'.join(months))
output_file.close()

Результат:

$ cat months.txt
January
February
March
April$

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

Итак, этот метод в некотором роде работает, но он не так хорош, как цикл for, поскольку он не добавляет символ новой строки в последнюю строку файла.

Запись списка в файл на Python с использованием Writelines

Объект файла Python предоставляет метод writelines(), который записывает список строк в поток, например, объект файла.

Кажется, это может быть еще одним хорошим способом сделать это, давайте попробуем!

output_file = open('months.txt', 'w')
output_file.writelines(months)
output_file.close()

Метод writelines берет список и записывает его содержимое в файл с помощью одного оператора.

Вот что выводится при запуске программы:

cat months.txt 
JanuaryFebruaryMarchApril$

Хм… это выглядит неправильно.

Метод file writelines() не добавляет никаких разделителей строк.

Интересно, почему?!?

Мы могли бы добавить символ новой строки после каждого элемента в списке, а затем передать список методу writelines.

Давайте воспользуемся для этого списковым генератором:

output_file = open('months.txt', 'w')
months = ["{}\n".format(month) for month in months]
output_file.writelines(months)
output_file.close()

Вы можете видеть, что мы также используем метод строки format() для добавления символа новой строки в конец каждой строки в списке.

Полученный нами результат выглядит хорошо:

$ cat months.txt
January
February
March
April

Как записать список Python в файл с помощью лямбда-выражения

Последний подход к записи строк из нашего списка в файл будет использовать лямбда-функцию и функцию map.

Использование лямбда-выражений необязательно, мы делаем это в этом уроке в качестве упражнения, чтобы освежить в памяти более продвинутые концепции Python.

Ниже вы можете увидеть синтаксис функции map:

map(function, iterable, ...)

Функция map применяет функцию, переданную в качестве первого параметра, к каждому элементу итерируемого объекта.

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

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

Вот лямбда-функция, которую нужно использовать:

lambda x: output_file.write(x + '\n')

А теперь передадим лямбду в функцию map:

months = ['January', 'February', 'March', 'April']
output_file = open('months.txt', 'w')
map(lambda x: output_file.write(x+'\n'), months)
output_file.close()

Давайте проверим, верны ли выходные данные…

$ cat months.txt
January
February
March
April

Да, это!

Как записать список в файл с помощью модуля Python Pickle

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

Теперь предположим, что файл, в который мы записываем, должен быть прочитан только приложением Python, а не человеком.

В этом случае вы можете использовать модуль Python pickle для записи содержимого списка в файл (сериализации списка).

import pickle

months = ['January', 'February', 'March', 'April']
months_file = open('months.out', 'wb')
pickle.dump(months, months_file)
months_file.close()

После открытия файлового объекта мы используем функцию pickle.dump для записи списка в файл (сериализации объекта списка).

Значение аргумента mode, которое мы передаем встроенной функции open(), равно 'wb'. Это означает, что мы открываем файл для записи в двоичном режиме.

Вот как выглядит содержимое двоичного файла, записанного на диск:

��*]�(�January�February��March��April�e.%

Затем вы можете прочитать список обратно в память из файла с помощью функции pickle.load после открытия файла для чтения в двоичном режиме (rb).

months_file = open('months.out', 'rb')
months = pickle.load(months_file)
months_file.close()
print(months)

[output]
['January', 'February', 'March', 'April']

Я создал отдельный урок, если вы хотите узнать больше о Python pickle.

Как записать список в файл JSON на Python?

Вы также можете захотеть записать весь список в файл JSON. Для этого вы можете использовать модуль Python json.

Мы будем использовать функцию json.dumps() для записи списка в файл. Мы будем вызывать функцию json.loads() для чтения списка обратно из файла JSON.

import json

months = ['January', 'February', 'March', 'April']
json_file = open('months.json', 'w')
json_file.write(json.dumps(months))
json_file.close()

Вот содержимое созданного вами файла:

["January", "February", "March", "April"]

Чтобы прочитать объект списка обратно из файла JSON, вы можете использовать json.loads(). Эта функция принимает в качестве аргумента данные JSON, считанные из файла.

json_file = open('months.json', 'r')
months = json.loads(json_file.read())
print(months)

Я создал более подробный урок, если вы хотите узнать больше о модуле Python json.

Заключение

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

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

Статьи по теме: прочитайте следующие статьи, чтобы получить более глубокие знания

Автор

Фото аватара

Владимир Михайлов

Программист на Python с большим количеством опыта и разнообразных проектов.