Записать список в файл на Python
Задачи, предполагающие запись данных списка в текстовый файл, могут быть разными. Поэтому то, как список должен быть помещен в файл, имеет вариации. В этой статье рассматриваются различные способы, когда список состоит из строк, из чисел, когда запись выполняется построчно или в одну строку.
Допустим имеется список строк, который надо записать в файл:
animals = ['cat', 'dog', 'cow', 'pig', 'rabbit', 'sheep'] f = open('animals.txt', 'w')
Методу write()
файлового объекта нельзя передать список, так как этот метод принимает строку. Однако мы можем преобразовать список как он есть в строку, передав ее в write()
:
f.write(str(animals))
В этом случае список запишется в файл также как он есть, то есть с обрамляющими квадратными скобками и запятыми, разделяющими элементы:
['cat', 'dog', 'cow', 'pig', 'rabbit', 'sheep']
В случае списка чисел получилось бы также, разве что сами числа были без кавычек: [125, 42, 309]
.
Однако подобная запись списка зачастую неудобна, так как потом сложно из файла программно прочитать данные и обработать их. Уместнее выглядит запись элементов через пробел или так, чтобы каждый был на отдельной строке. При этом строки не следует заключать в кавычки.
В отличие от write()
метод writelines()
принимает любой итерируемый объект (строку, список, генератор и др.) и последовательно записывает его элементы в файл.
f.writelines(animals)
Если передадим список как он есть, то в файле все элементы сольются между собой в одну строку:
catdogcowpigrabbitsheep
Чтобы разделить строки пробелами, передадим не сам список, а созданный на его основе генератор:
f.writelines(f'{i} ' for i in animals)
Результат:
cat dog cow pig rabbit sheep
Если строки должны разделяться переходом на новую строку-линию (запись в столбик), то генераторное выражение будет таким:
(f'{i}\n' for i in animals)
Если список состоит из чисел, то метод writelines()
вернет ошибку, так как передаваемый в него итерируемый объект должен выдавать строки. Это связано с тем, что сам writelines
(из своего тела) вызывает для каждого элемента метод write()
. Поэтому числа так или иначе надо преобразовать в строки:
f = open('nums.txt', 'w') nums1 = [125, 42, 309] f.writelines(f'{i} ' for i in nums1) nums2 = [2.3, 5.6] f.writelines(str(i)+' ' for i in nums2) f.close()
С другой стороны, можно обойтись без генераторных выражений, а просто перебрать список в цикле и выполнить запись его элементов в файл с помощью метода write()
.
animals = ['cat', 'dog', 'cow', 'pig', 'rabbit', 'sheep'] f = open('animals.txt', 'w') for i in animals: f.write(i + '\n') f.close()
f = open('nums.txt', 'w') nums = [125, 42, 309] for i in nums: f.write(str(i) + ' ') f.close()
Пример с использованием оператора with
:
animals = ['cat', 'dog', 'cow'] with open('animals.txt', 'w') as f: for i in animals: f.write(i + '\n')