每第N次迭代写入不同的文件?

时间:2018-06-04 17:58:27

标签: python

我试图在循环中每N次迭代写入一个不同的文件,并存储该批次之间发生的所有事情。 我可以通过使用列表来实现这一点。 例如,

import os

def write_to_file(data, fileName):
    file = os.path.join('/home/user/data', fileName)
    with open(file, 'a') as f:
        f.write(str(data))

TEMP = [] 
for i in range(50):
    TEMP.append(i)
    if i != 0 and i % 10 == 0:
        write_to_file(TEMP, 'data{}.txt'.format(i))
        TEMP = []

这将按照预期每隔10次迭代有效地写入不同的文件,如下所示:

File #1: [0, ... , 10]
File #2: [11, ..., 20]
...

但是,有没有其他方法可以做到这一点而不必使用list? 我没有遇到性能问题或者其他任何事情,但我觉得在没有显式调用list的情况下,大多数情况都是这样做的。

3 个答案:

答案 0 :(得分:1)

如果您不想临时存储作品,您唯一的选择是逐步写入文件,如下所示:

nfilenum=0
newfileevery=7

fd = None
try: 
   for i in xrange(50):

      if (i%newfileevery)==0
         if fd is not None: fd.close()
         fd = open("{}.txt".format(nfilenum), 'w')

      fd.write("{} ".format(i)) # The stuff

finally:
   if fd is not None: fd.close()

答案 1 :(得分:0)

您可以使用grouper recipe中的itertools来完成您的任务:

from itertools import zip_longest


def grouper(iterable, n, fillvalue=None):
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)

for g in grouper(range(1, 51), 10):
    write_to_file(g, 'data{}.txt'.format(g[-1]))

答案 2 :(得分:0)

您每次都可以使用this chunking recipe来编写列表。此外,您可以enumerate为每个块提取索引。例如:

def chunks(l, n):
    """Yield successive n-sized chunks from l."""
    for i in range(0, len(l), n):
        yield l[i:i + n]

def write_to_file(data, fileName):
    file = os.path.join('/home/user/data', fileName)
    with open(file, 'a') as f:
        f.writelines(', '.join(map(str, data))+'\n')

for i, chunk in enumerate(chunks(list(range(1, 51)), 10)):
    write_to_file(chunk, 'data{}.txt'.format(i))