0

对问题定义的冗长描述感到抱歉。

我是 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")
4

3 回答 3

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 次,直到原始列表用完为止。为了确保无论列表的长度如何,最后都有 4 个项目,我们使用一个空字符串作为填充:

>>> line = [1, 2, 3, 4, 5]
>>> for four in izip_longest(*([iter(line)] * 4), fillvalue=''):
...     print four
... 
(1, 2, 3, 4)
(5, '', '', '')
于 2012-09-25T13:27:32.903 回答
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]]
于 2012-09-25T13:29:05.440 回答
0

问题是文件写入被缓冲,因此它们不会立即写入磁盘。如果您在没有关闭文件的情况下退出,则它们可能根本不会被写入(尤其是在 Jython 和 Pypy 中由于缺乏确定性 GC 而存在问题)。

如果您有 Python 2.6 或更高版本,则可以使用with语句在完成后自动关闭文件。

于 2012-09-25T13:29:13.830 回答