You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python按Family行分割结构混乱的CSV文件?

按Family行分割结构混乱的CSV文件(Python实现)

问题背景

我有一个名为file.csv的结构不规则CSV文件,内容如下:

|A|B|C|
|Continent||1|
|Family|44950|file1|
|Species|44950|12|
|Habitat||4|
|Species|44950|22|
|Condition|Tue Jan 24 00:00:00 UTC 2023|4|
|Family|Fish|file2|
|Species|Bass|8|
|Species|Trout|2|
|Habitat|River|3|

需要将其分割为多个CSV文件,分割依据是Family行:每个输出文件包含表头、开头的Continent行,以及当前Family行到下一个Family行之前的所有内容,输出文件名取对应Family行第三列的值(如file1.csv、file2.csv)。由于中间行的数量不固定(比如多个Species行),需要一个通用的实现方法。

解决方案

核心思路是:先提取每个输出文件都需要的固定前缀行,然后遍历原文件内容,遇到Family行时切换输出文件,将后续内容写入当前文件直到下一个Family行出现。

Python代码实现

# 读取原始文件所有有效行(过滤空行)
with open('file.csv', 'r', encoding='utf-8') as src_file:
    raw_lines = [line.rstrip('\n') for line in src_file if line.strip()]

# 提取每个输出文件都需要的固定前缀:表头 + Continent行
prefix = []
current_output = None

for line in raw_lines:
    # 收集固定前缀行
    if line.startswith('|A|B|C|') or line.startswith('|Continent||'):
        prefix.append(line)
        continue
    
    # 遇到Family行,切换输出文件
    if line.startswith('|Family|'):
        # 关闭之前的输出文件(如果存在)
        if current_output:
            current_output.close()
        
        # 从Family行中提取输出文件名
        # 分割行内容,第三列是文件名(注意分割后索引从0开始,parts[3]对应原第三列)
        parts = line.split('|')
        output_filename = f"{parts[3]}.csv"
        
        # 打开新文件,写入前缀和当前Family行
        current_output = open(output_filename, 'w', encoding='utf-8')
        current_output.write('\n'.join(prefix) + '\n')
        current_output.write(line + '\n')
    else:
        # 将非Family行写入当前打开的文件
        if current_output:
            current_output.write(line + '\n')

# 关闭最后一个输出文件
if current_output:
    current_output.close()

代码说明

  1. 固定前缀提取:提前收集表头和Continent行,确保每个输出文件都包含这些基础内容;
  2. 行类型判断:用startswith判断行的类型,避免依赖严格的列位置(适配原文件的混乱结构);
  3. 文件切换逻辑:每遇到Family行就关闭当前文件,创建新文件并写入前缀和当前Family行;
  4. 通用内容写入:后续所有非Family行都写入当前打开的文件,不管中间有多少行都能正确捕获。

内容的提问来源于stack exchange,提问作者user53526356

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 09:46:03