我该如何将列表写入文件?writelines()
方法不会插入换行符,所以我需要执行以下操作:
f.writelines([f"{line}\n" for line in lines])
使用循环:
with open('your_file.txt', 'w') as f:
for line in lines:
f.write(f"{line}\n")
对于 Python <3.6:
with open('your_file.txt', 'w') as f:
for line in lines:
f.write("%s\n" % line)
对于Python 2,也可以使用以下方法:
with open('your_file.txt', 'w') as f:
for line in lines:
print >> f, line
如果您想要一个函数调用,至少删除方括号[]
,这样要打印的字符串就会一个接一个地生成(使用生成器表达式而不是列表推导式) - 没有理由使用所有内存来实现整个字符串列表的材料化。你打算如何处理这个文件?这个文件是为人类存在的,还是为其他具有明确互操作性要求的程序存在的?
如果你只是想将列表序列化到磁盘以供同一Python应用程序稍后使用,那么你应该 pickle 这个列表。
import pickle
with open('outfile', 'wb') as fp:
pickle.dump(itemlist, fp)
要将其读回:
with open ('outfile', 'rb') as fp:
itemlist = pickle.load(fp)
更简单的写法是:
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开始,可以用f字符串f"{item}\n"
替换"{}\n".format(item)
。
另一种方法是使用simplejson(在Python 2.6中作为json包含)将其序列化为JSON:
>>> import simplejson
>>> f = open('output.txt', 'w')
>>> simplejson.dump([1,2,3,4], f)
>>> f.close()
如果您查看output.txt:
[1, 2, 3, 4]
这很有用,因为语法符合Python风格,易于阅读,并且可以被其他编程语言的程序读取。
我认为探索使用生成器表达式的好处会很有趣,以下是我的看法。
问题中的示例使用方括号创建临时列表,因此与以下代码等效:
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)
很慢,在处理每个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
(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())
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
不会添加换行符,因为它与readlines
相对应,而readlines
也不会删除它们。 - SingleNegationElimination