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

如何使用Python解析管道符分隔TXT文件并转换为CSV格式

实现方案

核心逻辑

你的文件每行是值|列名交替排列的格式,且可能存在空值,直接用Python内置的csv模块处理即可,不需要额外依赖,自带的转义逻辑可以避免自己拼接字符串导致的csv格式错误。

完整代码(通用版,支持不同行存在不同列)

import csv

# 配置参数
input_txt_path = "input.txt" # 替换成你的输入txt路径
output_csv_path = "output.csv" # 替换成你的输出csv路径
file_encoding = "utf-8" # 如果是gbk编码就改成gbk

# 第一步:先遍历所有行,收集所有出现过的列名
all_columns = set()
with open(input_txt_path, 'r', encoding=file_encoding) as f:
    for line in f:
        line = line.strip('\n')
        if not line:
            continue
        parts = line.split('|')
        # 取所有列名,也就是索引为奇数的元素
        for i in range(1, len(parts), 2):
            col_name = parts[i].strip()
            if col_name:
                all_columns.add(col_name)
# 转成列表方便后续按固定顺序写入
column_list = list(all_columns)

# 第二步:逐行处理写入csv
with open(input_txt_path, 'r', encoding=file_encoding) as in_f, \
     open(output_csv_path, 'w', newline='', encoding=file_encoding) as out_f:
    writer = csv.DictWriter(out_f, fieldnames=column_list)
    # 写表头
    writer.writeheader()
    for line in in_f:
        line = line.strip('\n')
        if not line:
            continue
        parts = line.split('|')
        row_dict = {}
        # 按值、列名交替提取
        for i in range(0, len(parts), 2):
            if i+1 >= len(parts):
                # 行元素数量为奇数,缺少对应列名,直接跳过
                break
            col_name = parts[i+1].strip()
            if not col_name:
                continue
            # 取值,保留原始内容,空值也正常写入
            value = parts[i].strip()
            row_dict[col_name] = value
        writer.writerow(row_dict)

简化版(所有行列顺序完全一致的场景)

如果你能确定所有行的列顺序、列名都完全相同,不需要遍历两次文件,可以直接取第一行的列名做表头,处理速度更快:

import csv

input_txt_path = "input.txt"
output_csv_path = "output.csv"
file_encoding = "utf-8"

with open(input_txt_path, 'r', encoding=file_encoding) as in_f, \
     open(output_csv_path, 'w', newline='', encoding=file_encoding) as out_f:
    lines = [l.strip('\n') for l in in_f if l.strip('\n')]
    if not lines:
        exit()
    # 取第一行提取列名
    first_parts = lines[0].split('|')
    column_list = [first_parts[i].strip() for i in range(1, len(first_parts), 2) if first_parts[i].strip()]
    writer = csv.DictWriter(out_f, fieldnames=column_list)
    writer.writeheader()
    for line in lines:
        parts = line.split('|')
        row_dict = {}
        for idx, col in enumerate(column_list):
            value_idx = idx * 2
            if value_idx >= len(parts):
                value = ''
            else:
                value = parts[value_idx].strip()
            row_dict[col] = value
        writer.writerow(row_dict)

注意事项

  • 代码默认保留字段的前后空格,如果需要去掉可以自行调整strip()的逻辑
  • 空值会自动对应csv的空字段,不需要额外处理
  • 如果文件超大(GB级别),建议用简化版避免两次IO读取占用过多资源

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:15:05