Запись списка в файл с помощью Python

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

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

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

26 ответов

Решение

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

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 >> thefile, item

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

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

import pickle

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

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

with open ('outfile', 'rb') as fp:
    itemlist = pickle.load(fp)

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

outfile.write("\n".join(itemlist))

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

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

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

Еще один способ. Сериализация в 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]

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

Я подумал, что было бы интересно изучить преимущества использования 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)

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

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())

В python>3 вы можете использовать print а также * для распаковки аргументов:

with open("fout.txt", "w") as fout:
    print(*my_list, sep="\n", file=fout)

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

mylist = dir()
with open('filename.txt','w') as f:
    f.write( ','.join( mylist ) )

Просто:

      with open("text.txt", 'w') as file:
    file.write('\n'.join(yourList))

В общем

Ниже приводится синтаксис метода writelines().

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

file.write('\n'.join(list))

С помощью numpy.savetxt тоже вариант:

import numpy as np

np.savetxt('list.txt', list, delimiter="\n", fmt="%s")

Вы также можете использовать функцию печати, если вы находитесь на python3, следующим образом.

f = open("myfile.txt","wb")
print(mylist, file=f)
with open ("test.txt","w")as fp:
   for line in list12:
       fp.write(line+"\n")

Недавно я обнаружил, что Path мне пригодится. Помогает мне обойтись без необходимости with open('file') as fа затем запись в файл. Надеюсь, это станет кому-то полезным :).

      from pathlib import Path
import json
a = [[1,2,3],[4,5,6]]
# write
Path("file.json").write_text(json.dumps(a))
# read
json.loads(Path("file.json").read_text())

Почему бы тебе не попробовать

file.write(str(list))

Вы также можете пройти через следующее:

Пример:

      my_list=[1,2,3,4,5,"abc","def"]
with open('your_file.txt', 'w') as file:
    for item in my_list:
        file.write("%s\n" % item)

Выход:

В your_file.txt элементы сохраняются как:

      1

2

3

4

5

abc

def

Ваш сценарий также сохраняется, как указано выше.

В противном случае можно использовать рассол.

      import pickle
my_list=[1,2,3,4,5,"abc","def"]
#to write
with open('your_file.txt', 'wb') as file:
    pickle.dump(my_list, file)
#to read
with open ('your_file.txt', 'rb') as file:
    Outlist = pickle.load(file)
print(Outlist)

Вывод:[1, 2, 3, 4, 5, 'abc', 'def']

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

Также simplejson возможно такой же, как и выше

      import simplejson as sj
my_list=[1,2,3,4,5,"abc","def"]
#To write
with open('your_file.txt', 'w') as file:
    sj.dump(my_list, file)

#To save
with open('your_file.txt', 'r') as file:
    mlist=sj.load(file)
print(mlist)

Эта логика сначала преобразует элементы в списке в string(str), Иногда список содержит как кортеж

alist = [(i12,tiger), 
(113,lion)]

Эта логика будет записывать в файл каждый кортеж в новой строке. Мы можем позже использовать eval при загрузке каждого кортежа при чтении файла:

outfile = open('outfile.txt', 'w') # open a file in write mode
for item in list_to_persistence:    # iterate over the list items
   outfile.write(str(item) + '\n') # write to the file
outfile.close()   # close the file 

Еще один способ итерации и добавления новой строки:

for item in items:
    filewriter.write(f"{item}" + "\n")

Для этой цели также может быть полезно перенаправление stdout в файл:

from contextlib import redirect_stdout
with open('test.txt', 'w') as f:
  with redirect_stdout(f):
     for i in range(mylst.size):
        print(mylst[i])

я предлагаю это решение.

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

я думаю, вы ищете такой ответ.

      f = open('output.txt','w')
list = [3, 15.2123, 118.3432, 98.2276, 118.0043]
f.write('a= {:>3d}, b= {:>8.4f}, c= {:>8.4f}, d= {:>8.4f}, e= 
{:>8.4f}\n'.format(*list))
f.close()

Позвольте avg быть списком, тогда:

In [29]: a = n.array((avg))
In [31]: a.tofile('avgpoints.dat',sep='\n',dtype = '%f')

Ты можешь использовать %e или же %s в зависимости от вашего требования.

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

with open('your_file.txt', 'w') as f:
    for item in list:
        f.print("", item)
poem = '''\
Programming is fun
When the work is done
if you wanna make your work also fun:
use Python!
'''
f = open('poem.txt', 'w') # open for 'w'riting
f.write(poem) # write text to file
f.close() # close the file

Как это работает: во-первых, откройте файл, используя встроенную функцию открытия и указав имя файла и режим, в котором мы хотим открыть файл. Режимом может быть режим чтения ('r'), режим записи ('w') или режим добавления ('a'). Мы также можем указать, что мы читаем, пишем или добавляем в текстовом режиме ('t') или в двоичном режиме ('b'). На самом деле доступно гораздо больше режимов, а help (open) даст вам больше информации о них. По умолчанию open() считает файл "текстовым файлом" и открывает его в режиме "чтения". В нашем примере мы сначала открываем файл в режиме записи текста и используем метод записи объекта файла для записи в файл, а затем окончательно закрываем файл.

Приведенный выше пример взят из книги "A Byte of Python" Swaroop C H. http://swaroopch.com/

Другие вопросы по тегам