Python爬虫输出CSV文件时汉字显示为乱码,如何解决?

32 位 WINDOWS7,PYTHON3 环境下。用这样的命令将爬到的结果输出到 CSV 文件: scrapy crawl 爬虫名 -o result.csv

这个文件用 EDITPLUS 或写字板打开都能正常显示其中的汉字,但是直接双击 CSV 文件用 EXCEL 打开时其中的汉字却都是乱码,请问这个要如何解决呢?感谢指点!


Python爬虫输出CSV文件时汉字显示为乱码,如何解决?
25 回复

这个问题很常见,主要是编码问题。CSV默认用utf-8编码写入,但Excel打开时可能默认用系统本地编码(比如中文Windows的gbkgb2312),导致乱码。

最直接的解决方案是:在写入CSV文件时,明确指定编码为utf-8-sig

utf-8-sig会在文件开头写入一个BOM(字节顺序标记),这个标记能帮助Excel等软件自动识别文件为UTF-8编码,从而正确显示中文。

下面是一个完整的示例代码:

import csv

# 你的数据,假设包含中文
data = [
    ['姓名', '城市', '备注'],
    ['张三', '北京', '测试数据'],
    ['李四', '上海', '另一个测试']
]

# 关键:使用 newline='' 防止空行,并用 encoding='utf-8-sig' 指定编码
with open('output.csv', 'w', newline='', encoding='utf-8-sig') as f:
    writer = csv.writer(f)
    writer.writerows(data)

print("CSV文件已生成,使用Excel打开应能正常显示中文。")

如果数据来自网络爬虫(比如用requests库),通常也需要在获取响应时指定正确的编码:

import requests
import csv

url = '你的目标网址'
response = requests.get(url)
# 确保网页编码正确,常见的中文编码是 'utf-8' 或 'gbk'
response.encoding = 'utf-8'  # 或根据实际情况调整为 'gbk', 'gb2312'
html_text = response.text

# ... 这里用你的解析方法(如BeautifulSoup)从html_text中提取数据 ...
parsed_data = [['标题', '内容'], ['示例标题', '示例中文内容']]

# 写入CSV时同样使用 utf-8-sig
with open('scraped_data.csv', 'w', newline='', encoding='utf-8-sig') as f:
    writer = csv.writer(f)
    writer.writerows(parsed_data)

总结一下关键点:

  1. 写入文件时open('file.csv', 'w', encoding='utf-8-sig')
  2. 读取网页时:设置 response.encoding 为正确的源编码。

如果还不行,检查一下你的数据源本身是不是就已经是乱码了。用utf-8-sig基本能解决99%的Excel中文乱码问题。

一句话建议:写入CSV时用encoding='utf-8-sig'

编码格式改为 utf-8?

utf8-bom

文件转 gbk 编码就好了应该

-- coding: utf8-bom -- ? 这么写不对呢

命令行模式用什么参数可以转 GBK 呢?

excel 用导入,高级,然后选 utf-8

utf-8-sig

文件格式选系统默认

EXCEL 导入时手工处理是可以的

这个是在哪里选呢? EXCEL 导入时么?那就是 UTF-8 了

用记事本打开,另存为 utf-8 格式

excel 打开 csv 默认 ansi 编码 所以你只能通过 excel 重新导入逗号分隔文本 然后生成 xls

这是 excel 的问题,百度:excel 导入 csv 文件

我不懂 py,我用 c#写的爬虫方式是本地写入文件时候,需要和操作系统的文件格式一致

用 Python2 爬 HTML 页面或者爬到数据库然后导出到 csv 还没遇到过这种问题呢。我都是先 sys.setdefaultencoding(‘utf-8’)

微软的软件打开文件默认都是 ANSI 编码(国内就是 GBK),UTF-8 的 csv 文件在 execl 中打开时解码自然就乱码了,在 WINDOWS 中识别 UTF-8 需要在前面添加 BOM(16 进制的:EF BB BF ),或者选择导入的方式(里面可以选择编码)。

excel 新建表单导入 csv,编码选择 UTF-8,直接双击不行

utf-8 without boom

-- coding: utf-8-sig -- ? 程序中这么写无效呢

PYTHON3 下好像就不能用 sys.setdefaultencoding(‘utf-8’)了

iconv -f utf-8 -t gbk yourfile > your_gbk_file

貌似简单的方法就是记事本打开以后,在另存成 utf-8 就可以。

excel 会根据有没有 BOM 确定文件是不是 UTF8 编码,否则它假设内容使用 windows codepage 编码。
这种情况只需要重新保存文本为 utf-8 with bom 就没有乱码了。

回到顶部