• 中文的csv文件的编码改成utf-8的方法


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

  • 相关阅读:
    LINUX云计算40个相关问题
    sql
    补肾
    少吃食品
    抗癌食品
    爱情感言
    分布式事务的处理
    前端
    JAVA->Enum
    Sleuth+Zipkin+Log
  • 原文地址:https://www.cnblogs.com/aaronhoo/p/9676678.html
Copyright © 2020-2023  润新知