
本文介绍当CSV文件结构不规则(如列数不一致、含空行或嵌套HTML)时,为何Pandas会报错,以及如何绕过read_csv限制,使用标准库csv模块配合openpyxl稳健完成CSV→XLSX转换。
本文介绍当csv文件结构不规则(如列数不一致、含空行或嵌套html)时,为何pandas会报错,以及如何绕过`read_csv`限制,使用标准库`csv`模块配合`openpyxl`稳健完成csv→xlsx转换。
Pandas 的 pd.read_csv() 默认假设输入是结构化表格数据:每行字段数一致、以统一分隔符(如逗号)对齐、无嵌套格式。而您提供的 CSV 实际是半结构化文本日志——包含标题行 "==CNAME=="、空行、键值对(如 "Name:","MATT B"),甚至内嵌 HTML 链接。当 Pandas 在第3行("Tool Name","v2.1")解析时,发现该行有2个字段,但后续行(如 "E-Mail:","<a ...>")因引号内含逗号或特殊字符导致字段计数异常,触发 C error: Expected 1 fields... saw 2 错误。
此时强行指定 delimiter、quotechar 或 on_bad_lines='skip' 往往无效,因为问题本质不是分隔符歧义,而是数据不符合二维表语义。正确做法是放弃 pandas.read_csv(),改用更底层、更灵活的解析方式:
✅ 推荐方案:csv.reader + openpyxl
Python 标准库 csv 模块能准确按 RFC 4180 规则解析带引号的字段(包括引号内含逗号、换行等),而 openpyxl 可直接逐行写入 Excel,完全规避 Pandas 的结构校验:
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.reader 安全读取(自动处理引号、转义、空行)
with open(csv_file_path, 'r', newline='', encoding='utf-8') as f:
reader = csv.reader(f)
# 创建 Excel 工作簿
wb = Workbook()
ws = wb.active
ws.title = "Raw Data"
# 逐行写入,保留原始结构
for row in reader:
ws.append(row) # row 是字符串列表,如 ['"Name:"','"MATT B"']
wb.save(excel_file)
print(f"✅ 转换完成:{excel_file}")
return excel_file
# 调用示例
convert_csv_to_xlsx(r"C:\Users\aztec\Desktop\del.csv")⚠️ 关键注意事项:
- 编码必须显式指定:添加 encoding='utf-8' 避免中文或特殊符号乱码;
- newline='' 不可省略:Windows 下防止空行被重复读取;
- openpyxl 需提前安装:pip install openpyxl;
- 若需进一步清洗(如剥离引号、提取邮箱纯文本),可在 ws.append() 前对 row 元素做 str.strip('"') 或正则提取;
- 此方法严格保留原始行结构,空行、标题行均原样写入 Excel,符合“所见即所得”需求。
总结:面对非表格型 CSV,不要强行用 Pandas “硬解”。理解数据本质(是日志/配置/报告?而非数据库导出),选择匹配的工具链——csv 模块负责鲁棒解析,openpyxl 负责精准输出,既简洁又可靠。


















