如何使用Python导入列大小模式不同的固定宽度CSV文件?
解决Python导入不同列宽模式的固定宽度CSV文件问题
咱们先梳理下核心需求:这个文件里每行的格式完全由前两位字符区分——01代表企业,02代表个人;而且一个企业可能对应多行所有者信息,所有者名称还可能包含逗号、句号这类特殊字符。常规的固定宽度读取工具(比如pandas的read_fwf)没法直接处理这种多格式混合的场景,所以咱们得逐行判断实体类型,再用对应的规则拆分字段,同时还要处理企业与多所有者的关联逻辑。
步骤1:明确字段宽度规则
根据你给出的示例,先把两种实体的字段拆分逻辑确定下来(你可以根据实际数据调整宽度数值):
- 企业行(01开头):
- 前2位:实体类型(固定为
01) - 接下来14位:企业ID(比如示例里的
83738293836728) - 剩余部分:企业名称(可能包含空格、连字符)
- 前2位:实体类型(固定为
- 个人行(02开头):
- 前2位:实体类型(固定为
02) - 接下来15位:所有者ID(示例里的
837382938367282) - 接下来2位:年龄(示例里的
22) - 剩余部分:所有者名称(可能包含逗号、句号)
- 前2位:实体类型(固定为
步骤2:编写解析代码
下面是完整的Python实现,包含逐行读取、类型判断、字段解析,以及企业与所有者的关联逻辑:
def parse_mixed_fixed_width_file(file_path): # 存储最终结果:键为企业信息元组,值为对应所有者列表 company_owners_map = {} current_active_company = None with open(file_path, 'r', encoding='utf-8') as file: for line_num, raw_line in enumerate(file, start=1): line = raw_line.strip() if not line: continue # 跳过空行 # 提取实体类型(前两位字符) entity_type = line[:2] try: if entity_type == '01': # 解析企业行 company_id = line[2:16].strip() company_name = line[16:].strip() current_active_company = (company_id, company_name) # 初始化该企业的所有者列表 company_owners_map[current_active_company] = [] elif entity_type == '02': # 解析个人行,需关联到当前企业 if not current_active_company: print(f"警告:第{line_num}行是个人信息,但未找到对应企业行") continue owner_id = line[2:17].strip() age = line[17:19].strip() owner_name = line[19:].strip() # 将所有者信息添加到当前企业的列表中 company_owners_map[current_active_company].append({ 'owner_id': owner_id, 'age': age, 'owner_name': owner_name }) else: print(f"警告:第{line_num}行的实体类型{entity_type}无法识别") except IndexError: print(f"错误:第{line_num}行格式异常,无法完成解析") return company_owners_map # 使用示例:替换成你的文件路径 parsed_result = parse_mixed_fixed_width_file('your_data_file.txt') # 打印解析结果 for (comp_id, comp_name), owners in parsed_result.items(): print(f"企业ID: {comp_id} | 名称: {comp_name}") print("所有者信息:") for idx, owner in enumerate(owners, start=1): print(f" {idx}. ID: {owner['owner_id']} | 年龄: {owner['age']} | 姓名: {owner['owner_name']}") print("-" * 50)
关键细节说明
- 逐行处理:既避免了大文件加载的内存压力,又能灵活适配不同格式的行
- 关联逻辑:用
current_active_company变量跟踪当前处理的企业,确保所有者信息能正确归属 - 容错处理:加入了空行跳过、未知类型警告、格式错误捕获,避免程序直接崩溃
- 字段清洗:用
strip()去除字段前后的冗余空格,保证数据整洁
如果你的实际字段宽度和示例不符,只需要修改代码里的切片索引(比如line[2:16]这类)即可,非常灵活。
内容的提问来源于stack exchange,提问作者Denis Alves
相关产品推荐
相关产品推荐

