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

https://stackoverflow.com/questions/191359/how-to-convert-a-file-to-utf-8-in-python

啰嗦几句:

在用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:

import pandas 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编码格式,能够确保成功修改文件的编码格式。其他方法,例如 Python使用三种方法批量修改记事本文件编码格式 只是简单的str.decode('gbk').encode('utf-8')再写回到文件,或者 这种 都是不行的,依旧会报错。

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

import codecs
def handleEncoding(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=4096
with codecs.open(original_file,'r',source_encoding) as f:
with codecs.open(newfile,'w','utf-8') as f2:
while True:
content=f.read(block_size)
if not content:
break
f2.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文件的编码改成utf-8的方法的更多相关文章

  1. 如何改变CSV文件的编码

    通常我.csv文件的编码都不是我们想要的,比如我要把他保存为Utf-8格式的,好让我可以导入数据库,不乱码 工具/原料电脑,.csv文件方法/步骤1首先,将.csv文件保存一下.然后鼠标右击打开方式记 ...

  2. 将Ubuntu主文件夹里的中文文件夹名称改成英文

    方法一: 首先修改现有主文件夹下各文件夹名称: Desktop. Documents. Download. Music. Pictures. Public. Templates. Videos …… ...

  3. eclipse 编码改成utf-8

    Eclipse的编码格式是系统默认 修改为utf-8,点击Apply and Close 然后项目的编码格式会统一默认utf-8 当然也可以选择other,改成GBK.

  4. C#读取csv文件使用字符串拼接成XML

    phone.csv zhangsan1, zhangsan2, zhangsan3, static void Main(string[] args) { //XML //XML就是一个文件,用来存储数 ...

  5. UG如何把语言改成中文,UG如何把界面语言改成中文

    1 高级系统设置,高级,新建一个用户变量(变量名为lang,变量值为chs)   2 高级系统设置,高级,环境变量,系统变量中,查看变量名为UGII_LANG的值是否为simpl_chinese,如果 ...

  6. 【SQL Server数据迁移】把csv文件中的数据导入SQL Server的方法

    [sql] view plaincopy --1.修改系统参数 --修改高级参数 sp_configure 'show advanced options',1 go --允许即席分布式查询 sp_co ...

  7. mysql导入导出数据中文乱码解决方法小结(1、navicat导入问题已解决,创建连接后修改连接属性,选择高级->将使用Mysql字符集复选框去掉,下拉框选择GBK->导入sql文件OK;2、phpmyadmin显示乱码的问题也解决,两步:1.将sql文件以utf8的字符集编码另存,2.将文件中sql语句中的字段字符集编码改成utf8,导入OK)

    当向 MySQL 数据库插入一条带有中文的数据形如 insert into employee values(null,'张三','female','1995-10-08','2015-11-12',' ...

  8. 将eclipse的编码改成UTF-8,默认是GBK

    第一步.在菜单栏选择“window“----preference----General-----Workspace   选中Workspace   在右边窗口中找到Text file encoding ...

  9. 将 sql 数据库 编码 改成 Chinese_PRC_CS_AS

    use master go ) drop procedure [dbo].[p_killspid] GO create proc p_killspid ) --要关闭进程的数据库名 as ) ) de ...

随机推荐

  1. vue 比 js的强大

    //js写留言板 <!DOCTYPE html><html lang="en"><head> <meta charset="UT ...

  2. win10 手动安装mysql-8.0.11-winx64.zip

    0.彻底删除win10上安装的mysql(转载 : https://www.cnblogs.com/jpfss/p/6652701.html) 1.去官网下载mysql-8.0.11-winx64.z ...

  3. eclipse手动添加SVN插件

    最近使用eclipse时,用help下自动下载更新svn总是出错,网上找到手动安装方法,记录下一种可行的 1.手动下载svn插件(百度SVNsite-1.8.18) 2.将下载好的SVNsite-1. ...

  4. ASP.NET Core3.x 基础—注册服务(2)

    这篇文章介绍在ASP.NET Core中注册一下自己的服务. 首先创建一个Services文件夹.在文件夹里面创建一个接口 IClock,以及两个类ChinaClock.UtcClock.这两个类分别 ...

  5. socket编程之并发回射服务器

    使用到的函数: // 子进程返回0,父进程返回子进程ID,出错返回-1 pid_t fork(void); pid_t wait(int *wstatus); // 最常用的option是WNOHAN ...

  6. D. Kefa and Dishes(状压)

    永久打开的传送门 \(这次总算没有写砸........\) \(设f[i][j]为上一次吃的i物品状态为j的最大收益\) \(那么我们就暴力枚举所有状态i,然后在当前状态找出一个没吃的食物j,再去找一 ...

  7. Spring杂谈 | 什么是ObjectFactory?什么是ObjectProvider?

    在Spring的学习过程中,总是学的越多,不懂的越多.本来只是想将ApplicationContext的相关内容全部梳理一遍,结果发现涉及的东西越来越多,比如上篇文章中的ResolvableType, ...

  8. 龙贝格算法 MATLAB实现

    龙贝格算法主要是不断递推和加速,直到满足精度要求 递推: 加速: 得到T表: MATLAB代码: function I = Romberg(f, a, b, epsilon) I = 0; h = b ...

  9. C#实现前向最大匹、字典树(分词、检索)

    场景:现在有一个错词库,维护的是错词和正确词对应关系.比如:错词“我门”对应的正确词“我们”.然后在用户输入的文字进行错词校验,需要判断输入的文字是否有错词,并找出错词以便提醒用户,并且可以显示出正确 ...

  10. HDU 2014 (水)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2014 题目大意:给你 n 个数,去掉 max 和 min ,求平均数 解题思路: 很水,边记录分数,边 ...