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
相关产品推荐
相关产品推荐

