Python 转码问题的解决方法 异常: UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 30664-30665: illegal multibyte sequence

如,若要将某个String 对象s 从gbk 内码转换为UTF-8,可以如下 操作

s.decode(‘gbk‘).encode(‘utf-8′)

可是,在实际开发中,我发现,这种办法经常会出现异常: UnicodeDecodeError: ‘gbk‘ codec cant decode bytes in position 30664-30665: illegal multibyte sequence

这 是因为遇到了非法字符——尤其是在某些用C/C++编写的程序中,全角 空格往往有多种不同的实现方式,比如\xa3\xa0,或者\xa4\x57,这 些 字符,看起来都是全角空格,但它们并不是“合法”的全角空格(真正 的全角空格是\xa1\xa1),因此在转码的过程中出现了异常。

这样的问题很让人头疼,因为只要字符串中出现了一个非法字符,整个字 符串——有时候,就是整篇文章——就都无法转码。

解决办法:

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

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

python 文档 decode( [encoding[, errors]]) Decodes the string using the codec registered for encoding. encoding defaults to the default string encoding. errors may be given to set a different error handling scheme. The default is ’strict’, meaning that encoding errors raise UnicodeError. Other possible values are ‘ignore’, ‘replace’ and any other name registered via codecs.register_error, see section 4.8.1.

语言教程python 函数参数的传递(参数带星号的说明)

python中函数参数的传递是通过赋值来传递的。函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析
先看第一个问题,在python中函数参数的定义主要有四种方式:
1.F(arg1,arg2,…)
这 是最常见的定义方式,一个函数可以定义任意个参数,每个参数间用逗号分割,用这种方式定义的函数在调用的的时候也必须在函数名后的小括号里提供个数相等的 值(实际参数),而且顺序必须相同,也就是说在这种调用方式中,形参和实参的个数必须一致,而且必须一一对应,也就是说第一个形参对应这第一个实参。例 如:
def a(x,y):
print x,y (全文…)

Python常用日期函数日期增减日期格式化输出format 字符串转换时间戳

我们先导入必须用到的一个module
>>> import time
设置一个时间的格式,下面会用到
>>>ISOTIMEFORMAT=’%Y-%m-%d %X’
看一下当前的时间,和其他很多语言相似这是从epoch(1970 年 1 月 1 日 00:00:00)开始到当前的秒数。
>>> time.time()
1180759620.859
上面的看不懂,换个格式来看看
>>> time.localtime()
(2007, 6, 2, 12, 47, 7, 5, 153, 0)
localtime返回tuple格式的时间,有一个和它类似的函数叫gmtime(),2个函数的差别是时区,gmtime()返回的是0时区的值,localtime返回的是当前时区的值。
>>> time.strftime( ISOTIMEFORMAT, time.localtime() )
‘2007-06-02 12:54:29′
用上我们的时间格式定义了,使用strftime对时间做一个转换,如果取现在的时间,time.localtime() 可以不用。
(全文…)

最新(原创) Intel面试题

去英特尔面试,被无声无息了。据说是headcount取消了,呜呜。
发出上机题,供广大程序兄弟参考。
题目(上机,一个小时时间):
输入一串数字,如:3 3 1 2 3 4 5 6 7 8 9
第一个数字表示行数,第二个表示列数,后面的表示矩阵里的值。生成的矩阵如下:
1 2 3
4 5 6
7 8 9
然后按顺时针方向螺旋输出,在上面的例子中,顺序是:1 2 3 6 9 8 7 4 5
要求输入输出如下:
Input:
3 3 1 2 3 4 5 6 7 8 9
1 3 1 2 3
Output:
1 2 3 6 9 8 7 4 5
1 2 3
说实话比较简单,也没规定用什么语言,我用python写的,45分钟的样子:

import os, sys

def buildMatrix (inputList):
# print rowNum, colNum
inputListTrim = inputList[2:]
# print inputListTrim
inputMatrix = []
tmpCount = 0

for tmpRowNum in range(rowNum):
tmpList = []
for tmpColNum in range(colNum):
# print tmpRowNum, tmpColNum, tmpCount
tmpList.append(inputListTrim[tmpCount])
tmpCount += 1
inputMatrix.append(tmpList)
return inputMatrix

def outputMatrix (inputMatrix):
inputMatrixBuf = inputMatrix
outputList = []
while (len(inputMatrixBuf) > 0):
tmpList = []
tmpList = [tmpStr for tmpStr in inputMatrixBuf[0]]
inputMatrixBuf = inputMatrixBuf[1:]
outputList += tmpList

if (len(inputMatrixBuf) == 0):
break
tmpList = []
for tmpCount in range(len(inputMatrixBuf)):
tmpList.append(inputMatrixBuf[tmpCount].pop())
outputList += tmpList

if (len(inputMatrixBuf) == 0):
break
tmpList = []
tmpListBuf = []
tmpListBuf = reversed(inputMatrixBuf[-1])
tmpList = [tmpStr for tmpStr in tmpListBuf]
inputMatrixBuf = inputMatrixBuf[:-1]
outputList += tmpList

if (len(inputMatrixBuf) == 0):
break
tmpList = []
for tmpCount in range((len(inputMatrixBuf) – 1), -1, -1):
tmpList.append(inputMatrixBuf[tmpCount][0])
inputMatrixBuf[tmpCount] = inputMatrixBuf[tmpCount][1:]
outputList += tmpList

# print inputMatrixBuf
return outputList

inputListStr = raw_input(“Input:\n”)
inputList = inputListStr.split()
#print inputList

if (len(inputList) < 2):
sys.exit(“Could not got row & col numbers!”)

rowNum = int(inputList[0])
colNum = int(inputList[1])

if ((rowNum * colNum) != (len(inputList) – 2)):
sys.exit(“Wrong Arguments Number!”)

inputMatrix = buildMatrix(inputList)
#print inputMatrix
outputList = outputMatrix(inputMatrix)

print “output:”
print ” “.join(outputList)

python 冒泡排序的实现

冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放 后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程,仍从第一对数开始比较(因 为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到最大数前的一对相邻数,将小数放前,大数放后, 第二趟结束,在倒数第二个数中得到一个新的最大数。如此下去,直至最终完成排序。

由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。

用二重循环实现,外循环变量设为i,内循环变量设为j。外循环重复9次,内循环依次重复9,8,…,1次。每次进行比较的两个元素都是与内 循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,…,9,对于每一个i, j的值依次为1,2,…10-i。

array = [1, 2, 5, 7, 6, 9, 4]
for i in range(len(array) – 1, 1, -1):
for j in range(0, i):
if array[j] > array[j + 1]:
array[j], array[j + 1] = array[j + 1], array[j]
print (array)

(全文…)

python 如何得到一个文本文件的大小

python 如何得到一个文本文件的大小

os.path.getsize (全文…)

对 Python中的整数对象的理解

Object对象

(1)

PyObject是python中所有对象的基石。

typedef struct _object

{

int ob_refcnt ;  //引用计数

struct _typeobject *ob_type ; //指向对象的类型对象

}PyObject ;

我们用PyObject可以表示整数对象这类定长对象,但是像字符串这类非定长对象,就不能用PyOject结构体。于是我们引入了表示这类对象的 结构体—PyVarObject

typetdef struct

{

int ob_refcnt ;

struct _typeobject * ob_type ;

int ob_size ;

}PyVarObject ;

ob_size 表示变长对象中容纳的元素个数。

(全文…)

给 tornado加上session支持

阅读本文需要具有使用python编程的能力以及Web编程的经验,起码应该知道python是什么,Session是什么。初学者慎入,某些描述 语焉不详,小心误入歧途,欢迎高手踊跃拍砖。本文代码仅仅作为示例使用,用于说明在tornado中实现session的过程以及方法,未经过任何编译或 者运行,请勿直接copy到项目中使用,本人不对此行为造成的后果负任何责任。(此文实现内容源于商业项目,恕未能直接提供源码)

———————————————————-

tornado没有提供默认的会话,而很多敏感信息又没法用cookie存,tornado提供的secure_cookie只是解决了防止 cookie篡改而没法阻止数据被解密为明文,所以我就给tornado写了一个session的包来解决这个问题。嗯,我们来看看是如何从底层一砖一瓦 的来实现Session的功能。

根据项目的需要我采用Memcached作为Session的backend,当然你愿意用Mysql 或者是其他什么能存储数据的东西都行,比如文本文件或者mongodb,选择很多,所以我们将Session需要持久化的操作独立出来成为一个可以替换的 backend模块,我们可以根据配置使用不同的backend,由于python得ducktyping特性,要实现起来相当的简单,我们只需要提供包 含如下三个方法签名的类就行了 (全文…)

在正式使用django之前,先看看这些资料给自己打气吧~

如果你上djangoproject.com你会发现对Django的如下解释:
“Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.”
让我们展开来看

Django是高级Web框架
高级Web框 架免去了构建动态Web站点的痛苦,它把常见的Web开发的问题抽象出来并提供了对频繁的编程任务的捷径
一个优秀的Web框架有下列关注点:
提 供URL映射
很容易显示,验证和重显示HTML表单
对用户提交的东西转换成容易操控的数据结构
通过模板系统分离内容和显 示
方便同持久化层集成
更高的抽象,提升生产率
去除你的程序瑕疵
Django具有所有这些特点
Django 是一个用Python写的,Python是一门优雅,简明,高级的编程语言
如果你用Django开发站点,你将用Django库写Python 代码 (全文…)

Windows 下Python3.1 连接数据库的办法

最近刚刚学python,学的也差不多了,想试试数据库编程,不过由于版本的问题,原有的数据库连接模块很多都不兼容python3。 在Google上淘了半天,终于找到了ceODBC,方法很简单,直接在SourceForge下载相应版本安装,使 用的时候import ceODBC即可。

以下是几行测试代码:

import ceODBC

con=ceODBC.connect(‘dsn=mysql1;uid=xuyun;pwd=123456′)

curser=con.curser()

curser.execute(“SELECT * FROM course”)

curser.fetchone()

完美运行。

说到这里,可能有人要问为什么不用pythonwin呢,我实在抱歉得很,目前pythonwin至少在我的机子上是用不了,只要执 行,ODBC.ODBC(”)即死了!可能是我机子的原因?这个我对数据库的底层问题不太了解,高手有知道的可以告诉我一声。 (全文…)