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

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

摄影:产品经理厨师: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 打开,你会发现中文变成了乱码,如下图所示:

这是因为,当你执行代码 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 打开,中文就能正常显示了,如下图所示:


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

这个时候怎么办呢?

实际上当你双击打开 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)

完整代码如下图所示:


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

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

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

难道此时,需要先用普通方式读取 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 模块读取文件,也非常简单,如下图所示:

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

目录
相关文章
|
3天前
|
Python
用python3快速读取30G+的txt文件
这篇文章介绍了如何使用Python分块读取大文件(如30G+的txt文件),通过设置每次读取的块大小来处理大型文本文件,以减少内存消耗并提高处理效率。
28 14
|
3天前
|
数据安全/隐私保护 Python
用python对文件内容进行加密的2种方式
这篇文章介绍了使用Python对文件内容进行加密的两种方式:利用`cryptography`库的Fernet对称加密和使用`rsa`库进行RSA非对称加密。
21 6
|
3天前
|
Python
python简单分割文件的方法(python经典案例)
这篇文章介绍了两种使用Python进行文件分割的方法:通过读取指定字节数分割大文件成小文件,以及通过行数将文本文件分割成多个小文件。
13 1
|
10天前
|
数据挖掘 Python
🚀告别繁琐!Python I/O管理实战,文件读写效率飙升的秘密
在日常编程中,高效的文件I/O管理对提升程序性能至关重要。Python通过内置的`open`函数及丰富的库简化了文件读写操作。本文从基本的文件读写入手,介绍了使用`with`语句自动管理文件、批量读写以减少I/O次数、调整缓冲区大小、选择合适编码格式以及利用第三方库(如pandas和numpy)等技巧,帮助你显著提升文件处理效率,让编程工作更加高效便捷。
26 0
|
5天前
|
数据挖掘 数据处理 索引
python 读取数据存为csv
在Python中,读取数据并将其保存为CSV(逗号分隔值)文件是一种常见的操作,特别适用于数据分析和数据科学领域。这里将展示如何使用Python的内置库`csv`和流行的数据处理库`pandas`来完成这项任务。 ### 使用`csv`模块 如果你正在处理的是简单的文本数据或者需要更低层次的控制,可以使用Python的`csv`模块。以下是一个基本示例,演示如何将数据写入CSV文件: ```python import csv # 假设这是你要写入CSV的数据 rows = [ ["Name", "Age", "City"], ["Alice", 24, "New Yor
58 35
|
10天前
R Excel 文件
Excel 格式的文件主要是 xls 或 xlsx,这两种文件可以在 R 语言中导入 xlsx 库来实现直接的读取。
46 23
|
1天前
|
缓存 开发者 Python
Python指定行号读取文件的方法
这种方法的优势在于它的效率和简便性,特别是当需要从同一文件中读取多行时。`linecache`会缓存文件,减少了重复读取的开销。
10 4
|
3天前
|
Python
python3压缩和解压文件总结(python经典编程案例)
这篇文章总结了在Python 3中使用不同库对文件进行压缩和解压的方法,包括tar、7z、zip和gzip格式的操作示例。
13 4
|
1天前
|
存储 文件存储 Python
python如何把字节写到文件里4-2
python如何把字节写到文件里4-2
|
2天前
|
Python
Python批量复制指定名称文件的技巧
通过上述步骤和示例代码,你可以轻松实现批量复制特定名称文件的功能。这种技术不仅节省了时间,而且通过脚本自动化,提高了工作效率。
11 2