Запись списка в файл с помощью Python - PullRequest
528 голосов
/ 22 мая 2009

Это самый чистый способ записи списка в файл, поскольку writelines() не вставляет символы новой строки?

file.writelines(["%s\n" % item  for item in list])

Кажется, был бы стандартный путь ...

Ответы [ 17 ]

728 голосов
/ 22 мая 2009

Вы можете использовать цикл:

with open('your_file.txt', 'w') as f:
    for item in my_list:
        f.write("%s\n" % item)

В Python 2 вы также можете использовать

with open('your_file.txt', 'w') as f:
    for item in my_list:
        print >> f, item

Если вы заинтересованы в одном вызове функции, по крайней мере снимите квадратные скобки [], чтобы строки для печати создавались по одному (genexp, а не listcomp) - нет причин для занимают всю память, необходимую для материализации всего списка строк.

314 голосов
/ 22 мая 2009

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

Если вы просто пытаетесь сериализовать список на диск для последующего использования тем же приложением Python, вы должны перебирать список.

import pickle

with open('outfile', 'wb') as fp:
    pickle.dump(itemlist, fp)

Чтобы прочитать это обратно:

with open ('outfile', 'rb') as fp:
    itemlist = pickle.load(fp)
229 голосов
/ 22 мая 2009

Лучший способ это:

outfile.write("\n".join(itemlist))
86 голосов
/ 22 мая 2009

Еще один способ. Сериализация в json с использованием simplejson (включается как json в Python 2.6):

>>> import simplejson
>>> f = open('output.txt', 'w')
>>> simplejson.dump([1,2,3,4], f)
>>> f.close()

Если вы изучите output.txt:

[1, 2, 3, 4]

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

82 голосов
/ 22 июля 2011

Использование Python 3 и Python 2.6 + синтаксис:

with open(filepath, 'w') as file_handler:
    for item in the_list:
        file_handler.write("{}\n".format(item))

Это не зависит от платформы. Он также завершает последнюю строку символом новой строки, что является рекомендацией UNIX .

36 голосов
/ 17 февраля 2011

Я подумал, что было бы интересно изучить преимущества использования genexp, так что вот мое мнение.

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

file.writelines( list( "%s\n" % item for item in list ) )

Что создает ненужный временный список всех строк, которые будут записаны, это может занять значительные объемы памяти в зависимости от размера вашего списка и от того, насколько многословным является вывод str(item).

Снятие квадратных скобок (эквивалентное удалению вызова list() выше) вместо этого передаст временный генератор в file.writelines():

file.writelines( "%s\n" % item for item in list )

Этот генератор будет создавать завершенные символом новой строки ваши item объекты по требованию (то есть, как они выписаны). Это хорошо по нескольким причинам:

  • Память невелика, даже для очень больших списков
  • Если str(item) медленный, то в файле видимый прогресс при обработке каждого элемента

Это позволяет избежать проблем с памятью, таких как:

In [1]: import os

In [2]: f = file(os.devnull, "w")

In [3]: %timeit f.writelines( "%s\n" % item for item in xrange(2**20) )
1 loops, best of 3: 385 ms per loop

In [4]: %timeit f.writelines( ["%s\n" % item for item in xrange(2**20)] )
ERROR: Internal Python error in the inspect module.
Below is the traceback from this internal error.

Traceback (most recent call last):
...
MemoryError

(я вызвал эту ошибку, ограничив максимальную виртуальную память Python до ~ 100 МБ при ulimit -v 102400).

Если перевести использование памяти в одну сторону, этот метод на самом деле не быстрее оригинального:

In [4]: %timeit f.writelines( "%s\n" % item for item in xrange(2**20) )
1 loops, best of 3: 370 ms per loop

In [5]: %timeit f.writelines( ["%s\n" % item for item in xrange(2**20)] )
1 loops, best of 3: 360 ms per loop

(Python 2.6.2 в Linux)

19 голосов
/ 18 ноября 2015

Сериализация списка в текстовый файл со значением, разделенным запятыми

mylist = dir()
with open('filename.txt','w') as f:
    f.write( ','.join( mylist ) )
17 голосов
/ 10 августа 2017

Потому что я ленивый ....

import json
a = [1,2,3]
with open('test.txt', 'w') as f:
    f.write(json.dumps(a))

#Now read the file back into a Python list object
with open('test.txt', 'r') as f:
    a = json.loads(f.read())
14 голосов
/ 09 мая 2013

В целом

Ниже приведен синтаксис для writelines () method

fileObject.writelines( sequence )

Пример

#!/usr/bin/python

# Open a file
fo = open("foo.txt", "rw+")
seq = ["This is 6th line\n", "This is 7th line"]

# Write sequence of lines at the end of the file.
line = fo.writelines( seq )

# Close opend file
fo.close()

Ссылки

http://www.tutorialspoint.com/python/file_writelines.htm

12 голосов
/ 22 мая 2009
file.write('\n'.join(list))
...