ccsv 编码转换_中文的csv文件的编码改成utf-8的方法

当读取包含中文的CSV文件时,可能出现编码问题。本文介绍了如何确定和转换文件编码,以解决UnicodeDecodeError。提供了一段Python代码,用于从gbk、gb2312、gb18030、big5等常见编码转换为UTF-8,确保Pandas能正确读取CSV文件。
摘要由CSDN通过智能技术生成

直奔主题:把包含中文的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相同。)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用C语言中的libcsv库来实现将Excel文件转换csv文件编码转换。 以下是基本的步骤: 1. 使用Excel软件将文件另存为CSV格式。 2. 使用libcsv库中的csv_open函数打开CSV文件。 3. 使用csv_read函数读取CSV文件中的数据行。 4. 使用libiconv库中的iconv函数将读取的每行数据进行编码转换。 5. 使用csv_write函数将转换后的数据写入新的csv文件。 下面是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iconv.h> #include <csv.h> int main(int argc, char *argv[]) { char *input_file = "input.csv"; char *output_file = "output.csv"; char *input_encoding = "gb2312"; char *output_encoding = "utf-8"; csv_t *csv_input = csv_open(input_file, "r", ',', '"'); csv_t *csv_output = csv_open(output_file, "w", ',', '"'); char **row; int row_num = 0; while ((row = csv_read(csv_input)) != NULL) { int col_num = csv_get_field_num(csv_input); char **new_row = (char **)malloc(col_num * sizeof(char *)); int i; for (i = 0; i < col_num; i++) { char *old_value = row[i]; size_t old_len = strlen(old_value); size_t new_len = old_len * 4; char *new_value = (char *)malloc(new_len); memset(new_value, 0, new_len); iconv_t cd = iconv_open(output_encoding, input_encoding); char *inbuf = old_value; char *outbuf = new_value; size_t inbytesleft = old_len; size_t outbytesleft = new_len; iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft); iconv_close(cd); new_row[i] = new_value; } csv_write(csv_output, new_row); csv_free_row(new_row); csv_free_row(row); row_num++; } csv_close(csv_input); csv_close(csv_output); return 0; } ``` 这段代码仅供参考,具体实现可能需要根据您的具体需求进行修改。同时,需要注意一些细节问题,例如异常处理、内存管理等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值