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

如何使用Python导入列大小模式不同的固定宽度CSV文件?

解决Python导入不同列宽模式的固定宽度CSV文件问题

咱们先梳理下核心需求:这个文件里每行的格式完全由前两位字符区分——01代表企业,02代表个人;而且一个企业可能对应多行所有者信息,所有者名称还可能包含逗号、句号这类特殊字符。常规的固定宽度读取工具(比如pandas的read_fwf)没法直接处理这种多格式混合的场景,所以咱们得逐行判断实体类型,再用对应的规则拆分字段,同时还要处理企业与多所有者的关联逻辑。

步骤1:明确字段宽度规则

根据你给出的示例,先把两种实体的字段拆分逻辑确定下来(你可以根据实际数据调整宽度数值):

  • 企业行(01开头):
    • 前2位:实体类型(固定为01)
    • 接下来14位:企业ID(比如示例里的83738293836728)
    • 剩余部分:企业名称(可能包含空格、连字符)
  • 个人行(02开头):
    • 前2位:实体类型(固定为02)
    • 接下来15位:所有者ID(示例里的837382938367282)
    • 接下来2位:年龄(示例里的22)
    • 剩余部分:所有者名称(可能包含逗号、句号)

步骤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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:55:10