Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 600|回复: 0

python读写csv时中文乱码问题解决办法

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-6-15 16:34:25 | 显示全部楼层 |阅读模式

    https://www.cnblogs.com/shengulong/p/7097869.html

     

    参考1

    参考2

    参考3

    CSV是英文Comma Separate Values(逗号分隔值)的缩写,顾名思义,文档的内容是由 “,” 分隔的一列列的数据构成的,可以使用excel和文本编辑器等打开。CSV文档是一种编辑方便,可视化效果极佳的数据存储方式

    1、python读写、追加csv方法:

    ‘r’:只读(缺省。如果文件不存在,则抛出错误)
    ‘w’:只写(如果文件不存在,则自动创建文件)
    ‘a’:附加到文件末尾(如果文件不存在,则自动创建文件)
    ‘r+’:读写(如果文件不存在,则抛出错误)

    复制代码
    1 import csv,os
    2 if os.path.isfile('test.csv'):
    3     with open("test.csv","r") as csvfile:
    4         reader = csv.reader(csvfile)
    5         #这里不需要readlines
    6         for line in reader:
    7             print line
    复制代码
    复制代码
    import csv
    
    #python2可以用file替代open
    #不存在则会创建文件
    with open("test.csv","w") as csvfile: 
        writer = csv.writer(csvfile)
    
        #先写入columns_name
        writer.writerow(["index","a_name","b_name"])
        #写入多行用writerows
        writer.writerows([[0,1,3],[1,2,3],[2,3,4]])
    复制代码
    复制代码
    import csv
    
    #python2可以用file替代open
    #不存在则会创建文件
    with open("test.csv","a") as csvfile: 
        writer = csv.writer(csvfile)
    
        #先写入columns_name
        writer.writerow(["index","a_name","b_name"])
        #写入多行用writerows
        writer.writerows([[0,1,3],[1,2,3],[2,3,4]])
    复制代码

    2、excel打开csv文件,可以识别编码“GB2312”,但是不能识别“utf-8”,数据库里的字符串编码是utf-8.因此:

    当从csv读取数据(data)到数据库的时候,需要先把GB2312转换为unicode编码,然后再把unicode编码转换为utf-8编码:data.decode('GB2312').encode('utf-8')

    当从数据库读取数据(data)存到csv文件的时候,需要先把utf-8编码转换为unicode编码,然后再把unicode编码转换为GB2312编码:data.decode('utf-8').encode('GB2312')

    3、decode('utf-8')表示把utf-8编码转换为unicode编码;encode('utf-8')表示把unicode编码转换为utf-8编码

    4、Unicode只是一个符号集,它规定了符号的二进制代码,却没有规定二进制代码如何存储

    5、可以使用python的编码转换模块:codecs

     

    复制代码
     1 python unicode文件读写:
     2 
     3 #coding=gbk
     4 import codecs
     5 
     6 f = codecs.open('c:/intimate.txt','a','utf-8')#这里表示把intimate.txt文件从utf-8编码转换为unicode,就可以对其进行unicode读写了
     7 f.write(u'中文')#直接写入unicode
     8 s = '中文'
     9 f.write(s.decode('gbk'))#先把gbk的s解码成unicode然后写入文件
    10 f.close()
    11 
    12 f = codecs.open('c:/intimate.txt','r','utf-8')
    13 s = f.readlines()
    14 f.close()
    15 for line in s:
    16     print line.encode('gbk')
    复制代码

     

    6、python代码文件的编码

    py文件默认是ASCII编码,中文在显示时会做一个ASCII到系统默认编码的转换,这时就会出错:SyntaxError: Non-ASCII character。需要在代码文件的第一行或第二行添加编码指示:

    1. # coding=utf-8 ##以utf-8编码储存中文字符
    2. print ‘中文’像上面那样直接输入的字符串是按照代码文件的编码来处理的,如果用unicode编码,有以下2种方式:
      1. s1  = u’中文’ #u表示用unicode编码方式储存信息
      2. s2 = unicode(‘中文’,’gbk’)

    unicode是一个内置函数,第二个参数指示源字符串的编码格式。

    decode是任何字符串具有的方法,将字符串转换成unicode格式,参数指示源字符串的编码格式。

    encode也是任何字符串具有的方法,将字符串转换成参数指定的格式。

    python字符串的编码

    用 u’汉字’ 构造出来的是unicode类型,不用的话构造出来是str类型

    str的编码是与系统环境相关的,一般就是sys.getfilesystemencoding()得到的值

    所以从unicode转str,要用encode方法

    从str转unicode,所以要用decode

    例如:

    # coding=utf-8   #默认编码格式为utf-8
    
    s = u'中文' #unicode编码的文字
    print s.encode('utf-8')   #转换成utf-8格式输出 
    print s #效果与上面相同,似乎默认直接转换为指定编码

    我的总结:

    u=u'unicode编码文字'
    g=u.encode('gbk') #转换为gbk格式
    print g #此时为乱码,因为当前环境为utf-8,gbk编码文字为乱码
    str=g.decode('gbk').encode('utf-8')   #以gbk编码格式读取g(因为他就是gbk编码的)并转换为utf-8格式输出
    print str #正常显示中文

    安全的方法:

    s.decode('gbk','ignore').encode('utf-8′) #以gbk编码读取(当然是读取gbk编码格式的文字了)并忽略错误的编码,转换成utf-8编码输出

    因为decode的函数原型是decode([encoding], [errors='strict']),可以用第二个参数控制错误处理的策略,默认的参数就是strict,代表遇到非法字符时抛出异常;

    如果设置为ignore,则会忽略非法字符;
    如果设置为replace,则会用?取代非法字符;
    如果设置为xmlcharrefreplace,则使用XML的字符引用。

    unicode(str,‘gb2312‘)与str.decode(‘gb2312‘)是一样的,都是将gb2312编码的str转为unicode编码

    7、代码文件编码:

    我们在.py文件开头写的:#-*- coding:utf-8 -*- 声称了代码文件编码为utf-8,这时候,文件里面书写字符串都是utf-8编码的

    8、获得系统编码:

    import sys
    print sys.getdefaultencoding()

     9、sys.setdefaultencoding('utf-8')的作用是告诉系统自动解码,也就是自动完成utf-8到unicode编码的转换

    复制代码
    #! /usr/bin/env python 
    # -*- coding: utf-8 -*- 
    
    import sys 
    reload(sys) # Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入 
    sys.setdefaultencoding('utf-8') 

    str = '中文' #这是utf-8编码的字符串
    str.encode('gb18030') #转换为gb18030编码,因为已经自动解码,所以不用写成这种样式:str.decode('utf-8').encode('gb18030')
    复制代码

     10、字符编码判断:

    法一:
    isinstance(s, str) 用来判断是否为一般字符串
    isinstance(s, unicode) 用来判断是否为unicode

    if type(str).__name__!="unicode":
    str=unicode(str,"utf-8")
    else:
    pass
    法二:
    Python chardet 字符编码判断
    使用 chardet 可以很方便的实现字符串/文件的编码检测。尤其是中文网页,有的页面使用GBK/GB2312,有的使用UTF8,如果你需要去爬一些页面,知道网页编码很重要的,虽然HTML页面有charset标签,但是有些时候是不对的。那么chardet就能帮我们大忙了。 

    chardet实例
    >>> import urllib
    >>> rawdata = urllib.urlopen('http://www.google.cn/').read()
    >>> import chardet
    >>> chardet.detect(rawdata)
    {'confidence': 0.98999999999999999, 'encoding': 'GB2312'}
    >>>chardet可以直接用detect函数来检测所给字符的编码。函数返回值为字典,有2个元数,一个是检测的可信度,另外一个就是检测到的编码。 

    chardet 安装
    pip install chardet

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-23 03:34 , Processed in 0.067237 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表