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

时间:2015-02-01 10:14:32

标签: python text split

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

这是我在其他一些解决方案中尝试过的。我有一种感觉,我错过了一些简单的东西。

这与上面提到的另一个问题有所不同,因为它正在谈论一个文本文件,这是在谈论一个列表。

2 个答案:

答案 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

相关问题