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
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) except IOError as err: print("I/O error: {0}".format(err))
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