我试图在循环中每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
的情况下,大多数情况都是这样做的。
答案 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))