对于问题定义的冗长描述感到抱歉。
我是python的新手。开始学习一个月左右。 今天我试图将一个列表写入文本文件。 虽然我在这个网站得到了答案并使用了相同的方法。而且效果很好。 但是我在将列表写入文本文件时遇到了另一个问题。
我的列表长度是'2372'。当我将列表写入文本文件时,按照我所需的特定格式,我发现只写了几个列表成员。 (格式为:第一行中的前四个列表成员。同样,其余行中的4个列表成员组。) 我发现只有1938个列表成员被写入文本文件。 发现文件的大小为25KB。
我还尝试在新行中编写每个列表成员,然后发现文本文件的大小为25KB,这次写入列表成员的次数与上述情况相比更少。
写入列表的文本文件是否存在文件大小限制? 请帮我解决这个问题。
** python代码的片段**
Lenlist = 2372
filptr = open(tempfile, 'w+')
count=0
for x in range(0,Lenlist):
filptr.write("%s\t" % line[x])
count+=1
if count>3:
if (count%4==0):
filptr.write("\n")
答案 0 :(得分:2)
在列表上使用迭代会更容易:
with open(tempfile, 'w+') as filptr:
for count, l in enumerate(line):
filptr.write("%s\t" % l)
if count and count % 4 == 0:
filptr.write("\n")
使用with
语句可确保在循环完成时正确关闭文件。使用enumerate
让我们消除必须使用手动计数器。
请注意,现在您的行总是有一个\t
额外标签。您可以使用itertools.izip_longest()
技巧从列表中一次抓取4个项目,并将其与'\t'.join()
一起编写:
from itertools import izip_longest
per_four = izip_longest(*([iter(line)] * 4), fillvalue='')
with open(tempfile, 'w+') as filptr:
for entries in per_four:
filptr.write("\t".join(entries) + '\n')
这里我使用izip_longest
每次迭代时从列表中取一个项目,直到原始列表用完为止。为了确保无论列表的长度如何,我们最后都有4个项目,我们使用空字符串作为填充:
>>> line = [1, 2, 3, 4, 5]
>>> for four in izip_longest(*([iter(line)] * 4), fillvalue=''):
... print four
...
(1, 2, 3, 4)
(5, '', '', '')
答案 1 :(得分:0)
这样的东西,使用生成器:
lis=[1,2,3,,,,,] #your list
with open(filename,'w') as f:
for y in (lis[x:x+4] for x in range(0,len(lis),4):
f.write("%s\n",y)
为:
In [34]: lis=range(20)
In [35]: [lis[x:x+4] for x in range(0,len(lis),4)]
Out[35]:
[[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]]
答案 2 :(得分:0)
问题是文件写入是缓冲的,因此它们不会立即写入磁盘。如果你在没有关闭文件的情况下退出,它们可能根本不会被写入(尤其是由于缺乏确定性GC而在Jython和Pypy中存在问题)。
如果你有Python 2.6或更高版本,你可以使用with
语句在完成后自动关闭文件。