Flash初哥

February 7, 2010

[Python]用python爬虫抓站的一些技巧总结

Filed under: 未想到分類 — Tags: — KAV @ 9:14 am

学用python也有3个多月了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过在discuz论坛中自动登录自动发贴的脚本,写过自动收邮件的脚本,写过简单的验证码识别的脚本,本来想写google music的抓取脚本的,结果有了强大的gmbox,也就不用写了。
(more…)

January 31, 2010

[Pytnon]學習筆記18-Python中的全局变量

Filed under: Python — Tags: , — KAV @ 4:28 am

全局变量不符合参数传递的精神,所以,平时我很少使用,除非定义常量。今天有同事问一个关于全局变量的问题,才发现其中原来还有门道。

程序大致是这样的:

CONSTANT = 0

def modifyConstant() :
print CONSTANT
CONSTANT += 1
return

if __name__ == ‘__main__’ :
modifyConstant()
print CONSTANT

运行结果如下:
UnboundLocalError: local variable ‘CONSTANT’ referenced before assignment

看来,全局变量在函数modifyConstant中边成了局部变量,似乎全局变量没有生效?
做点修改:

CONSTANT = 0

def modifyConstant() :
print CONSTANT
#CONSTANT += 1
return

if __name__ == ‘__main__’ :
modifyConstant()
print CONSTANT

运行正常,看来函数内部是可以访问全局变量的。
所以,问题就在于,因为在函数内部修改了变量CONSTANT,Python认为CONSTANT是局部变量,而print CONSTANT又在CONSTANT += 1之前,所以当然会发生这种错误。

那么,应该如何在函数内部访问并修改全局变量呢?应该使用关键字global来修饰变量(有点像PHP):

CONSTANT = 0

def modifyConstant() :
global CONSTANT
print CONSTANT
CONSTANT += 1
return

if __name__ == ‘__main__’ :
modifyConstant()
print CONSTANT

就这么简单!

[Python][Python]學習筆記登陸網站

Filed under: Python — Tags: , — KAV @ 3:03 am

对于大部分论坛,我们想要抓取其中的帖子分析,首先需要登陆,否则无法查看。

  这是因为 HTTP 协议是一个无状态(Stateless)的协议,服务器如何知道当前请求连接的用户是否已经登陆了呢?有两种方式:

1. 在URI 中显式地使用 Session ID;
2. 利用 Cookie,大概过程是登陆一个网站后会在本地保留一个 Cookie,当继续浏览这个网站的时候,浏览器会把 Cookie 连同地址请求一起发送过去。

  Python 提供了相当丰富的模块,所以对于这种网络操作只要几句话就可以完成。我以登陆 QZZN 论坛为例,事实上下面的程序几乎所有的 PHPWind 类型的论坛都是适用的。

# -*- coding: GB2312 -*-

from urllib import urlencode
import cookielib, urllib2

# cookie
cj = cookielib.LWPCookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)

# Login
user_data = {‘pwuser’: ‘你的用户名’,
‘pwpwd’: ‘你的密码’,
‘step’:’2′
}
url_data = urlencode(user_data)
login_r = opener.open(“http://bbs.qzzn.com/login.php”, url_data)

  一些注释:

1. urllib2 显然是比 urllib 高级一点的模块,里面包括了如何使用 Cookies。
2. 在 urllib2 中,每个客户端可以用一个 opener 来抽象,每个 opener 又可以增加多个 handler 来增强其功能。
3. 在构造 opener 时指定了 HTTPCookieProcessor 做为 handler,因此这个 handler 支持 Cookie。
4. 使用 isntall_opener 后,调用 urlopen 时会使用这个 opener。
5. 如果不需要保存 Cookie,cj 这个参数可以省略。
6. user_data 存放的就是登陆所需要的信息,在登陆论坛的时候把这个信息传递过去就行了。
7. urlencode 功能是把字典 user_data 编码成”?pwuser=username&pwpwd=password”的形式,这样做是为了使程序易读一些。

  最后一个问题是,pwuser、pwpwd 这类的名字是从哪儿来的,这就要分析需要登陆的网页了。我们知道,一般的登陆界面都是一个表单,节选如下:

用户名
UID 马上注册 密 码 找回密码

  从这里可以看出,我们需要输入的用户名密码对应的就是 pwuser 和 pwpwd,而 step 对应的则是登陆(这个是尝试出来的)。

  注意到,这个论坛表单采用的是 post 方式,如果是 get 方式则本文的方法就需要变动一下,不能直接 open,而是应该首先 Request,然后再 open。更详细的请看手册…

January 23, 2010

Python 不是 Java

Filed under: Java相關,Python — Tags: , — KAV @ 11:42 am

我最近正在看一个基于wxPython的GUI应用程序,大概45.5KLOC的样子,但我没有计算它用到的库的大小(如Twisted)。代码是由那些对Python相对生疏的Java的开发者写的,所以程序有很严重的性能问题(如三十秒的启动时间)。我在检查代码的时候发现他们写了很多对 Java有意义但是对Python却很恐怖的东西。并不是因为“Python比Java慢”,而是因为在Python中有更方便的方法去完成同样的目标,甚至在Java中不可能的事情。

所以,可悲的事就是这些可怜人事倍功半,产生了很多很多不需要写的代码,从而比相应合乎Python习惯的写法慢得多得多。我们来看一些例子:

*

在Java中一个静态的方法(static)不能翻译成一个Python的类方法(classmethod)。哦,当然,多多少少他最终产生类似的效果,但类方法的目的实际上是做了一些通常在Java中不可能的事(如继承一个非默认的构造函数)。Java静态方法的习惯翻译通常是一个模块级函数,而不是一个类方法或静态方法(staticmethod)。(同时静态封闭(final)字段应该翻译成模块级常量。)

这并不是一个性能上的问题,但是一个Python程序员要用像这些类似Java习惯的代码的话,可能就会被在该输入Foo.someFunction时却要输入Foo.Foo.someMethod这种情况给惹毛了。但是请注意:调用一个类方法将会比调用一个静态方法和函数要多一部分额外的内存。

啊,那些Foo.Bar.Baz也不是省油的。在Java中,这些点分割的名称是由编译器去查找的,所以运行时根本无所谓你有多少点。在Python中,每次运行时都要查找,所以每个点都要计算在内。(Python中一定要记住这点,“平铺比嵌套好”,尽管比起性能,他和“可读性”和“简单就是美”更靠近。)
* 要用switch语句?Python翻译将是一个哈希表,不是一堆if-then语句。用一堆if-then在Java中也不是switch语句,如果有字符串参与了呢?他其实是一个哈希表。CPython字典实现用了性能最佳—在我们宇宙中目前所知道的—的哈希表的实现之一。你自己所写的代码也不会比这个再好了,除非你是 Guido、Tim Peters和Raymond Hettinger的“私生子”——还是遗传增强了的。
*

XML不是答案。它也不是一个问题。要在正则表达式上解释Jamie Zawinski,“一些人,当遇到一个问题的时候,就想‘我知道,我要用XML’那这个时候,他们就有两个问题了。”

和 Java比这个一个不同的情况,因为比起Java代码,XML是轻巧而且有弹性的。但比起Python的代码来,XML就是一个船锚,一个绊脚石。在 Python中,XML是用来做交换,而不是你的核心功能,因为你不需要这么做。在Java中,XML可能是你的大救星因为他让你实现了特定领域的语言并 “不通过编码”提高了你的应用程序的适应性。在Java中,避免编码是一个很大的优势,因为编码意味着重新编译。但在Python中,更常见的是,写代码比写XML更方便简单。同时Python处理代码要远远比处理XML快。(不仅仅是这个,你必须书XML处理代码,同时Python自身就已经为你准备好了。)

如果你是一个Java程序员,对于你是否要在你的Python核心应用中使用XML作为一部分,不要相信你的本能。如果你不是因为信息交互的原因去实现一个已经存在的XML标准或是建立某种导入、导出格式或者建立某种XML编辑器或处理工具,那么就不要这么做。一次也别。甚至连想都不要想。现在,扔掉那个XML模式把你的手解放吧!如果你的应用程序或者平台要被Python开发者使用,他们只会感谢你不要在他们的工作量中添加使用XML的负担。

(这里唯一的例外是如果你的受众的的确确,确确实实需要XML,出于某种奇怪的理由。像,他们拒绝学习 Python并只对你使用了XML而付钱给你,或者你打算给他们一个编辑XML的GUI,同时这个写XML的GUI呢是另一个人写的,同时你得到免费使用的权利。还有一些很少见的架构上的原因需要用到XML。相信我,他们不会出现在你的程序中。如果有疑问,对一个资深的Python开发员解释你的用例。或者,如果你脸皮厚的话,试试向一个Lisp程序解释你的程序为什么要用XML!)
*

Getter 和setter是坏蛋。坏蛋,魔鬼!Python对象不是Java Bean。不要写什么getter和setter,然后还把它们包装在“属性”里面。它直到你能证明你需要比一个简单访问复杂一点的功能时才有意义,否则,不要写getter和setter。它们是CPU时间的浪费,更要紧的是,它们还是程序员宝贵时间的极大浪费。不仅仅对于写代码和测试的人,对于那些要阅读和理解它们的人也是。

在Java中,你必须使用getter和setter因为公共字段不允许你以后改变想法再去使用 getter和setter。在Python中,这样做很傻,因为你可以以一个普通特性开始并可以在任何时间改变你的想法,而不用影响到这个类的任何客户。所以不要写getter和setter。
*

代码重复在Java中常常是一个不得不要的魔鬼,你必须经常一遍一遍写同一个方法而只有一点点的变化(通常是因为静态类型约束)。在Python中这样做是没有必要的也是不值得的(除了极少数一些特定的场合需要内联一些要求性能的函数)。如果你发现自己一遍一遍在写同样的代码而且变化很少,你就需要去学一下闭包。他们并不是真的很可怕。

这就是你要做的。你写了一个包含了函数的函数。这里内部的函数就是你要一遍遍写的函数的模版,但是在里面加入了针对不同情况的函数要使用变量。外部的函数需要刚刚提高的那种变量作为参数,并且将内部的函数作为结果返回。然后,每次你要写另一种略微不同的函数的时候,你只要调用这个外部的函数,并且把返回值赋给你要让“重复”函数出现的名字。现在,如果你需要改变这个工作方式,你只要改变一个地方:这个模版。

在我所看过的应用程序/平台中,只有一个很微不足道的程序使用了这个技术之后可以去掉数百行重复代码。事实上,自从开发者使用了特别的样板文件来为这平台开发插件,这会节省很多很多第三方开发人员的代码,同时也使那些程序员要学习的东西简化了。

这只是Java->Python思维方式转变的冰山一角而已,现在我可以让他转变成正确的而不用钻研这个程序的细节。本质上,如果你曾经用过一段时间Java,而且对Python比较陌生,不要太相信自己的本能。你的本能已经为Java调节,而不是Python。向后退一步,最重要的,不要写这么多代码了。

要这样做,让自己觉得更加需要Python。假装好像Python是可以做任何你想做的魔棒,却让你无须动一个手指。问一下,“Python是怎样解决我的问题的?”还有“Python语言的哪个特点和我的问题最相似?”你绝对会惊讶于你需要的东西其实已经有了某种固定形式。事实上,这种现象实在是太普遍了,甚至在很有经验的Python程序员中也会出现,以至于Python社区中给这种现象起了个名字。我们称之为“GUIDO的时间机器” (GUIDO是美语中太空飞行工程师的意思),因为有时候看上去得到我们所需要的东西好像只有他知道的一种方法,但当我们自己知道了就不一样了。

所以,如果你不能感到你在使用Python时至少比用Java要多出10倍的生产力,!(同时如果你还怀念你的Java IDE,考虑一下这种可能性:因为你写的Python程序比他所需要的要复杂得多)

附录:(翻译自此篇文章的评论)

确实,哈希表==字典。举个最简单的例子,从Python

标准库中检出“pickle”和“copy”模块,这两个模块会从字典中查找类型并调用相应的函数。另一个有些诡异的例子是范型函数,我已经在最近的Blog中写了一下。

关于闭包的例子,我这里给出一个很笨的例子。假设你要写很多这样的函数:

def addOne(x): return x+1
def addTwo(x): return x+2

然后你可以这样写:

def makeAdder(addend):
... def add_it(x): return x+addend
... return add_it

并且这样使用:

addOne = makeAdder(1)
addTwo = makeAdder(2)

这样就可以等同于原来的定义了。

相关资料:http://www.razorvine.net/python/PythonForJavaProgrammers

[Python]略谈Python语言

Filed under: 未想到分類 — Tags: — KAV @ 11:27 am

对于许多程序员来说,Python的大名应该有所耳闻。而对于Python的评论大多褒贬不一。有的甚至说Python是以其慢速运行而闻名于世。在此我并不是要去评论别人的对于错,我只是站在一个比较客观的角度来谈谈Python这一计算机语言。
Python是一种解释性语言,而且属于OpenSource的项目。但是,你可以将其用于商业用途。并且可以将其放在商业的产品光盘中一同发售。当然,人们也可以从www.Python.org或者OpenSource的网站上免费获得其安装程序或者源代码。Python最初是在苹果计算机上被编译成功的,但现在他已经可以运行于世界上主流的操作平台之上了。他不只有Windows版本的。同时还有Linux,Unix等很多平台上都可以使用他,在RedHat9中,还将其作为开发必须的一项语言被安装。对于Python的代码类型,基本可分为3种,分别是字节代码,二进制代码,优化代码。他们的后缀名分别是.py .pyc .pyo 这些代码都可以直接运行。无需做任何的编译或者连接。而在使用这些类型的代码上,Python会更具不同的情况选择不同的类型。如下:

#!/usr/bin/python
#MyPython.py
class python:
def __init__(self):
self.name=’python’
def yourname(self):
print self.name

#!/usr/bin/python
#main.py
import MyPython
py=MyPython.python
py.yourname()

在运行时,Python会检测在main.py的当前目录中有没有MyPython.pyc文件,如果没有那么导入MyPython.py并且同时生成MyPython.pyc为下次更快的导入做好准备。这样,可以减少不少初始化的时间。而且,这一切无需用户介入,Python会自动完成。对于其语法,不的不承认,他的语法是众多其他语言中相对简单的,他排除了许多繁琐的思索。如下:

#!/usr/bin/python
a=2003
print a
a=’Hello python’
print a
a=[2,0,0,3]
print a[0]

以上的代码可以被正常运行,其结果如下:

2003
Hello python
2

如果是C++至少需要声明3组变量。而对于Python一个变量就可以了。不但如此,Python的对代码块的管理也有他的独特之处。下面是Python与C++对于同样一个While循环的比较

#!/usr/bin/python
#python source
a=0
while (a< =10):
a=a+1
print 'The number is '+a
print 'while is end'

//Build by G++ or VC++
//C++ Source
#include
int main()
{
while(a< =10)
{
a=a+1;
cout<<"The number is "< }
cout<<"while is end";
return 0;
}

对于以上代码的比较,可以看出,C++等语言是以{}来管理块的,而Python是以缩进来管理的。这样做的确有他的优越性。相信许多程序员都有过漏去{}的经历。如果,使用的编译器或者解释器优秀的话,你的确可以非常容易的加上漏去的{}。但是,如果不是这样,我想你会在复杂的代码中开始漫游了。因为,可能你的编译器会告诉你一个错误的错误信息,这个错误的位置可能会离你真正错误的地方很远(大概有十万八千里吧)。相对于此,以缩进管理方式的 Python来说,程序员几乎不用考虑这种问题。其次以缩进方式区分块的Python在进行复杂的嵌套中,Python代码就显得明了许多了。如下面的 Python与C++在嵌套上的比较:

#!/usr/bin/python
#python source
class python:
def Hello(self):
print 'Hello'
def count(n):
in=0
while(in<=n):
in=in+1
print in

//buile by G++ or VC++
//C++ Source
#include
int main()
{
class python
{
public:
void Hello(void)
{
cout< <"Hello"< }
void count(int n)
{
int in=0;
while(in<=n)
{
in=in+1;
cout< }
}
};
return 0;
}

相比较来看,Python的代码更能分清其层次,而对于C++这样的代码虽然能够编译成功。但是,对于其日后的维护,会造成无尽的痛苦。同时,就在我刚才写C++Source的时候,也差点漏了};。由此,可以看出Python的语法简洁。同时,他的出错能力也非常强。在一般情况下,Python的解释器能够准确指出错误的位置和原因。如下面的代码:

#!/usr/bin/python
import A
a=0
print _a
_a=b

运行以上的代码Python将抛出如下的错误信息:
Traceback (most recent call last):
File "E:\source.py", line 1, in ?
import A
ImportError: No module named A

Traceback (most recent call last):
File "E:\source.py", line 3, in ?
print _a
NameError: name '_a' is not defined

Traceback (most recent call last):
File "E:\source.py", line 4, in ?
_a=b
NameError: name 'b' is not defined
可以很容易的看出错误的原因和位置。在这种机制中当你调试复杂的程序时,你不用担心不能快速的解决问题。你只要按照Python的错误提示,一步步修正就可以了。
对于Python的应用范围,我个人大概的将其分为三类。
第一类时软件类,这我想不说大家也应该很清楚的。相对于C++等语言,Python的优势在于他的快速开发和代码开放。对于Python,你可以开一个记事本或者Kwriter来编写代码,然后保存,运行就可以了。即使再复杂的代码也是如此。这大大减少了开发周期,加快了开发速度。相对于传统的编辑,编译,连接运行。Python可时少了不少的麻烦。三步并两一步。又由于Python的简洁的代码和短暂的培训时间,所以,对于软件的开发和维护都变得非常容易。而Python的代码解释性,对于用户而言,只要安装有Python以后,对于Python的软件就不必再安装Python了。对软件直接运行也可以,有一劳永逸的感觉。而对于开发者来说,产品的更新和修复更加容易。或许只要使用用户浏览一张网页的时间,就可以从根本上修复产品中的Bug。这要感谢Python的代码重用和灵活的代码管理。而对于再用户处发生的错误,开发者可以更具Python自带的错误诊断来得知情况。而且,在网上有很多有关Python的代码库,而且,这些都是免费的,对于开发的企业来说,可以节省一笔相当可观的开发资金。所以说,Python在软件市场也有其的特点和市场。
第二类是网络类,随着现代网络的飞速发展。各种网络服务器脚本纷纷涌现。Perl,PHP,ASP等等都占一席之地。而Python自然也能应用于此。相对于PHP和ASP。Python能够实现从服务器软件到服务器脚本的所有功能。其中ZOPE服务器软件便是很好的例子。对于网络,Python有一组模块是专门针对它的。其中有Socket CGI和SocketServer等等,当然,Python也能够和一些大规模数据库很好的支持。甚至可以直接与他们连接无需通过其他的中间插件。应用 Python强大的支持和Python简洁的代码。相信你可以在断时间内写出出色的动态网站。
第三类是教育类。Python最初就是为了教育而开发的一种语言。应用于教育当然是情理之中的事情。在程序员中,如果你询问他们的入门语言是什么,我想许多都会说Basic更多的人说VB。其实,Basic并非最好的入门级语言。暂且不论Basic没有OOP的编程思想。在代码运行的时候还要编译和连接,虽然Basic和Python一样是解释性语言。而其语法实在让人无法忍受,比如在判断语句后要加then代替C++中的{}的确有些落伍了。对于学习编程更主要的是学习如何去用语言去思索。明白程序是如何运作的,更要知道,一些程序的基本编程思想。这一切是Python所能做到的。Python的编程思路和语法更像C++而且,支持类编程和代码重用。不论从何种角度来看,Python在让初学者了解编程是怎么一回事上是最好的语言。而Python另一个功能——即时运行。也为初学者学习编程增加不少的方便。如下在运行Python解释器后,如下运行:
>>>print ‘Hello Python’
Hello Python
这个对于初学者很重要,因为他们可以运用这种机制一行行输入代码,看看代码发生了什么作用。了解程序是如何运行的。这个对于深入编程是很重要的。而且,对于初学者的疑问,这种机制可以方便的解决其疑问。而对于初学者的独特想法,这种机制能够让初学者更快的得到这种想法的可行性。在资金上,如果对于普通的中小学高中等为了让学生学一些编程思想就花几千元卖一套VisualBasic实在是大材小用了。而且,VisualBasic必须运行于Windows这样,大家又要为每台计算机花一千多卖操作系统。这样一来教学机构可是要花费相当可观的一笔资金。而Python是免费的,许多资源都是免费的。而且 Python也可以运行于免费的Linux系统上。所以,总体来说比使用VB的资金投入就更小了。
当然,任何事物都有它的两面性。人们不是常说,科学是一把双刃剑么?不错Python也有他不足的地方。首先,是函数的定义,代码如下:

def myfunction(number):
return number+10

这段代码只看函数的定义时不能知道myfunction返回是什么类型的数据,而number也不知道是什么数据类型。只有深入代码本身才可以了解这一切。再看看如下的代码:

#!/usr/bin/python
class myclass:
def __init__(self):
self.name=’myclass’
def nothing(self):

print ‘end’

看来这个代码一切正常,nothing方法什么都不做。但在运行时Python会提示nothing有错误,并会波及到下面的代码。所以,不得不如此定义:

#!/usr/bin/python
class myclass:
def __init__(self):
self.name=’myclass’
def nothing(self):
return

print ‘end’

同时,我在最初所说的速度慢也是一个事实。不过,根据Python官方网站的报道。最新的Python2.3在速度上由于采用新的算法。所以,比以前的版本快30%左右。对于Python自带的GUI模块Tkinter,其中文支持相当不好。必须对其中显示和接收的中文转成unicode的才可以。不过,由于Python的众多库的支持。GUI也可以用wxPython写。他对中文的支持非常好,而且功能非常强大,几乎可以取代Python自带的Tkinter成为流行的GUI。最后是Python没有优秀的IDE环境,虽然这对于熟悉Python的人来说并不重要,但是对于吸引人们使用Python的确少些说服力。
对于Python的未来,我觉得非常看好。首先,Python的代码运行机制非常类似于Java语言。同样可以拥有字节代码和二进制代码的运行方法。甚至比Java在代码的运行上更灵活。再来,Python的语法更为稳定,由于Python是一个解释器中的老前辈,所以,在多年的开发中成为一个相对稳定和完善的语言。Python的模块也不像Java那么复杂,编写也更为快捷。所以,Python未来将向Java这一方向发展。可能将会用于移动设备的开发。同时,网络的支持也自然会提高,虽然,Python的网络支持已经相当完善甚至超越了现在许多的网络脚本。但是,网络的日新月异Python必须更加更新才可以。比如XML技术,虽然现在的Python也支持,但是XML模块的运行速度还是比较慢。在程序的开发上,Python有其优势。不单是由于他的本地程序的支持非常好,对于网络的支持也超乎许多人的意料。在教学方向,Python以其简洁易懂的代码能够成为学习就算机语言的流行语言之一。
(more…)

[Python]Python處理Big5

Filed under: Python,未想到分類 — Tags: — KAV @ 11:24 am

GB码与BIG5是中国人常用的两种编码集。GB码为大陆使用,BIG5为香港与台湾使用。每个编码都由2个字符构成,高字节在前,低字节在后。下面我将使用Python实现的编码转换的程序向大家作一个介绍。关于编码的一些知识大家可以去网上查找,本人不再赘述。 GB码是大陆使用的编码集。以前使用的为GB-2312编程,它只有常用字,字数有限。后国家制定了新的GBK编码,汉字已经达到了2万多。GBK完全兼容原GB-2312编码,也就是说一个GB2312的编码在GBK上是一模一样的。这里所介绍的转换是以GBK为基础的,因此适用性很广。GBK编码中不仅包括了原GB-2312编码,同时也包括了许多简码的繁体码,同时还有许多的符号与不常用汉字。GBK编码的范围是:高字节从0×81到0xFE,低字节从0×40到0xFE,同时不包括0x7F。这样如果我们将其排成一个矩形,看上去就少了xx7F一根线。
(more…)

[Python]Python學習筆記17-Python多線程(Python Multi-Threading)

Filed under: Python — Tags: , , — KAV @ 3:03 am
?View Code PYTHON
#!/usr/bin/env python
#coding=utf-8
import threading
 
class ThreadGo:
 
 
    def Post(self,numThread,urls):
        threads = []
        threadcount = numThread
        for i in range(threadcount):
            t = threading.Thread(
                target=self.__postTopic,
                kwargs={'_url':i}
            )
            threads.append(t)
        for i in range(threadcount):
            threads[i].start()
 
        for i in range(threadcount):
            threads[i].join()
        print 'All Done'
 
 
    def __postTopic(self,**para):
        print para['_url']

January 22, 2010

Python 與中文

Filed under: Python — Tags: — KAV @ 10:51 am

中文的支援,一直是各種程式言語的 FAQ , Python 也不避免。一般來說,只要能正確的使用 ‘xxx’.encode(‘big5′) 和 ‘xxx’.decode(‘big5′) , Big5 中文或者其它 charset 都能正確的輸出輸入。然而,到處加入 *.encode() 和 *.decode() 實在又麻煩又醜的方案。況且,在支援多種不同解碼的情況下,也增加程式碼的複雜。

(more…)

January 21, 2010

Multi-Thread Programming in Python

Filed under: AutoPoster,DiscussKiller,Python — Tags: — KAV @ 11:23 pm

(一)在Python中创建一个线程对象

类继承threading.Thread

在__init__里调用threading.Thread.__init__(self, name = threadname)

threadname为线程名字,这样就实现了一个空线程

(more…)

January 16, 2010

python中对中文字符进行url编码的方法

Filed under: AutoPoster,Python — Tags: — KAV @ 12:08 pm

如果我们要在url中输出中文字符,需要对其进行编码

?View Code PYTHON
import urllib
urllib.quote('这是中文url编码测试')
Older Posts »

Powered by WordPress