Знание того, как записать элементы списка в файл на 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.
Статьи по теме: прочитайте следующие статьи, чтобы получить более глубокие знания