收集Python 各种方面的技巧片段! -- Zoom.Quiet [DateTime(2004-08-09T23:28:59Z)]

TableOfContents

各种实用代码片段

自动检查md5sums

   1 #! /usr/local/bin/python
   2 
   3 import commands
   4 file = raw_input("Enter the filename: ")
   5 sum = raw_input("Enter the md5sum: ")
   6 md = "md5sum " + file
   7 print md
   8 check = str(commands.getoutput(md))
   9 checksum = sum + "  " + file
  10 #print checksum
  11 print check
  12 if check == checksum: print "Sums OK"
  13 else: print "Sums are not the same!"

提取网页中的超链接

   1 r='<a(?:(?:\\s*.*?\\s)|(?:\\s+))href=(?P<url>\S*?)(?:(?:\\s.*>)|(?:>)).*?</a>'
   2 compile(r).findall(a)

解决在 Python 中登录网站的问题

刚刚看了xyb的代码,有点启发。 
写了一小段试了以下,可以登录了。呵呵。 
import httplib 
import urllib 
user=? 
pwd=? 
params=urllib.urlencode({"Loginname":user,"Loginpass":pwd,"firstlogin":1,"option":"登入论坛"}) 
headers={"Accept":"text/html","User-Agent":"IE","Content-Type":"application/x-www-form-urlencoded"} 
website="www.linuxforum.net" 
path="/forum/start_page.php" 
conn=httplib.HTTPConnection(website) 
conn.request("POST",path,params,headers) 
r=conn.getresponse() 
print r.status,r.reason 
data=r.read() 
print data 
conn.close() 

不知从form submit数据和直接提交request有些什么区别? 

浮点数的输出格式

>>> a=6200-6199.997841
>>> a
0.0021589999996649567
>>> print "%f"%a
0.002159
>>> import fpformat
>>> fpformat.fix(a, 6)
'0.002159'
>>> print fpformat.fix(a, 6)
0.002159
>>> print "%.6f"%a
0.002159
>>> print "%.7f"%a
0.0021590
>>> print "%.10f"%a
0.0021590000
>>> print "%.5f"%a
0.00216

怎么下载网络上的一张图片到本地

>知道了一张图片的URL >比如http://www.yahoo.com/images/logo.gif >想将它下载到本地保存应该怎么实现?

   1 urllib.urlretrieve(url, filename)

---Limodou

使用locale判断本地语言及编码

from::[http://limodou.donews.net/limodou/posts/11510.aspx limodou的学习记录 ]

在支持unicode软件中,经常需要在不同的编码与unicode之间进行转换。

那么对于一个本地文件的处理,首先要将其内容读出来转换成unicode编码,在软件中处理完毕后,再保存为原来的编码。

如果我们不知道文件的确切编码方式,可以使用默认的编码方式。那么我们可以使用locale模块来判断默认编码方式。

>>>import locale
>>>print locale.getdefaultlocale()
('zh_CN', 'cp936')

可以看出,我的机器上默认语言是简体中文,编码是GBK。

__new__的使用

from: [http://www.linuxforum.net/forum/showflat.php?Cat=&Board=python&Number=487139&page=1&view=collapsed&sb=5&o=31&fpart= 中国Linux论坛 -rings]

new

new是python里object的方法。如果你要重载new,那么你需要继承object。 new是类方法。他不带self参数。 newinit是不一样的。initself参数。所以他是在对象已经被构造好了以后被调用的。而如果你要在对象构造的时候 做一些事情,那么就需要使用newnew的返回值必须是对象的实例。 new一般在 一些模式里非常有用。我们看一个例子。 这个例子是《thinking in python》里的一个Singleton例子

class OnlyOne(object): 
    class __OnlyOne: 
        def __init__(self): 
            self.val = None 
        def __str__(self): 
            return ′self′ + self.val 
            
        instance = None 
        def __new__(cls): # __new__ always a classmethod 
            if not OnlyOne.instance: 
            OnlyOne.instance = OnlyOne.__OnlyOne() 
            return OnlyOne.instance 
        def __getattr__(self, name): 
            return getattr(self.instance, name) 
        def __setattr__(self, name): 
            return setattr(self.instance, name) 

x = OnlyOne() 
x.val = 'sausage' 
print x 
y = OnlyOne() 
y.val = 'eggs' 
print y 
z = OnlyOne() 
z.val = 'spam' 
print z 
print x 
print y 

我们可以看到OnlyOne从object继承而来。

如果你不继承object,那么你的 new就不会在构造的时候来调用。

当x = OnlyOne()的时候,其实就是调用new(OnlyOne), 每次实例化OnlyOne 的时候都会调用。

因为他是类方法。

所以这段代码就是利用这个特性来实现Singleton的。

因为不管构造多少对象,都要调用new.

那么在OnlyOne里保持一个类的属性, instance.

他代表嵌套的_OnlyOne的实例。

所以,对于他,我们只构造一次。

所以,在这里, x,y,z 都是同一个实例。

这个方法和典型的用C++ 来实现 Singleton的道理是一样的。

traceback 的处理

from::[http://www.donews.net/limodou/archive/2004/07/09/40045.aspx Limodou的学习记录]

trackback在 Python 中非常有用,它可以显示出现异常(Exception)时代码执行栈的情况。 但当我们捕捉异常,一般是自已的出错处理,因此代码执行栈的信息就看不到了,如果还想显 示的话,就要用到traceback模块了。

这里只是简单的对traceback模块的介绍,不是一个完整的说明,而且只是满足我个人的要求, 更详细的还是要看文档。

打印完整的traceback

让我们先看一个traceback的显示:

>>> 1/0

Traceback (most recent call last):
  File "", line 1, in -toplevel-
    1/0
ZeroDivisionError: integer division or modulo by zero

可以看出 Python 缺省显示的traceback有一个头:第一行,出错详细位置:第二、三行, 异常信息:第四行。也就是说分为三部分,而在traceback可以分别对这三部分进行处理。 不过我更关心完整的显示。

在traceback中提供了print_exc([limit[, file]])函数可以打印出与上面一样的效果。 limit参数是限定代码执行栈的条数,file参数可以将traceback信息输出到文件对象中。缺省的话是输出到错误输出中。举例:

>>> try:
    1/0
except:
    traceback.print_exc()
 
Traceback (most recent call last):
  File "", line 2, in ?
ZeroDivisionError: integer division or modulo by zero

当出现异常sys.exc_info()函数会返回与异常相关的信息。如:

>>> try:
    1/0
except:
    sys.exc_info()

(<class exceptions.ZeroDivisionError at 0x00BF4CC0>, 
<exceptions.ZeroDivisionError instance at 0x00E29DC8>, 
<traceback object at 0x00E29DF0>)

sys.exc_info()返回一个tuple,异常类,异常实例,和traceback。

print_exc()是直接输出了,如果我们想得到它的内容,如何做?使用 format_exception(type, value, tb [,limit]),type, value, tb分别对应 sys.exc_info()对应的三个值。如:

>>> try:
    1/0
except:
    type, value, tb = sys.exc_info()
 print traceback.format_exception(type, value, tb)

['Traceback (most recent call last):\n', '  File "", line 2, in ?\n', 
'ZeroDivisionError: integer division or modulo by zero\n']

这样,我们知道了format_exception返回一个字符串列表,这样我们就可以将其应用到我们的程序中了。

os.walk()的用法, 修改cvsroot

   1 import os
   2 from os.path import join, getsize
   3 import sys
   4 
   5 print sys.argv[1]
   6 for root, dirs, files in os.walk(sys.argv[1]):
   7     if 'CVS' in dirs:
   8         fn = join(root+'\CVS', 'ROOT')
   9         print root+' :', fn
  10         #dirs.remove('CVS')  # don't visit CVS directories
  11         f = open(fn,'r')
  12         r = f.read()
  13         print r
  14         f.close()
  15         if r.startswith('e:\cvsroot'):
  16             open(fn, 'w').write('g:\cvsroot')
  17             f = open(fn,'r')
  18             r = f.read()
  19             print r
  20             f.close()

Python多进程处理之参考大全

* PyCourse --from

[http://blog.huangdong.com] (即将成为历史的HD的个人blog,大家默哀) :)

将你的Python脚本转换为Windows exe程序

from:: [http://blog.huangdong.com] (即将成为历史的HD的个人blog,大家默哀) :)

将Python的脚本变为一个可以执行的Windows exe程序可能的好处会说出很多,我最喜欢的则是它会让你写的程序更像是一个“程序”罢。但是,凡事有利就有弊,这样必然会让python的一些好处没有了。

你可以从这里找到[http://starship.python.net/crew/theller/py2exe/ py2exe]的相关信息,可以在这里下载到[http://prdownloads.sourceforge.net/py2exe/py2exe-0.4.2.win32-py2.3.exe?download py2exe-0.4.2.win32-py2.3.exe]安装包。 但是它的使用也还是比较麻烦的,需要你自己手工的写一个小的脚本,就像这样:

   1 # setup.py
   2 from distutils.core import setup
   3 import py2exe
   4 
   5 setup(name="myscript",
   6 scripts=["myscript.py"],
   7 )

再通过python的执行:

python setup.py py2exe

来使用。更多的信息上它的网站看罢。

使用 WinAPI 的例子

在函数中确定其调用者 !

Python哲学--内省的威力

在正则表达式中嵌入注释时的陷阱

如下代码所示:

s = 'create table testtable'
>>> p =  r"""
^create\ table   # create table
\s*                 # whitespace
([a-zA-Z]*)      # table name
$                   # end
"""
>>> re.compile(p, re.VERBOSE).match(s).groups()
('testtable',)
>>>

如果在create和table之间没有那个转义的空格,即\ ,在re.VERBOSE 的时候,就会将那个空格忽略掉,因此变成是匹配createtable了,这样 他就会匹配不到了