重复后正确分割CSV文件

2024-09-26 22:51:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我的CSV包含5000行,每几百行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个文件(但文件中这些文件的数量不同)


Tags: 文件ofcsv方法脚本numbera1b1
1条回答
网友
1楼 · 发布于 2024-09-26 22:51:53

我发现了一个比break语句更好的解决方案,正如我在评论中所建议的:

您可以创建result列表,并将每个块数据存储在列表的单独元素中(例如,在dict中)。如果您读取的是非标题行,则可以保证刚才读取的行与当前数据块相关。当前的数据块是result列表中的最后一个元素,所以您可以修改它。如果读取标题行,只需将新元素附加到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(', '))

相关问题 更多 >

    热门问题