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

Numpy导出CSV文件时列标题格式异常问题求助

排查CSV列标题异常问题:从Python爬取到保存的坑

嘿,我看你遇到了挺头疼的问题——爬取的数据数值没问题,但存成CSV后列标题在表格和文本编辑器里显示异常,偏偏在Spyder里看数组又一切正常。咱们来一步步拆解问题,找到解决办法。

可能的问题根源

首先得明白:Spyder里显示数组时,会自动处理掉一些隐藏的特殊字符(比如换行\n、回车\r),但这些字符在存成CSV文件后,会直接破坏表格的结构。结合你的代码来看,主要有两个点要注意:

  • 从网页提取的文本(尤其是表头<th>里的内容)可能包含换行、多余空格或者HTML残留的特殊字符,你直接提取text时没做清理;
  • NumPy的savetxt工具更适合处理纯数值数组,对带特殊字符的字符串支持不够友好,不会自动给含特殊字符的字段加引号包裹,导致表格软件解析错位。

针对性的解决方案

1. 先清理所有提取到的文本内容

在从网页获取文本时,把隐藏的换行、回车和多余空格都去掉,修改parse_inf函数里的文本提取部分:

def parse_inf(data=data):
    html = bs(data["inflation"],"lxml")
    year = html.find("td",width="62%").find("h2").text.strip()  # 清理年份文本
    months = html.find("div",id="ContentTextinner").find_all("th")
    # 清理月份文本,去掉换行、回车和首尾空格
    inf_months = [i.text.strip().replace('\n', '').replace('\r', '') for i in months]
    inf_months = [f"{i} {year}" for i in inf_months]
    inf_months[0] = inf_months[0][:5]
    inf_months = array(inf_months).transpose()
    
    measure = html.find("div",id="ContentTextinner").find_all("td",align="left")
    # 清理measure文本
    measure = [i.text.strip().replace('\n', '').replace('\r', '') for i in measure][:-3]
    
    # 清理数值文本
    values = [
        [i.text[:5].strip().replace('\n', '').replace('\r', '') for i in html.find("div",id="ContentTextinner").find_all("td",class_="style2",style="width: 15%")],
        [i.text[:5].strip().replace('\n', '').replace('\r', '') for i in html.find("div",id="ContentTextinner").find_all("td",class_="style2",style="width: 16%")],
        [i.text[:5].strip().replace('\n', '').replace('\r', '') for i in html.find("div",id="ContentTextinner").find_all("td",class_="style2",width="20%")]
    ]
    values.insert(0,measure)
    values = array(values)
    inf_data = insert(values,0,inf_months,axis=1)
    return inf_data

2. 改用Python标准库的csv.writer保存文件

NumPy的savetxt不是处理带字符串表格的最佳选择,换成csv.writer能自动处理字段的引号包裹,避免解析错误:

# 获取处理后的inf_data
inf_data = parse_inf()

# 用csv.writer保存
with open("/home/user/Documents/Scraped Data/Inflation Data.csv", 'w', newline='', encoding='utf-8') as csv_file:
    writer = csv.writer(csv_file)
    # 逐行写入数组内容
    for row in inf_data:
        writer.writerow(row)

这里要注意两个参数:newline=''可以避免Windows系统下CSV出现空行;encoding='utf-8'能防止中文或特殊字符乱码。

3. 排查隐藏字符的小技巧

如果还是有问题,可以在保存前打印数组的每一行,用repr()显示出所有隐藏的转义字符,方便定位问题:

for row in inf_data:
    print([repr(item) for item in row])

比如如果输出里出现'January\n2024',就说明文本里有换行符,需要进一步清理。

总结

大概率是网页文本里的隐藏换行/回车字符搞的鬼,先清理所有提取到的文本,再用csv.writer代替NumPy的savetxt,基本就能解决列标题显示异常的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 18:13:01