使用Python将列表写入文件


673

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

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

似乎会有一种标准的方法...


37
请注意,writelines它不会添加换行符,因为它会镜像readlines,这也不会删除它们。
SingleNegationElimination 2011年

Answers:


908

您可以使用循环:

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


7
这并不是很复杂,但是为什么不只使用pickle或json,而不必担心序列化和反序列化呢?
杰森·贝克

82
例如,因为您想要一个输出文本文件,可以轻松读取,编辑等,每行只有一项。几乎没有罕见的愿望;-)。
亚历克斯·马丁里

1
我发现第一个\ n在Python 2.7 / Windows上是多余的
Jorge Rodriguez 2014年

11
这将在末尾写一个额外的换行符...而不是循环,您可以这样写thefile.write('\n'.join(thelist))
Tgsmith61591 '16

3
我会添加:“请小心列表数据类型”。我得到了一些奇怪的结果,也许这可以对某人有所帮助:thefile.write(str(item) + "\n")
iipr

383

您将如何处理该文件?该文件是否存在于人类或具有明确互操作性要求的其他程序中?

如果您只是尝试将列表序列化到磁盘以供同一python应用程序稍后使用,则应该对列表进行腌制

import pickle

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

读回:

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

35
+1-为什么在内置Python序列化后重新发明轮子?
杰森·贝克

20
+ open( "save.p", "wb" )open( "save.p", "rb" )
1-输出文件

2
问题在于该列表必须适合内存。如果不是这种情况下,一行行确实是一个可行的策略(或者用一些替代会在stackoverflow.com/questions/7180212/...
菲利普·马萨

1
在Python 2中,如果您收到“ ValueError:不安全的字符串泡菜”,则在读取泡菜时使用“ r”而不是“ rb”
18:34质疑

1
@serafeim:不;with:在继续执行该with块之外的下一个语句之前,该块将关闭文件。
SingleNegationElimination '19

285

比较简单的方法是:

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列表都必须在内存中,因此,请注意内存消耗。


23
没有尾随换行符,与循环相比使用2倍的空间。
戴夫

7
当然,首先要想到的问题是OP是否需要以换行符结尾以及空间大小是否重要。您知道他们说过早的优化。
杰森·贝克

15
缺点:这会在将文件中的任何内容写出之前在内存中构造文件的全部内容,因此峰值内存使用率可能很高。
RobM

4
我永远都做不到。我得到这个错误: “期望的字符串,列表中找到文本=“\ n'.join(名称列表)+ '\ n'类型错误:序列项0”

2
您必须确保“名称列表”中的所有元素都是字符串。
osantana

94

使用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开始,"{}\n".format(item)可以用f字符串替换:f"{item}\n"


我不想为最后一项添加“ \ n”,该怎么办?如果条件不想要
pyd

4
@pyd用file_handler.write("\n".join(str(item) for item in the_list))
orluke'for

88

还有另一种方式。使用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]

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


39

我认为探索使用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的最大虚拟内存限制为〜100MB触发了此错误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

(Linux上的Python 2.6.2)


20

因为我很懒...

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

列表可以序列化吗?
kRazzy R

1
是的,的确是!
CommandoScorch

1
导入json; test_list = [1,2,3]; list_as_a_string = json.dumps(test_list); #list_as_a_string现在是字符串'[1,2,3]'
CommandoScorch

我正在这样做 with open ('Sp1.txt', 'a') as outfile: json.dump (sp1_segments, outfile) logger.info ("Saved sp_1 segments");问题是我的程序运行三次,而三个运行的结果却混在一起了。有什么方法可以添加1-2个空行,以便可以区分每次运行的结果?
kRazzy R

1
绝对!你能代替吗json.dump(sp1_segments + "\n\n", outfile)
CommandoScorch

19

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

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

14

一般来说

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

参考

http://www.tutorialspoint.com/python/file_writelines.htm



8
with open ("test.txt","w")as fp:
   for line in list12:
       fp.write(line+"\n")



2

此逻辑将首先将list中的项目转换为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 

1

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

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

1

在python> 3中,您可以将print*用于参数解包:

with open("fout.txt", "w") as fout:
    print(*my_list, sep="\n", file=fout)

-2

Python3中,您可以使用此循环

with open('your_file.txt', 'w') as f:
    for item in list:
        f.print("", item)

-3

让avg作为列表,然后:

In [29]: a = n.array((avg))
In [31]: a.tofile('avgpoints.dat',sep='\n',dtype = '%f')

您可以根据需要使用%e%s


-4
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()将文件视为“ t”扩展文件,并以“ r'ead”模式将其打开。在我们的示例中,我们首先以写文本模式打开文件,然后使用文件对象的write方法写入文件,然后最终关闭文件。

上面的示例来自Swaroop C H. swaroopch.com 的书“ A Byte of Python”。


5
这会将字符串写入文件,而不是OP询问的列表(字符串列表)
gwideman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.