背景:
在linux下开发的python\C++读写.csv的脚本可以正常运行,给产品到windows下就各种问题。。。
Python部分
问题1:gbk codec can't decode byte Oxae in position 74: illegalmultibyte sequence
原因:
此种错误,可能是要处理的字符串本身不是gbk编码,但是在windows中却以gbk编码去解码 。比如,字符串本身是utf-8的,但是却用gbk去解码utf-8的字符串,所以结果出错。
解决方法:
在读文件前,先读取文件前4位(编码位),确认好encoding的编码格式,在以该种编码格式打开文件即可
def check_charset(file_path):
with open(file_path, "rb") as f:
data = f.read(4)
charset = chardet.detect(data)["encoding"]
return charset
file_dir = "/data/test.csv"
with open(file_dir, "r",
encoding=check_charset(file_dir)) as accuracy_file:
pass
问题2:.csv文件在linux和Mac中正常,在windows下中文乱码
原因:
BOM(byte-order mark,字节顺序标记):
Unix系统中都是使用的utf-8编码,所以在Mac用open打开utf-8编码的csv文件并不用加encoding=“utf-8”。Windows系统的中文环境很多软件默认字符编码为gbk,比如如果用上面的语句打开csv文件则会报错。
具体原因比较麻烦。。。要下班回去了,有机会再解释。。。
解决方法:
有两种方法,最好一起用
一、手动写BOM在要写的文件前面
def add_bom_for_windows(file):
with open(file, "wb") as f:
f.write(codecs.BOM_UTF8)
二、加encoding="utf-8-sig"
add_bom_for_windows(out_dir4)
with open(out_dir4, "a", encoding="utf-8-sig") as o:
for line in lines:
o.write(line)
C++部分
在文件头同样加入BOM字段即可
char szUTF_8BOM[4] = {char(0xEF), char(0xBB), char(0xBF), char(0)};
std::ofstream f(not_select_as_true_file, ios::out);
f << szUTF_8BOM;
参考:
「Python数据分析」CSV读取与写入的常见问题(空行、BOM、r/w/a模式、指针)_Parzival_的博客-CSDN博客Python写入的CSV在Windows中乱码_ITROOKIEIS的博客-CSDN博客「Python数据分析」CSV读取与写入的常见问题(空行、BOM、r/w/a模式、指针)_Parzival_的博客-CSDN博客C++ 输出文字到csv文件 乱码问题_小飞1116的博客-CSDN博客