用python将列表写入文件

Writing a list to a file with Python

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

1
2
file.writelines(["%s
"
% item  for item in list])

似乎有一个标准的方法…


可以使用循环:

1
2
3
4
with open('your_file.txt', 'w') as f:
    for item in my_list:
        f.write("%s
"
% item)

在Python2中,还可以使用

1
2
3
with open('your_file.txt', 'w') as f:
    for item in my_list:
        print >> thefile, item

如果您热衷于单个函数调用,那么至少要删除方括号[],以便每次打印一个字符串(genexp而不是listcomp)——没有理由占用实现整个字符串列表所需的所有内存。


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

如果您只是想将一个列表序列化到磁盘以供同一个python应用程序以后使用,那么应该对该列表进行pickling。

1
2
3
4
import pickle

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

要读回:

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


最好的方法是:

1
2
outfile.write("
"
.join(itemlist))


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

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

如果检查output.txt:

[1, 2, 3, 4]

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


使用python 3和python 2.6+语法:

1
2
3
4
with open(filepath, 'w') as file_handler:
    for item in the_list:
        file_handler.write("{}
"
.format(item))

这是平台独立的。它还使用换行符终止最后一行,这是一种UNIX最佳实践。


我认为探索使用genexp的好处会很有趣,下面是我的看法。

问题中的示例使用方括号创建临时列表,因此相当于:

1
2
file.writelines( list("%s
"
% item for item in list ) )

它不必要地构建一个临时列表,其中包含所有要写出的行,这可能会消耗大量的内存,具体取决于列表的大小以及str(item)的输出有多冗长。

去掉方括号(相当于去掉上面的包装list()调用)将把一个临时生成器传递给file.writelines()

1
2
file.writelines("%s
"
% item for item in list )

此生成器将按需创建item对象的新行终止表示(即,当它们被写出时)。这很好,有几个原因:

  • 内存开销很小,即使对于非常大的列表也是如此
  • 如果str(item)速度较慢,则在处理每个项目时,文件中都有可见的进度。

这样可以避免内存问题,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
In [1]: import os

In [2]: f = file(os.devnull,"w")

In [3]: %timeit f.writelines("%s
"
% item for item in xrange(2**20) )
1 loops, best of 3: 385 ms per loop

In [4]: %timeit f.writelines( ["%s
"
% 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,从而触发了此错误)。

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

1
2
3
4
5
6
7
In [4]: %timeit f.writelines("%s
"
% item for item in xrange(2**20) )
1 loops, best of 3: 370 ms per loop

In [5]: %timeit f.writelines( ["%s
"
% item for item in xrange(2**20)] )
1 loops, best of 3: 360 ms per loop

(Linux上的python 2.6.2)


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

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

因为我懒惰……

1
2
3
4
5
6
7
8
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())


一般来说

下面是writeLines()方法的语法

1
fileObject.writelines( sequence )

例子

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/python

# Open a file
fo = open("foo.txt","rw+")
seq = ["This is 6th line
"
,"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


1
2
file.write('
'
.join(list))


1
2
3
4
with open ("test.txt","w")as fp:
   for line in list12:
       fp.write(line+"
"
)


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

1
2
f = open("myfile.txt","wb")
print(mylist, file=f)


你为什么不试试呢

1
file.write(str(list))

此逻辑首先将列表中的项转换为string(str)。有时列表包含一个类似tuple的

1
2
alist = [(i12,tiger),
(113,lion)]

这个逻辑将写入一个新行中的每个元组。以后我们可以在读取文件时加载每个元组时使用eval

1
2
3
4
5
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) + '
'
) # write to the file
outfile.close()   # close the file


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

1
2
3
for item in items:
    filewriter.write(f"{item}" +"
"
)

让avg作为列表,然后:

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

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


1
2
3
4
5
6
7
8
9
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

它是如何工作的:首先,打开一个?使用内置的open函数并指定这个?Le和要打开的模式?乐。模式可以是读模式("R")、写模式("W")或附加模式("A")。我们也可以指定无论我们是以文本模式("t")还是二进制模式读、写或附加模式("B")。实际上还有更多可用的模式和帮助(打开)会给你更多的细节。默认情况下,open()考虑?勒托做一个"T"字?以"读取"模式打开。在我们的例子中,我们?打开?在写入文本模式下使用方法?要写入的对象?我们呢?Nally关闭?乐。

上面的例子来自swaroop c h的《Python的一个字节》一书。SuroopCH.com