解决使用 excel 打开 csv 文件时出现乱码的问题

1. 问题描述

使用 excel 打开 csv 文件时出现乱码

2. 问题原因

excel 默认识别的是带 BOM 格式的 csv 文档,而打开纯 UTF-8 的文件时,没有 BOM 的头,也就是第一行,所以打开是乱码。(开头多了一串字符”\ufeff”)

3. 解决方法

将”utf-8” 格式转换为”utf-8 with BOM”,python 中这个带 BOM 格式的叫做 UTF-8-SIG,都是 UTF-8 带签名的意思。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import os
import sys
import codecs
import chardet


# from subFunc_tools import *

def list_folders_files(path):
"""
返回 "文件夹" 和 "文件" 名字
:param path: "文件夹"和"文件"所在的路径
:return: (list_folders, list_files)
:list_folders: 文件夹
:list_files: 文件
"""
list_folders = []
list_files = []
for file in os.listdir(path):
file_path = os.path.join(path, file)
if os.path.isdir(file_path):
list_folders.append(file)
else:
list_files.append(file)
return (list_folders, list_files)


def convert(file, in_enc="GBK", out_enc="UTF-8"):
"""
该程序用于将目录下的文件从指定格式转换到指定格式,默认的是GBK转到utf-8
:param file: 文件路径
:param in_enc: 输入文件格式
:param out_enc: 输出文件格式
:return:
"""
in_enc = in_enc.upper()
out_enc = out_enc.upper()
try:
print("convert [ " + file.split('\\')[-1] + " ].....From " + in_enc + " --> " + out_enc)
f = codecs.open(file, 'r', in_enc)
new_content = f.read()
codecs.open(file, 'w', out_enc).write(new_content)
# print (f.read())
except IOError as err:
print("I/O error: {0}".format(err))


# 将路径下面的所有文件,从原来的格式变为UTF-8的格式

if __name__ == "__main__":
path = r'G:\desktop\Convert-UTF8'

(list_folders, list_files) = list_folders_files(path)

print("Path: " + path)
for fileName in list_files:
filePath = path + '\\' + fileName
with open(filePath, "rb") as f:
data = f.read()
codeType = chardet.detect(data)['encoding']
convert(filePath, codeType, 'UTF-8-SIG')

4. 相关参考

代码参考于以下博客,自己做了相关调整:

https://www.cnblogs.com/monster-yher/p/13418600.html