python打开文件_一日一技:Python写的csv文件,如何让 Excel 双击打开不乱码?

当使用Python的pandas库生成CSV文件并尝试在Excel中打开时,可能会遇到中文乱码的问题。这是由于编码不匹配导致的。解决方法是在保存CSV时指定GBK编码或添加BOM(字节顺序标记)。如果包含更多复杂字符,推荐使用'utf-8-sig'编码,它会自动处理BOM,确保在Excel中正确显示中文,同时在Python中读取时也不会引入额外的BOM问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4ed233ef766b4fd3922fc7d3aee5555b.png

摄影:产品经理厨师:Kingname

我们常常需要在 Python 中输出 CSV 文件,但你可能会发现,这些输出的 CSV文件,不能双击使用 Excel 打开,否则中文会变成乱码。例如下面这段代码:

import pandas as pd

datas = [

{

'name': '王小一',

'age': 29,

'address': '北京'

},

{

'name': '张小二',

'age': 18,

'address': '四川'

},

{

'name': '李小三',

'age': 60,

'address': '上海'

}

]

df = pd.DataFrame(datas)

df.to_csv('person.csv', index=False)

如果双击使用 Excel 打开,你会发现中文变成了乱码,如下图所示:

fb14fd3abf65a6842bacb32e1b4d9b19.png

这是因为,当你执行代码 df.to_csv('person.csv',index=False)时,它默认会以 UTF-8编码方式写 CSV 文件。但是当你双击 CSV 使用 Excel打开时,Excel 会以 GBK 编码来读这个文件,这就导致了乱码的发生。

所以,如果是简单的中文,你可以把编码方式人工指定为 GBK:

import pandas as pd

datas = [

{

'name': '王小一',

'age': 29,

'address': '北京'

},

{

'name': '张小二',

'age': 18,

'address': '四川'

},

{

'name': '李小三',

'age': 60,

'address': '上海'

}

]

df = pd.DataFrame(datas)

df.to_csv('person.csv', index=False, encoding='gbk')

此时再双击使用 Excel 打开,中文就能正常显示了,如下图所示:

c6527e9114043df606642267285851a3.png

但 GBK 编码的字符集不够完善,所以如果文本中包含超出 GBK 字符集的内容,就会导致编码错误,如下图所示:

7b496e0db7edc7b7ebb315d2563c187a.png

1bfea15e0b461368a39532b0d41a41ea.png

这个时候怎么办呢?

实际上当你双击打开 CSV 的时候,Excel会检查文件的第一个字符,如果这个字符是 BOM,那么他就知道应该使用 UTF-8编码方式来打开这个文件。所谓的 BOM指的是 byte-order mark

BOM对应的 Unicode 码为 \ufeff,所以当我们使用 UTF-8编码方式生成 CSV 以后,再增加一步,把 BOM 写入到文件的第一个字符:

with open('person.csv', encoding='utf-8') as f:

content = f.read()

content_with_bom = '\ufeff' + content

with open('person.csv', 'w', encoding='utf-8') as f:

f.write(content_with_bom)

完整代码如下图所示:

29d6dc40d720674d0fdf6338660ed6e9.png

此时,新的 CSV 文件可以直接双击通过 Excel 打开,并且中文支持完全正常,如下图所示:

c9dc7f6959f9b885fff83810000a6eef.png

这样生成的 Excel 虽然在 Excel 上显示没有问题,但是如果你发给别人,别人使用 Python 自带的 csv 模块打开,就会发现 address这一列的列名不是 address而是 \ufeffaddress,如下图所示:

b84081e846bb4afa81cfaebedaf84f4e.png

这个 BOM字符虽然肉眼看不到,但是程序能够看到,这就会导致别人在读这个 CSV 文件的时候非常不方便。如果直接使用 address去读,还会报错:

0acda5321ddf1a0a1bef1118f3a2f54e.png

难道此时,需要先用普通方式读取 csv 文件,移除第一个 BOM 字符,然后再传给 CSV 模块吗?这未免太过麻烦。

好在 Python 只带了处理 BOM的编码方式 utf-8-sig,无论是写文件还是读文件,只要使用这个编码方式,Python 在写文件的时候会自动加上 BOM,在读文件的时候会自动删除 BOM。

所以生成 CSV 文件的代码如下:

import pandas as pd

datas = [

{

'name': '王小一',

'age': 29,

'address': '北京'

},

{

'name': '张小二',

'age': 18,

'address': '四❤川'

},

{

'name': '李小三',

'age': 60,

'address': '上海'

}

]

df = pd.DataFrame(datas)

df.to_csv('person.csv', index=False, encoding='utf-8-sig')

此时生成的 CSV 文件,可以直接双击使用 Excel 打开,中文正常显示。

如果要使用 Python 的 CSV 模块读取文件,也非常简单,如下图所示:

0c7666e30a9445855750ea24987da796.png

读取出来的内容直接使用,BOM 已经被 Python 自动移除了。

eba24b70e623d1157535aca1083d30c7.gif

未闻Code

PYTHON干货日更

长按扫码关注

49968533b56a143b60a81350eefd343b.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值