Является ли это самым чистым способом записи списка в файл, поскольку writelines()
не вставляет символы новой строки?
file.writelines(["%s\n" % item for item in list])
Кажется, что должен быть стандартный способ...
Вы можете использовать цикл:
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) - нет причин занимать всю память, необходимую для материализации всего списка строк.
Что вы собираетесь делать с файлом? Существует ли этот файл для людей или других программ с четкими требованиями к совместимости?
Если вы просто пытаетесь сериализовать список на диск для последующего использования тем же приложением python, вам следует pickleing список.
import pickle
with open('outfile', 'wb') as fp:
pickle.dump(itemlist, fp)
Чтобы прочитать его обратно:
with open ('outfile', 'rb') as fp:
itemlist = pickle.load(fp)
Более простой способ:
``lang-python outfile.write("\n".join(itemlist))
Вы можете убедиться, что все элементы в списке элементов являются строками, используя выражение-генератор:
``lang-python
outfile.write("\n".join(str(item) for item in itemlist))
Помните, что весь список 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 используя пакет (входит в формате 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]
Это полезно, потому что синтаксис для Python, он'ы для чтения человеком, и она может быть прочитана другими программами на других языках.
Я думал, что было бы интересно исследовать преимущества использования genexp, так вот'ы мое мнение.
Пример в этом вопросе используются квадратные скобки, чтобы создать временный список, а так это равносильно:
file.writelines( list( "%s\n" % item for item in list ) )
Что напрасно создает временный список всех строк, которые будут записаны, это может потреблять значительные объемы памяти в зависимости от размера вашего списка и как подробный вывод `ул.(товара) является.
Падение в квадратных скобках (в эквиваленте для удаления список упаковки ()
вызов выше), а не пройдет временное генератор файл.writelines()
:
file.writelines( "%s\n" % item for item in list )
Этот генератор будет создавать новую строку с завершающим представлением объектов "номенклатура" по требованию (т. е. как они выписаны). Это хорошо по нескольким причинам:
Это позволяет избежать проблем с памятью, таких как:
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's Макс. виртуальная память до ~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
(Питон 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())
Ниже приведен синтаксис для 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()
Вы также можете использовать функцию печати, если вы'вновь на питон3 следующим образом.
f = open("myfile.txt","wb")
print(mylist, file=f)
Эта логика будет сначала преобразовать элементы в список в строку(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
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
Как Это Работает: Во-первых, открыть файл с помощью встроенной функции Open и указать имя файла и режим, в котором мы хотим открыть файл. Режим может быть режим чтения (’Р’), режим записи (’ж’) или режим append (’а’). Мы можем также указать будем ли мы читать, писать, или добавляя в текстовом режиме (’Т’) или Binary режим ("б"). На самом деле существует множество более доступных режимов и помочь(открыть) даст вам более подробную информацию о них. По умолчанию открытые() считает файл, быть файл'ext T и открывает его в режиме Р'ead. В нашем примере, мы сначала открываем файл в написать в текстовом режиме и использовать запись метод объектный файл для записи в файл, а затем мы, наконец, закройте файл.
Приведенный выше пример с книгой "Байт питона" и по Сваруп З. Х. swaroopch.com
Пусть среднее будет в списке, то:
In [29]: a = n.array((avg))
In [31]: a.tofile('avgpoints.dat',sep='\n',dtype = '%f')
Вы можете использовать %e
или %S
в зависимости от ваше требование.