Python文件写入编码问题

今天,用Python写文件,发现中国人真不容易,任何编程问题都需要比老外多学一套应对编码的方法。JSP写完了吗?中文编码问题考虑一下;servlet中的url,转发的文本,都有可能与什么gb2312,isoxxxx,utf-8,unicode,ascii扯上关系。以至于,我们每每遇到运行异常,都会“一朝被蛇咬十年怕井绳”般思考“是不是又是编码导致的”。

在python里,编码问题依然是个恶心的问题。之前在VS for Python的IDE环境下,已经饱尝中文编码之苦,貌似VS for Python的源文件不支持除ascii以外的其他编码格式,如果我强行另存,直接导致解释器运行异常。直到转到PyDev for Eclipse才算解决。

今天,用Python写文件,里面是从网上自动爬取的数据,直接报错“UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position 0-1: ordinal not in range(128)”。

为什么会报错“UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position 0-1: ordinal not in range(128)”?本文就来研究一下这个问题。

字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。

decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312‘),表示将gb2312编码的字符串str1转换成unicode编码。

encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘gb2312‘),表示将unicode编码的字符串str2转换成gb2312编码。

因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码

代码中字符串的默认编码与代码文件本身的编码一致。

如:s=‘中文‘

如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。这种情况下,要进行编码转换,都需要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默认编码创建的代码文件。

如果字符串是这样定义:s=u‘中文‘

则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可。

如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断:

isinstance(s, unicode)  #用来判断是否为unicode

用非unicode编码形式的str来encode会报错

如何获得系统的默认编码?

#!/usr/bin/env python
#coding=utf-8
import sys
print sys.getdefaultencoding()

该段程序在英文WindowsXP上输出为:ascii

在某些IDE中,字符串的输出总是出现乱码,甚至错误,其实是由于IDE的结果输出控制台自身不能显示字符串的编码,而不是程序本身的问题。

如在UliPad中运行如下代码:

s=u"中文"

print s

会提示:UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position 0-1: ordinal not in range(128)。这是因为UliPad在英文WindowsXP上的控制台信息输出窗口是按照ascii编码输出的(英文系统的默认编码是ascii),而上面代码中的字符串是Unicode编码的,所以输出时产生了错误。

将最后一句改为:print s.encode(‘gb2312‘)

则能正确输出“中文”两个字。

若最后一句改为:print s.encode(‘utf8‘)

则输出:\xe4\xb8\xad\xe6\x96\x87,这是控制台信息输出窗口按照ascii编码输出utf8编码的字符串的结果。

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

使用str.__class__可以查看str的编码形式

原理说了半天,最后来个包治百病的吧:)

复制代码 代码如下:

#!/usr/bin/env python 
#coding=utf-8 
s="中文" 

if isinstance(s, unicode): 
#s=u"中文" 
print s.encode(‘gb2312‘) 
else: 
#s="中文" 
print s.decode(‘utf-8‘).encode(‘gb2312‘)

-----------------------------------------------------------------------------------------------------------------

我在所有要写入的字符串后面都加入.encode(‘utf8‘)

数字可以直接用str()

当然源文件头是

#coding:utf-8
#import sys   
#reload(sys) #
#sys.setdefaultencoding(‘utf-8‘)
时间: 2024-10-10 01:58:11

Python文件写入编码问题的相关文章

python 文件写入

def write_file(): """ 文件写入""" file_name = "wri2te_test.txt" # 以写入的方式打开 f = open(file_name,'w') # 写入内容 f.write('hello') # 换行符 f.write('\n') # 写入内容 f.write('world') # 关闭文件 f.close() def write_mult_line(): ""

python文件写入后读出空字符、读出乱码的解决方案

第一步 排除文件打开方式错误: r只读,r+读写不创建,w新建写,w+新建写创建,a附加,b二进制文件 以w,w+的方式打开文件,会将文件内容清零 (以w方式打开,不能读出.w+可读写) 以r,r+的方式打开文件,不会清零 (r+:可读可写,若文件不存在,报错:w+: 可读可写,若文件不存在,创建) 以a,a+的方式打开文件,附加打开 (a:附加写方式打开:a+: 附加读写方式打开) 以 'U' 标志打开文件, 所有的行分割符通过 Python 的输入方法(例#如 read*() ),返回时都会

Python文件读取编码错误问题解决之(PyCharm开发工具默认设置的坑。。。)

刚接触Python学习,正准备做个爬虫的例子,谁知道代码一开始就遇到了一个大坑,狂汗啊. 问题是这样的:我通过代码爬取了博客园首页的HTML代码并存入到blog.txt文件当中,然后准备读取出来之后进行分析,可就在读取文件的这一步出现了问题. 执行读取代码的时候程序总是会抛一个叫 “UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 117274: illegal multibyte sequence

python 文件写入与储存

python使用open()这个函数来打开文件返回对象: open 第二参数 "r" 以只读方式打开文件 "w" 以写入方法打开文件,会覆盖已储存的内容 "x" 如果存在该文件,打开会引发异常 "a" 以写入模式打开文件,如果存在该文件,会在末尾添加 "b" 以二进制模式打开文件 "t" 以文本模式打开文件(默认) "+" 可读写模式(可添加到其他模式中去) &quo

第六章、Python文件操作

第六章.Python文件操作 Python可以对文件进行查看.创建等功能,可以对文件内容进行添加.修改.删除,且所使用到的函数在Python3.5.x为open,在Python2.7.x同时支持file和open,但是在3.5.x系列移除了file函数. 一.Python文件打开方式 文件句柄 = open('文件路径','打开模式') Nginx_Conf = open('nginx.conf','r',encoding='utf-8') Ps:文件句柄相当于于变量名,文件路径可以写为绝对路径

python与字符集编码

讲的比较明白的博客:http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 以上面博文的汉为例子,汉字的GBK编码是baba, UNICODE码字是6C49 UTF16-LE编码是496C,UTF-8编码是e6b189 python文件的编码制定为GBK line="汉" input=line.decode('gbk','ignore').encode("UTF-8"); rint repr(input

Python自动化开发课堂笔记【Day03】 - Python基础(字符编码使用,文件处理,函数)

字符编码使用 1. 文本编辑器如何存取文件 文本编辑器相当一个运行在内存中的进程,所以文件内容在编辑未存储时都是在内存中的,尚未存储在硬盘之中,在没有保存之前,所编辑的任何文本都只是一堆字符,没有任何逻辑上的意义,当存储文件的时候需要以一定的编码格式存储于硬盘之中,当进行文件读取的时候也需要以同样的编码格式进行读取到内存之中进行操作,如果存储文件的编码和读取文件的编码不一致则会引起读取过程中的乱码导致文件操作失败. P.S. --> Python解释器执行py文件的原理. Step1. Pyth

Python文件使用“wb”方式打开,写入内容

Python文件使用“wb”方式打开,写入字符串会报错,因为这种打开方式为:以二进制格式打开一个文件只用于写入.如果该文件已存在则将其覆盖.如果该文件不存在,创建新文件. 所以写入的字符类型需为二进制格式,如:f.write("hello".encode('ascii')) 写入的编码范围不为128以内,就不能使用ascii了,如:fh.write("汉字".encode('UTF-8'))

Python文件操作:文件的打开关闭读取写入

Python文件操作:文件的打开关闭读取写入 一.文件的打开关闭 Python能以文本和二进制两种方式处理文件,本文主要讨论在Python3中文本文件的操作. 文件操作都分为以下几个步骤: 1.打开文件. 2.操作文件:读/写. 3.关闭文件. 操作系统中的文件默认处于存储状态,读写文件时需要请求操作系统打开一个要在当前程序操作的对象,打开不存在的文件可以创建文件.open()方法通过接收"文件路径"以及“文件打开模式”等参数来打开一个文件,并且返回文件对象.打开后的文件只能在当前程序