IT-Swarm.Net

使用Python将列表写入文件

这是将列表写入文件最干净的方法,因为writelines()不插入换行符吗?

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

似乎有一种标准方式......

510
Josh Arenberg

你可以使用一个循环:

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) - 没有理由占用所有内存需要实现整个字符串列表。

701
Alex Martelli

你打算怎么处理这个档案?此文件是否适用于人类或具有明确互操作性要求的其他程序?

如果您只是尝试将列表序列化到磁盘供以后由同一个python应用程序使用,那么您应该是 pickleing list。

import pickle

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

读回来:

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

最好的方法是:

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

还有另一种方式。使用 simplejson (包含为 json 在python 2.6中)序列化为json:

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

如果你检查output.txt:

[1,2,3,4]

这很有用,因为语法是Pythonic,它是人类可读的,并且可以被其他语言的其他程序读取。

84
Jason Baker

使用 Python 3 Python 2.6+ syntax:

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

这与平台无关。它还使用换行符终止最后一行,这是 UNIX最佳实践

81
orluke

我认为探索使用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

(我通过使用ulimit -v 102400将Python的最大虚拟内存限制为~100MB来触发此错误)。

将内存使用放在一边,这种方法实际上并不比原来快:

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

(Linux上的Python 2.6.2)

36
RobM

使用逗号分隔值将列表序列化为文本文件

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

因为我很懒....

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

一般来说

以下是 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

14
Marvin W
file.write('\n'.join(list))
12
mtasic85
with open ("test.txt","w")as fp:
   for line in list12:
       fp.write(line+"\n")
8
shankar

如果你在python3上,你也可以使用print函数,如下所示。

f = open("myfile.txt","wb")
print(mylist, file=f)
6
Nandita Damaraju

你为什么不试试

file.write(str(list))
3
Bob

该逻辑首先将列表中的项目转换为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 
2
Tahir Ahmad

迭代和添加换行符的另一种方法:

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