关于Python的reload()函数

雪夜之狼 2009-06-17 12:43:20
今日刚开始学习py,在弄到数据库的时候遇到了一些问题。
我的mysql中的各个字段均为utf8编码。在py中读取时会出现乱码。google了一下,看到一种方法,试用后解决了乱码问题。但是我对其中的一句有所不解

方法如下:
1.在py文件加上
# encoding=utf-8

2.在MySQLdb.connect()函数的最后加上
 charset='utf8'

3.在py代码中加上
import sys
reload(sys)
sys.setdefaultencoding('utf8')


我查了一下资料,那句reload(sys)似乎是动态重新加载sys模块,有的资料说在正式运行时不建议使用这个函数。
我去掉reload(sys)一句后,py解释器会报错说sys模块没有setdefaultencoding“属性”(py是这么说的...),使用help(sys)也只看得到setdefaultencoding这个方法。但是只要不去掉那一句就一切正常。我想知道这是为什么?
谢谢!
...全文
17968 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiuwulang 2011-10-24
  • 打赏
  • 举报
回复
reload会在模块当前命名空间内执行模块文件的新代码
文件中顶层赋值语句会使得变量名换成新值
重载会影响所有使用import读取了模块的客户端
重载只会对以后使用from的客户端造成影响。
yttyhf2006 2011-08-23
  • 打赏
  • 举报
回复
这楼主不厚道啊
分奴!
sodmilk 2010-01-06
  • 打赏
  • 举报
回复
Pytho 2.5 初始化后会删除sys.setdefaultencoding方法,需要重新载入
可以看一下:http://bbs.chinaunix.net/archiver/tid-1163613.html
smallfish_xy 2009-07-07
  • 打赏
  • 举报
回复
第二个set charset跟系统不相关,是制定mysql链接时候的编码

保持文本编码,脚本编码以及数据库编码一直
wenking2006 2009-07-06
  • 打赏
  • 举报
回复
估计是编码问题吧
雪夜之狼 2009-07-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zp520lly 的回复:]
这个setdefaultencoding是在系统启动的时候就设置了,就是你在控制台下输入python出现>>> 的时候系统会自动的读取一个
文件,所以当你在使用中的python时就必须重新reload,如果不想用那一句的话,可以在/usr/lib/python2.4/ 下建立一个名为 sitecustomize.py 文件内容为:
import sys
sys.setdefaultencoding('utf-8')
这样的话就可以不用每次去reload了,他会在每次启动python的时候自动读取这个文件!!
[/Quote]懵懵懂懂的.....不过比不会好多了 ^_^
不得闲 2009-07-04
  • 打赏
  • 举报
回复
utf8编码,解码出来先
字串.decode('utf8')
雪夜之狼 2009-07-03
  • 打赏
  • 举报
回复
那个MySQL的中文乱码问题不是重要的...背景而已...
我关心的是,为什么setdefaultencoding不reload(sys)就不能用...
zp520lly 2009-07-03
  • 打赏
  • 举报
回复
这个setdefaultencoding是在系统启动的时候就设置了,就是你在控制台下输入python出现>>> 的时候系统会自动的读取一个
文件,所以当你在使用中的python时就必须重新reload,如果不想用那一句的话,可以在/usr/lib/python2.4/ 下建立一个名为 sitecustomize.py 文件内容为:
import sys
sys.setdefaultencoding('utf-8')
这样的话就可以不用每次去reload了,他会在每次启动python的时候自动读取这个文件!!
iambic 2009-06-29
  • 打赏
  • 举报
回复
你查询出来的“乱码”是什么类型?str还是unicode?
我相信reload不是正确的解决方案。
至于什么是正确的,我没有MySQL环境,不太清楚。
雪夜之狼 2009-06-28
  • 打赏
  • 举报
回复
我就是想问一下那个reload()为什么是必需的....
import不就是导入那个模块么?手册上说导入后应该就可以访问该模块的方法了。但是为什么setdefaultencoding就一定需要在import后再reload()一下呢?
我google了下,reload()是动态重新载入模块。重新载入的话,我没有对sys模块做修改,应该和import是一样的啊?为什么setdefaultencoding这个方法必需要先reload()呢?
sharp_future 2009-06-26
  • 打赏
  • 举报
回复
楼主,确定你的数据库字段都是utf8?你建数据库的时候是否选择了utf8,没有的话就会出现查询或者插入数据时候乱码编码报错问题,所以可以这样解决,你就不需要上面的代码了


如果要问上面代码意思,你已经解决了,load加载的意思,就跟import一样,你的那个方法或者函数属于这一模块,不调用当然出错。至于为什么,你暂时不要钻那么深,知道用法就好了。
duzif 2009-06-25
  • 打赏
  • 举报
回复
调用setdefaultencoding是需要reload(sys)的
雪夜之狼 2009-06-25
  • 打赏
  • 举报
回复
全部去掉后,查询mysql中的中文内容会乱码...
iambic 2009-06-17
  • 打赏
  • 举报
回复
你把#3全部去掉会有什么问题?

37,739

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧