我们说我有一个包含10,000个条目的列表。用户输入一个数字,例如10.我需要做的是将列表中的所有条目写入.txt文件,但每个文件只写10。所以程序会编写前10个,然后创建一个新文件,然后写下10个......等等。
由于
count = 0
ext = 0
path = 'New/' + str(ext) + '.txt'
open(path, 'a').close()
for line in flines:
f = open(path, 'a')
if count <= x:
f.write(line)
count += 1
else:
ext += 1
path = 'New/' + str(ext) + '.txt'
count += x
f.close()
这是我在其他一些解决方案中尝试过的。我有一种感觉,我错过了一些简单的东西。
这与上面提到的另一个问题有所不同,因为它正在谈论一个文本文件,这是在谈论一个列表。
答案 0 :(得分:2)
使用itertools.grouper recipe非常轻松:
from itertools import izip_longest
n = 2
l = ["1", "2", "3", "4", "5", "6"]
def grouper(iterable, n, fillvalue=""):
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
for ind, ele in enumerate(grouper(l[:-n], n)):
with open("new_{}.txt".format(ind), "w") as f:
f.writelines(ele)
如果您不关心丢失数据,请使用zip / izip。
在最后一个文件中没有任何空行但仍然没有丢失数据,因为@Jon Clements建议我们可以过滤:
it = iter(l)
for num, chunk in enumerate(iter(lambda: list(islice(it, n)), []), 1):
with open('output{}'.format(num), 'w') as fout:
fout.write("\n".join(chunk))
答案 1 :(得分:1)
使用生成器分割行列表,如下所示:
>>> def splited_lines_generator(lines, n):
... for i in xrange(0, len(lines), n):
... yield lines[i: i + n]
...
>>> for index, lines in enumerate(splited_lines_generator(['a', 'b', 'c', 'd', 'e'], 2)):
... with open('new/' + str(index) + '.txt', 'w') as f:
... f.write('\n'.join(lines))
...
我使用['a', 'b', 'c', 'd', 'e']
和2作为示例。运行后,将创建三个文件,前两个将包含两行,最后一个将包含一行(仅e
)。请注意,运行此目录之前必须存在目录new
。