Записать список в файл на 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')


Решение задач на Python




Все разделы сайта