用 header 将 csv 拆分成多个部分并附加 csv 文件

Split csv into pieces with header and attach csv files

我有一个如下所示的 CSV 文件:

这是一个简化的例子。我的原始 CSV 包含数千行。现在我的目标是将这个 CSV 分成不同的小块。但是,我想在每个文件中都有 header 并且 header 由前 8 行组成,第 9 行包含一个空行,这也属于 header.

由于我对数据不感兴趣,只是裁剪它,所以我试图找到一种快速且不涉及任何数据修改的解决方案。我不想使用 Pandas。我想避免使用 csv 模块进行读写,但我也尝试使用 的答案中提到的实现。这里的问题是我的 header 不只是一行,而是总共 9 行。而且我想避免读取和写入数据,因为我实际上只需要切割它。

我尝试使用 islice

第一个 CSV 可以创建如下:

from itertools import islice

with open(r"C:\Desktop\myfolder\mycsv.csv") as f, open (r"C:\Desktop\myfolder\out.csv", "w") as out:
    r = islice(f, 0, 12)
    out.writelines(r)

这给出了我的第一个 CSV,包含 12 行(我认为),包括 header。现在我不知道如何以包含第 13 行数据的方式剪切我的第二个文件,直到让我们说第 20 行,但包括 header。我不确定 islice 是否可以做到这一点。我知道如何通过设置开始和停止 islice(f, 13 20) 来获取数据,但是 header 不见了。我还考虑过剪切一个文件,header,然后是数据文件并附加它们。但是我找不到一种方法来附加两个 CSV,而不必读写或使用 pandas.

我会尝试这样的事情:

  • 逐行读取文件
  • 记住 header 行
  • 在需要时启动一个新的输出文件,并且每次都在前面添加 header 行

代码:

a.csv:

c1 c2 
c3 c4

d1 d2
d3 d4
d5 d6
d7 d8

script.py:

with open("a.csv", "r") as inp:
    header = []
    headersize = 3
    for _ in range(0, headersize):
        header.append(inp.readline())

    filenumber = 1
    chunksize = 2
    dataline = inp.readline()
    while dataline != "":
        with open("a_" + str(filenumber) + ".csv", "w") as outp:
            for headerline in header:
                outp.write(headerline)
            for _ in range(0, chunksize):
                outp.write(dataline)
                dataline = inp.readline()
        filenumber += 1

a_1.csv:

c1 c2 
c3 c4

d1 d2
d3 d4

a_2.csv:

c1 c2 
c3 c4

d5 d6
d7 d8

除了使用固定的块大小,您还可以实施任何其他条件来启动新文件。