
本文介绍当CSV文件列数不一致(如含标题行、空行、单字段行等)导致pandas读取报错时,应避开pd.read_csv(),改用Python标准库csv模块逐行解析,并结合openpyxl直接写入Excel。
本文介绍当csv文件列数不一致(如含标题行、空行、单字段行等)导致pandas读取报错时,应避开`pd.read_csv()`,改用python标准库`csv`模块逐行解析,并结合`openpyxl`直接写入excel。
Pandas 的 read_csv() 默认假设输入是结构化表格:每行字段数相同、存在明确的列对齐关系。而您提供的 CSV 文件本质上是非表格型文本日志——它混合了节标题("==CNAME==")、空行、键值对("Name:","MATT B")和 HTML 片段,行内字段数从 1 到 2 不等。当 pandas 在第 3 行(即 "Tool Name","v2.1")期望 1 列却遇到 2 列时,便抛出 Expected 1 fields in line 3, saw 2 错误。强制指定 delimiter 或 header=None 无法根本解决语义混乱问题。
正确的处理思路是:放弃“作为表格加载”的假设,转为“按纯文本行解析”。Python 标准库 csv.reader 能稳健处理引号包围、逗号嵌套等常见格式,并忠实地将每行拆分为字符串列表,无论长度是否一致。
以下为推荐实现方案(需提前安装:pip install openpyxl):
import csv
import os
from openpyxl import Workbook
def convert_csv_to_xlsx(csv_file_path):
excel_file = os.path.splitext(csv_file_path)[0] + '.xlsx'
# 以文本模式打开CSV,用csv.reader安全解析每一行
with open(csv_file_path, 'r', encoding='utf-8') as f:
reader = csv.reader(f)
# 创建Excel工作簿与活动工作表
wb = Workbook()
ws = wb.active
ws.title = "Raw Data"
# 逐行写入——csv.reader返回的每行都是list,ws.append()原样接受
for row in reader:
ws.append(row)
wb.save(excel_file)
print(f"✅ 成功导出至:{excel_file}")
return excel_file
# 使用示例
convert_csv_to_xlsx(r"C:\Users\aztec\Desktop\del.csv")
⚠️ 注意事项:
- 不要用 pandas 强行读取此类文件:即使设置 on_bad_lines='skip' 或 engine='python',仍可能丢失数据或产生不可预测的列对齐;
- 编码需显式指定:Windows 环境下 CSV 常为 gbk 或 utf-8-sig,若出现乱码,请在 open() 中添加 encoding='utf-8-sig';
- HTML 邮箱标签无需额外解析:csv.reader 会将整段 视为一个字段字符串,保留原始结构,Excel 中可正常显示(如需解码邮箱,再用 cf_email 解密逻辑单独处理);
- 如需后续结构化分析:建议先用此方法转为 Excel 查看全貌,再人工识别规律,编写专用清洗逻辑(例如提取所有 "Key:" 开头的行构建字典)。
该方法轻量、可靠、无依赖冲突,精准匹配“不规则文本 → 表格存档”的实际需求。











