Python 在空白行X行后拆分文件

Python 在空白行X行后拆分文件,python,Python,我需要将大的文本文件分割成更小的块,这样文本文件就包含了需要放在一起的数据。每个相关的数据块通过换行符与下一个数据块分开,如下所示: Some Data belonnging to chunk 1 Some Data belonnging to chunk 1 Some Data belonnging to chunk 1 More Data, belonnging to chunk 2 More Data, belonnging to chunk 2 More Data, belonngin

我需要将大的文本文件分割成更小的块,这样文本文件就包含了需要放在一起的数据。每个相关的数据块通过换行符与下一个数据块分开,如下所示:

Some Data belonnging to chunk 1
Some Data belonnging to chunk 1
Some Data belonnging to chunk 1

More Data, belonnging to chunk 2
More Data, belonnging to chunk 2
More Data, belonnging to chunk 2

我如何定义一系列行,然后在下一个空白行维护数据块,分割文件?我想使用Python实现这一点,但我不知道在X行之后使用split函数。

如果您想编写新的chunk1.txt。。。chunkN.txt对于每个区块,您可以这样做:

def chunk_file(name, lines_per_chunk, chunks_per_file):

    def write_chunk(chunk_no, chunk):
        with open("chunk{}.txt".format(chunk_no), "w") as outfile:
            outfile.write("".join(i for i in chunk))

    count, chunk_no, chunk_count, chunk = 1, 1, 0, []
    with open(name, "r") as f:
        for row in f:
            if count > lines_per_chunk and row == "\n":
                chunk_count += 1
                count = 1
                chunk.append("\n")
                if chunk_count == chunks_per_file:
                    write_chunk(chunk_no, chunk)
                    chunk = []
                    chunk_count = 0
                    chunk_no += 1
            else:
                count += 1
                chunk.append(row)
    if chunk:
        write_chunk(chunk_no, chunk)

chunk_file("test.txt", 3, 1)
您必须指定属于块的行,之后需要换行

假设要将此文件分块:

Some Data belonnging to chunk 1

Some Data belonnging to chunk 1
Some Data belonnging to chunk 1
Some Data belonnging to chunk 1
Some Data belonnging to chunk 1
Some Data belonnging to chunk 1

More Data, belonnging to chunk 2
More Data, belonnging to chunk 2
More Data, belonnging to chunk 2
第一个区块的行数与第二个区块的行数差别很大。(7线对3线)

本例的输出为chunk1.txt

Some Data belonnging to chunk 1

Some Data belonnging to chunk 1
Some Data belonnging to chunk 1
Some Data belonnging to chunk 1
Some Data belonnging to chunk 1
Some Data belonnging to chunk 1
More Data, belonnging to chunk 2
More Data, belonnging to chunk 2
More Data, belonnging to chunk 2
chunk2.txt

Some Data belonnging to chunk 1

Some Data belonnging to chunk 1
Some Data belonnging to chunk 1
Some Data belonnging to chunk 1
Some Data belonnging to chunk 1
Some Data belonnging to chunk 1
More Data, belonnging to chunk 2
More Data, belonnging to chunk 2
More Data, belonnging to chunk 2
这种方法假设每个块的行数是一个最小块大小,因此即使块的行数不同,它也可以工作。当达到最小块大小时,我们只寻找一个空行来结束块。
在上面的示例中,没有问题,第2行有一个空行,因为尚未达到最小块大小。如果第4行出现空行,并且块数据随后继续,则会出现问题,因为指定的标准(行号和空行)无法单独识别块。

使用计数器和模。删除
f.readlines()
可能会有帮助,以使文件行上的迭代器工作。不要一次读取整个文件。否则是个好办法。谢谢你的提示。我不知道你可以迭代这样的文件。这不适用于大文件(>100万行),对于行数差异很大的块(可能从8行到70行),会吗?@kbecker87我只是修改了解决方案,在对100万行的文件评估和测试脚本时,只准备好行。用了约8秒的时间才将其切块。如果块的大小差别很大,这也会起作用。在您的示例中,必须将最小大小设置为8行才能识别第一个块。如果在包含70行的块中,在前8行之后没有空行,那么它将起作用。否则,您需要另一个标准来标识块。这对于在每个块上将文件拆分为单个文件非常有效。实际上,我需要安全地说,1000个块放入一个文件,下1000个块放入下一个文件,依此类推。@kbecker87我编辑了答案,以允许每个文件添加一个参数chunks\u,这使您能够选择一个文件中有多少个块。太好了!我试图保持空白之间的块,但甚至不能解决这个问题。