使用Python将列表写入文件,并换行

961

我该如何将列表写入文件?writelines() 方法不会插入换行符,所以我需要执行以下操作:

f.writelines([f"{line}\n" for line in lines])

53
请注意,writelines 不会添加换行符,因为它与 readlines 相对应,而 readlines 也不会删除它们。 - SingleNegationElimination
1
在JSON和Pickle之间,它们之间的区别是什么?请查看此链接以获取详细信息:https://dev59.com/oF4c5IYBdhLWcg3wl7Qg - Eldwin
26个回答

1291

使用循环:

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
如果您想要一个函数调用,至少删除方括号[],这样要打印的字符串就会一个接一个地生成(使用生成器表达式而不是列表推导式) - 没有理由使用所有内存来实现整个字符串列表的材料化。

497

你打算如何处理这个文件?这个文件是为人类存在的,还是为其他具有明确互操作性要求的程序存在的?

如果你只是想将列表序列化到磁盘以供同一Python应用程序稍后使用,那么你应该 pickle 这个列表。

import pickle

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

要将其读回:

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

7
警告:pickle模块不安全。只有在信任的情况下才能取消pickle数据。可能会构造恶意pickle数据,在解封期间执行任意代码。永远不要取消pickle数据,这些数据可能来自不受信任的来源,或者可能已被篡改。 - That Brazilian Guy

437

更简单的写法是:

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会占用内存,所以要注意内存消耗。


36
没有换行符,与循环相比使用了双倍的空间。 - Dave

106

使用Python 3Python 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)


可能是重复的问题:https://dev59.com/j3NA5IYBdhLWcg3wmfEa#899176 - mirekphd

97

另一种方法是使用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风格,易于阅读,并且可以被其他编程语言的程序读取。


43

我认为探索使用生成器表达式的好处会很有趣,以下是我的看法。

问题中的示例使用方括号创建临时列表,因此与以下代码等效:

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 上)


30

因为我很懒......

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

22
在Python 3中,您可以使用print*进行参数解包:
with open("fout.txt", "w") as fout:
    print(*my_list, sep="\n", file=fout)

21

将列表序列化为逗号分隔的文本文件

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

18

简单来说:

with open("text.txt", 'w') as file:
    file.write('\n'.join(yourList))

重复的问题:https://dev59.com/j3NA5IYBdhLWcg3wmfEa#899149 - mirekphd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接