如何用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()
代码说明
- 固定前缀提取:提前收集表头和
Continent行,确保每个输出文件都包含这些基础内容; - 行类型判断:用
startswith判断行的类型,避免依赖严格的列位置(适配原文件的混乱结构); - 文件切换逻辑:每遇到
Family行就关闭当前文件,创建新文件并写入前缀和当前Family行; - 通用内容写入:后续所有非
Family行都写入当前打开的文件,不管中间有多少行都能正确捕获。
内容的提问来源于stack exchange,提问作者user53526356
相关产品推荐
相关产品推荐

