直奔主题:把包含中文的csv文件的编码改成utf-8的方法:

啰嗦几句:

在用pandas读取hive导出的csv文件时,经常会遇到类似UnicodeDecodeError: 'gbk' codec can't decode byte 0xa3 in position 12这样的问题,这种问题是因为导出的csv文件包含中文,且这些中文的编码不是gbk,直接用excel打开这些文件还会出现乱码,但用记事本打开这些csv则正常显示,然后用记事本另存为UTF-8之后,用excel打开也能够正常显示,并且用pandas读取时指明encoding='utf-8'也能正常读取了。如果读取批量的csv时,或者csv的行数达到数百万时,就不能通过记事本另存为来更改encoding了,那应该怎么做来保证pandas能正常读取这些csv呢?

1.读取时不加encoding参数,则默认使用gbk编码来读取数据源文件,即默认数据源文件的编码为gbk:

importpandas as pd

df=pd.read_csv(data_source_file)

2.如果源文件的中文不是gbk编码,则可能会报错:

UnicodeDecodeError: 'gbk' codec can't decode byte 0xa3 in position 12

那么可以试试utf-8编码:

df=pd.read_csv(data_source_file,encoding='utf-8')

如果仍然报错,提示utf-8也不行:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa3 in position 12

那么说明文件中的中文编码不是utf-8,这时我们就要确定源文件的中文到底使用哪一种编码。

3.常见的中文编码包括:utf-8,gbk,gb2312,gb18030,cp935,big5等,我们可以逐一试过去,确定之后再修改read_csv()的encoding参数值即可。

4.如果只需要读取一个csv文件,逐个试的方法是可行的,但是如果需要循环读取多个csv文件,而每个csv文件的编码都可能不一样,那么最好还是先把所有这些csv统一转为utf-8,再集中进行读取,转换文件的编码格式需要用到python自带的codecs模块(见 https://stackoverflow.com/questions/191359/how-to-convert-a-file-to-utf-8-in-python),它的作用等同于我们用记事本打开再另存为utf-8编码格式,能够确保成功修改文件的编码格式。其他方法,例如

5. 修改csv文件为utf-8的有效代码:

importcodecsdefhandleEncoding(original_file,newfile):#newfile=original_file[0:original_file.rfind(.)]+'_copy.csv'

f=open(original_file,'rb+')

content=f.read()#读取文件内容,content为bytes类型,而非string类型

source_encoding='utf-8'

#####确定encoding类型

try:

content.decode('utf-8').encode('utf-8')

source_encoding='utf-8'

except:try:

content.decode('gbk').encode('utf-8')

source_encoding='gbk'

except:try:

content.decode('gb2312').encode('utf-8')

source_encoding='gb2312'

except:try:

content.decode('gb18030').encode('utf-8')

source_encoding='gb18030'

except:try:

content.decode('big5').encode('utf-8')

source_encoding='gb18030'

except:

content.decode('cp936').encode('utf-8')

source_encoding='cp936'f.close()#####按照确定的encoding读取文件内容,并另存为utf-8编码:

block_size=4096with codecs.open(original_file,'r',source_encoding) as f:

with codecs.open(newfile,'w','utf-8') as f2:whileTrue:

content=f.read(block_size)if notcontent:breakf2.write(content)

把csv的中文转换为utf-8之后,则可以用

df=pd.read(csvfile,encoding='utf-8')

来读取。

6. 读取文件的时候,如果编码不对,会报decode error,需要在open(file,'r',encoding='source_file_encoding')中设置正确的encoding;

而写文件(例如逐行读取源文件,并把中文标点符号替换为英文标点,再另存为新文件)的时候,如果编码不对则会报encod error(需要在

open( file,'w',encoding='targe_file_encoding')

中设置encoding,且该encoding必须和数据的来源一致(若读取数据之后,做了encoding的转换,则写入的encoding必须与转换后的encoding相同。)

csv转为utf8编码_中文的csv文件的编码改成utf8的方法相关推荐

  1. linux ll以编码格式_在Linux中文件的编码及对文件进行编码转换

    如果你需要在Linux中操作windows下的文件,那么你可能会经常遇到文件编码转换的问题.Windows中默认的文件格式是GBK(gb2312),而Linux一般都是UTF-8.下面介绍一下,在Li ...

  2. 把windows系统的默认编码改成UTF-8

    对于开发人员来说windows的编码的确是神一般的存在,windows老版本语言编码实际上是ascii和gbk编码混用,因此经常乱码.现在UTF-8国际化流行的阶段,windows这么多年,不知道耽误 ...

  3. Win10怎么将中文登录用户文件夹名改为英文名 【实测成功】

    仅作为操作记录,大佬请跳过. 无需重装系统 背景: 博主使用keil对stm32单片机编程时,发现keil编译不通过,很难受: 经广泛查询,是因为win10的C盘中C--users(或用户)--中的自 ...

  4. mysql latin1 utf8差别_不同子系统采用不同MySQL编码LATIN1和UTF8的兼容

    程序处理 这是一个历史遗留系统, 旧的系统是C++开发的, 插入数据的时候, 没有统一MYSQL各个层次(服务器, 数据库, 表, 列)的编码, 这个情况基本上是MYSQL的默认安装导致的, 实际的数 ...

  5. python转换字符编码_转:Python常见字符编码及其之间的转换

    一.Python常见字符编码 字符编码的常用种类介绍 第一种:ASCII码 ASCII(American Standard Code for Information Interchange,美国信息交 ...

  6. JAVA CP936编码转utf8_对一个目录的文件从cp936转换成utf-8

    打开一个文件,确认能够无乱码打开 [xw@localhost work]$ vi NPOSP/src/sjl05.cpp 但是,这里打开的方式是以cp936的编码方式打开的. 编码的选择,记录在~/. ...

  7. python中使用中文字符,文件首行添加# -*- coding: utf-8 -*-后仍然报错(unicode error) ‘utf-8‘ codec can‘t decode byte 0xc4

    1. 添加 # -*- coding: utf-8 -*- 我们在python文件中敲上最简单的一行代码,print('你好'),然后在命令行运行文件,报错如下:SyntaxError: Non-UT ...

  8. 火狐浏览器设置url编码_关于不同浏览器对URL编码的分析(转)

    转自:http://wdp107.iteye.com/blog/608786 先来看看三个url: url1. http://hi.baidu.com/爱宝的妍 url2. http://hi.bai ...

  9. mysql 查询默认编码_查看及修改MYSQL默认编码

    MySQL的默认是Latin1,不支持中文,要支持中文需要把数据库的默认修改为gbk或者utf8. 1.需要以root用户身份登陆才可以查看数据库编码方式 (以root用户身份登陆的命令为:>s ...

最新文章

  1. python编的俄罗斯方块游戏下载_python写的俄罗斯方块游戏
  2. debian9宝塔面板安装php失败,宝塔面板安装php失败:提示No package 'libjpeg' found的解决办法...
  3. pku 2954 Triangle pku 1265 Area Pick定理的应用 + 叉积求多边形面积
  4. shell-单引号 ,双引号,反引号,括号详解
  5. bindService初步了解
  6. Sentinel-Dashboard 与 apollo 规则的相互同步
  7. CORBA GIOP消息格式学习
  8. Linux块设备IO子系统
  9. 电脑键盘练习_三款神器!超越键盘飞毛腿!
  10. linux 服务器间通信,Linux 下的进程间通信:套接字和信号 | Linux 中国
  11. Ubuntu14.04 install appium
  12. 互联网企业架构初期选择--初期技术选型
  13. Linux使用命令行工具管理用户和组
  14. 实战篇:Oracle分区表之在线重定义
  15. 不经历风雨怎么见彩虹
  16. tcp rst 情况
  17. Android 手机获取加速度传感器加速度数据并自定义采样频率
  18. 图片镜像翻转 Java
  19. 必备的7种公关能力(收藏)
  20. 从IO谈论编程的基础

热门文章

  1. 搭建个人网站没有公网IP地址可以吗?
  2. 猫咪藏在哪个房间python作业_猫咪生气躲进房间,众人找到后,猫咪一脸疑问:听说你们在找我...
  3. JAVA:实现RodCutting棒材切割问题算法(附完整源码)
  4. java念整数 你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。 如输入1234,则输出: yi er san si
  5. 寄居蟹与海葵是一对合作互助的共栖伙伴。海葵是寄居蟹最称职的门卫。它用有毒的触角去蜇那些敢来靠近它们的所有动物,保护寄居蟹。 而寄居蟹则背着行动困难的海葵,四出觅食,有福同享。但并不是所有寄居蟹和海
  6. 计算机上根号是哪一个,电脑上怎么哪个键是数学中的开根号啊
  7. WIN API编程的详细介绍
  8. SharePoint 内容编辑器部件介绍
  9. Google 三大论文之——MapReduce
  10. 【Arduino】Arduino UNO入门