首页 > 解决方案 > 在 Pandas 中重复后正确拆分 CSV 文件

问题描述

我有包含 5000 行的 CSV,每隔几百行 CSV 行就有一个重复部分。
将这个文件分成几个不同的最有效的选择是什么?

文件看起来像

Header1
number of Samples1
Content1
a1, aa1, aaa1
b1, bb1, bbb1
....
Header2
number of Samples2
Content2
a2, aa2, aaa2
b2, bb2, bbb2
....
Header3
number of Samples3
Content3
a3, aa3, aaa3
b3, bb3, bbb3

我需要将它分成几个文件Header。我不知道我该怎么做。我编写了整个脚本来处理一些生物材料,但是其中一种文件类型(上图)会产生问题,因为它是多个文件合二为一。并且脚本不想使用它。

我已经阅读了很多关于拆分文件的内容,但是在 Pandas 中重复值后,我没有发现任何关于拆分的信息。

在这种情况下,它将是 3 个文件(但文件中这些文件的数量会有所不同)

标签: pythonpandascsvsplit

解决方案


正如我在评论中建议的那样,我找到了比break陈述更好的解决方案:

您可以创建result列表并将每个块数据存储在列表的单独元素中(例如,在 dict 中)。如果您读取非Header行,则可以保证您刚刚读取的行与当前数据块相关。当前的数据块是result列表中的最后一个元素,因此您可以对其进行修改。如果您阅读Header行,您只需将新元素附加到result并开始将新的块数据写入其中。

如果内容的大小是恒定的,您可以使用itertools.cycle将“编码”您的解析过程的迭代器:

from itertools import cycle

text1 = """Header1
number of Samples1
Content1
a1, aa1, aaa1
b1, bb1, bbb1
Header2
number of Samples2
Content2
a2, aa2, aaa2
b2, bb2, bbb2"""
size = 5
iterator = cycle(range(size))
result = []
for line in text1.split('\n'):
    i = next(iterator)
    if i == 0:
        result.append({'header': line})
    elif i == 1:
        result[-1]['num_of_samples'] = line
    elif i == 2:
        result[-1]['content_header'] = line
    elif i == 3:
        result[-1]['content'] = [line.split(', ')]
    else:
        result[-1]['content'].append(line.split(', '))

如果您不知道内容的大小,则应解析每一行,检查其类型并手动构建数据:

text2 = """Header1
number of Samples1
Content1
a1, aa1, aaa1
b1, bb1, bbb1
b1, bb1, bbb1
Header2
number of Samples2
Content2
b2, bb2, bbb2
Header3
number of Samples3
Content3
a3, aa3, aaa3
b3, bb3, bbb3"""
result = []
i = 0
for line in text2.split('\n'):
    if line.startswith('Header'):  # Your condition for headers
        result.append({'header': line})
    elif line.startswith('number'):  # Your condition for number of samples
        result[-1]['num_of_samples'] = line
    elif line.startswith('Content'):  # Your condition for content headers
        result[-1]['content_header'] = line
    else:
        if 'content' not in result[-1]:  # We don't know is the content list created
            result[-1]['content'] = [line.split(', ')]
        else:
            result[-1]['content'].append(line.split(', '))

推荐阅读