如何每 x 行写入一个新的文本文件? [python]

How do I write in a new text file every x lines? [python]

假设我有一个包含 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()

这是我尝试过的方法,以及其他一些解决方案。我觉得我错过了一些简单的东西。

这与上面指出的另一个问题不同,前者讨论的是文本文件,后者讨论的是列表。

使用生成器拆分行列表如下:

>>> 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 必须在 运行 之前存在。

使用 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))