2009-05-22 2 views
355

Является ли это самым чистым способом записи списка в файл, поскольку writelines() не вставляет символы новой строки?Запись списка в файл с помощью Python

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

Похоже, что будет стандартным способом ...

+26

не отметить, что 'writelines' не добавляет новые строки, потому что он отображает 'readlines', что также не удаляет их. – SingleNegationElimination

ответ

491

EDIT Adding info from Thomas ' comment

Don't forget to open the file first

thefile = open('test.txt', 'w')

Я хотел бы использовать цикл:

for item in thelist: 
    thefile.write("%s\n" % item) 

или:

for item in thelist: 
    print>>thefile, item 

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

+9

# 2 является самым идиоматическим ИМХО. – Dave

+3

Это не очень сложно, но почему бы просто не использовать pickle или json, чтобы вам не пришлось беспокоиться о сериализации и десериализации? –

+40

Например, потому что вы хотите получить текстовый файл, который можно легко прочитать, отредактировать и т. Д., По одному элементу в строке. Едва редкое желание ;-). –

177

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

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

Отсутствие конечной новой строки, использует 2x пространство по сравнению с циклом. – Dave

+3

Конечно, первый вопрос, который приходит на ум, - это то, нуждается ли OP в завершении в новой строке и имеет ли объем пространства. Вы знаете, что они говорят о преждевременных оптимизациях. –

+8

Недостаток: это создает все содержимое файла в памяти перед записью любого из них, поэтому пиковое использование памяти может быть высоким. – RobM

223

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

import pickle 

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

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

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

+1 - Зачем изобретать колесо, когда в Python встроена сериализация? –

+19

+1 - outfile - это что-то вроде: 'open (" save.p "," wb ")' infile - это что-то вроде: 'open (" save.p "," rb ")' – xxjjnn

+0

Проблема в том, что список должен соответствовать памяти. Если это не так, строка за строкой действительно является возможной стратегией (или, например, с некоторыми альтернативами, как в https://stackoverflow.com/questions/7180212/why-cant-generators-be-pickled) –

69

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

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

+6

лучшее решение для читаемый человеком. – philgo20

+6

простойjson.load (f), чтобы прочитать, что было написано. –

+1

также хорошо работает для вложенных списков :) –

11
file.write('\n'.join(list)) 
+0

Следует отметить, что для этого потребуется, чтобы файл был открыт, так как текст был действительно нейтральным по отношению к платформе. –

28

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

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

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

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

Капля квадратные скобки (что эквивалентно удалению оберточной list() вызова выше) вместо этого будет проходить временный generator к 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)

+0

+1 - действительно лучший подход в случае больших файлов. –

-1

Пусть ср быть в списке, то:

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

Вы можете использовать %e или %s в зависимости от ваших требований.

66

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

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

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

+0

Я не хочу добавить «\ n» для последнего элемента, что делать? dont want if condition – pyd

+1

@pyd Заменить цикл for на 'file_handler.write (" \ n ".join (str (item) для элемента в списке_)) – orluke

13

В целом

Ниже приводится синтаксис для 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

-1
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'). Есть на самом деле еще много доступных режимов и помощь (открытая) предоставит вам более подробную информацию о них. По умолчанию open() рассматривает файл как «t'ext» и открывает его в режиме «r'ead». В нашем примере мы сначала открываем файл в текстовом режиме записи и используем метод записи файла, который должен быть записан в файл, а затем мы окончательно закрываем файл.

Приведенный выше пример из книги «Байт Питона» от Swaroop C H. swaroopch.com

+3

Это записывает строку в файл, а не список (строк), так как OP запрашивает – gwideman

2

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

file.write(str(list)) 
6
with open ("test.txt","w")as fp: 
    for line in list12: 
     fp.write(line+"\n") 
5

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

f = open("myfile.txt","wb") 
print(mylist, file=f) 
+0

, это не единственная строка в myfile.txt, например: ['a', 'b', 'c'] вместо того, чтобы писать каждую a, b, c в каждой строке. –

13

Serialize в текстовый файл с запятой sepparated значение

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

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

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

являются json serializable? –

+1

Да, да! – CommandoScorch

+1

импорт json; test_list = [1,2,3]; list_as_a_string = json.dumps (test_list); #list_as_a_string теперь является строкой '[1,2,3]' – CommandoScorch

Смежные вопросы