Это самый чистый способ записи списка в файл, поскольку writelines()
не вставляются символы новой строки?
file.writelines(["%s\n" % item for item in list])
Кажется, был бы стандартный путь ...
Это самый чистый способ записи списка в файл, поскольку 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) - нет причин занимать всю необходимую память материализовать весь список строк.
thefile.write('\n'.join(thelist))
thefile.write(str(item) + "\n")
Что вы собираетесь делать с файлом? Существует ли этот файл для людей или других программ с четкими требованиями к взаимодействию?
Если вы просто пытаетесь сериализовать список на диск для последующего использования тем же приложением Python, вы должны выбрать список.
import pickle
with open('outfile', 'wb') as fp:
pickle.dump(itemlist, fp)
Чтобы прочитать это обратно:
with open ('outfile', 'rb') as fp:
itemlist = pickle.load(fp)
open( "save.p", "wb" )
infile - что-то вроде:open( "save.p", "rb" )
with:
блок закрывает файл перед переходом к следующему заявлению внешней стороны with
блока.
Более простой способ:
with open("outfile", "w") as outfile:
outfile.write("\n".join(itemlist))
Вы можете убедиться, что все элементы в списке элементов являются строками, используя выражение генератора:
with open("outfile", "w") as outfile:
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 .
Начиная с Python 3.6, "{}\n".format(item)
можно заменить F-строки: f"{item}\n"
.
file_handler.write("\n".join(str(item) for item in the_list))
Еще один способ. Сериализация в 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())
with open ('Sp1.txt', 'a') as outfile:
json.dump (sp1_segments, outfile)
logger.info ("Saved sp_1 segments")
; проблема в том, что моя программа запускается трижды, а результаты трех прогонов становятся неясными. Есть ли способ добавить 1-2 пустых строки, чтобы результаты каждого запуска были различимы?
json.dump(sp1_segments + "\n\n", outfile)
?
Ниже приводится синтаксис для 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()
file.write('\n'.join(list))
file
переменную?
Вы также можете использовать функцию печати, если вы находитесь на python3, следующим образом.
f = open("myfile.txt","wb")
print(mylist, file=f)
Эта логика сначала преобразует элементы в списке в 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
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 () считает файл «текстовым файлом» и открывает его в режиме «чтения». В нашем примере мы сначала открываем файл в режиме записи текста и используем метод записи объекта файла для записи в файл, а затем окончательно закрываем файл.
Приведенный выше пример взят из книги «Байт Python» Swaroop C H. swaroopch.com
writelines
не добавляет новые строки, потому что он отражаетreadlines
, который также не удаляет их.