python读写csv时中⽂乱码问题解决办法
CSV是英⽂Comma Separate Values(逗号分隔值)的缩写,顾名思义,⽂档的内容是由 “,” 分隔的⼀列列的数据构成的,可以使⽤excel和⽂本编辑器等打开。CSV⽂档是⼀种编辑⽅便,可视化效果极佳的数据存储⽅式
1、python读写、追加csv⽅法:
‘r’:只读(缺省。如果⽂件不存在,则抛出错误)
‘w’:只写(如果⽂件不存在,则⾃动创建⽂件)
‘a’:附加到⽂件末尾(如果⽂件不存在,则⾃动创建⽂件)
‘r+’:读写(如果⽂件不存在,则抛出错误)
1import csv,os
2if os.path.isfile('test.csv'):
3    with open("test.csv","r") as csvfile:
4        reader = ader(csvfile)
5#这⾥不需要readlines
6for line in reader:
7print 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编码:python怎么读csv数据
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
4import codecs
5
6 f = codecs.open('c:/','a','utf-8')#这⾥表⽰把⽂件从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:/','r','utf-8')
13 s = f.readlines()
14 f.close()
15for line in s:
de('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的编码是与系统环境相关的,⼀般就是filesystemencoding()得到的值
所以从unicode转str,要⽤encode⽅法
从str转unicode,所以要⽤decode
例如:
# coding=utf-8  #默认编码格式为utf-8
s = u'中⽂' #unicode编码的⽂字
de('utf-8')  #转换成utf-8格式输出
print s #效果与上⾯相同,似乎默认直接转换为指定编码
我的总结:
u=u'unicode编码⽂字'
de('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
defaultencoding()
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编码的字符串
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('le/').read()
>>> import chardet
>>> chardet.detect(rawdata)
{'confidence': 0.98999999999999999, 'encoding': 'GB2312'}
>>>chardet可以直接⽤detect函数来检测所给字符的编码。函数返回值为字典,有2个元数,⼀个是检测的可信度,另外⼀个就是检测到的编码。
chardet 安装
pip install chardet

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。