Archive for python

在做f4ck上的游戏时,第三题需要生成字典的,就到网上搜索现成的排列组合的例子,找个一个,(链接找不到了)。那篇文章用了很多种方法,并比较了执行时间,很好。我找了一种感觉很好的,记录一下。 字典生成,共五位,已知四个字母,然后另一位是数字。这五位排列组合,共有5!*10中排列。 先上算法:

#-*-coding:utf-8-*-
str1 = 'f9ck'

def permute(seq):
    new_list = []
    seqn = [seq.pop()]
    while seq:
        newseq = []
        new = seq.pop()
        #print "seq:",seq,'seqn', seqn ,'new', new
        for i in range(len(seqn)):
            item = seqn[i]
            for j in range(len(item)+1):
                #print u'left:',item[:j],u'midle:',new,u'right:',item[j:]
                #print ''.join([item[:j],new,item[j:]])
                newseq.append(''.join([item[:j],new,item[j:]]))
        seqn = newseq
        #print 'newseq',newseq
    return  seqn

file2 = open('p00.txt','w+')
for i in range(10):
    str2 = str1 + str(i)
    seq = list(str2)
    thelist = permute(seq)

    passwdlist = []
    for passwd in thelist:
        newpasswd = passwd + '\n'
        passwdlist.append(newpasswd)
    file2.writelines(passwdlist)
    print len(passwdlist)

#file1.close()
file2.close()
分析一下, 第一步,取一位,放入seqn,这个列表用于保存过程中生成的序列。 第二步,从剩下的中再取一位,放入new。 第三步,for循环,将new中的字母插入到seqn列表元素的每一位中。生成的新序列赋值seqn。 for循环解释一下:作者当时就是举了个例子,如果想得到1,2,3这三个数的排列组合,通过下面的方法。 如图: [caption id="attachment_532" align="alignnone" width="122" caption="排列选择"]排列选择[/caption]

Continue

在抓取网页数据进行html分析的时候,以前一直使用HTMLParser,文档:http://docs.python.org/library/htmlparser.html 自从知道HTMLParser后,一直感觉他就是一个神器,分析简单快捷,几行代码搞定了。 这次在总页面抓取使用HTMLParser,没有问题,很快实现结果。但是在获取详细信息的页面时候,开始提示错误了:HTMLParseError: malformed start tag,各种google,其中有一大部分的结果是关于Beautiful Soup的,于是我了解了Beautiful Soup。HTMLParser还有一个缺点,对编码的处理也不是很友好。 开始安装的Beautiful Soup最新版本4.4.1,有问题,也是报这个错误。由于前面搜索知道换成版本3.07a就好了,直接又换了一个版本。先说官网地址:http://www.crummy.com/software/BeautifulSoup/,Beautiful Soup 3.07a下载地址:http://www.crummy.com/software/BeautifulSoup/bs3/download//3.x/。 测试通过,没有报错。能否抓取成功下面试试。正在看官方文档,版本3的文档不一样,贴地址:http://www.crummy.com/software/BeautifulSoup/bs3/documentation.zh.html 时隔二分钟,测试成功。发现Beautiful Soup更加简单,文档也不错只看了开始的例子就会用了,速度应该不会太好,不过我只是满足自己需要。很好很强大。 刚刚结合文档总结了几个用法,很多根据文档写出文档没写的例子: #基本的标签查找 asd = soup.find('div', id="productDescription") #可以这样写 soup.findAll('td', {'class':"bucket normal"})[0] #想要进行查询结果中查找 aaa = BeautifulSoup(str(asd)) #查找多个不同class,或 bbb = aaa.findAll('div', {'class':["leftImage","rightImage"]})

Continue

这是一篇转载文章,原文链接:http://www.jb51.net/article/17560.htm 刚写了一个汉字的图片验证码,被错误提示折腾了。看到这篇文章便分享。 报错“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')

Continue

看了oschina上的两个代码,受益匪浅。其中对join()方法不理解,看python官网文档的介绍: join([timeout]):等待直到进程结束。这将阻塞正在调用的线程,直到调用join()方法的线程结束。(好难翻译,应该是这个意思) 哈哈,这个易懂。 join方法,如果一个线程或者一个函数在执行过程中要调用另外一个线程,并且待到其完成以后才能接着执行,那么在调用这个线程时可以使用被调用线程的join方法。

#-*- encoding: gb2312 -*-
import string, threading, time

def thread_main(a):
    global count, mutex
    # 获得线程名
    threadname = threading.currentThread().getName()

    for x in xrange(0, int(a)):
        # 取得锁
        mutex.acquire()
        count = count + 1
        # 释放锁
        mutex.release()
        print threadname, x, count
        time.sleep(1)

def main(num):
    global count, mutex
    threads = []

    count = 1
    # 创建一个锁
    mutex = threading.Lock()
    # 先创建线程对象
    for x in xrange(0, num):
        threads.append(threading.Thread(target=thread_main, args=(10,)))
    # 启动所有线程
    for t in threads:
        t.start()
    # 主线程中等待所有子线程退出
    for t in threads:
        t.join()  

if __name__ == '__main__':
    num = 4
    # 创建4个线程
    main(4)
###################################################################
#-*- encoding: gb2312 -*-
import threading
import time

class Test(threading.Thread):
    def __init__(self, num):
        threading.Thread.__init__(self)
        self._run_num = num

    def run(self):
        global count, mutex
        threadname = threading.currentThread().getName()

        for x in xrange(0, int(self._run_num)):
            mutex.acquire()
            count = count + 1
            mutex.release()
            print threadname, x, count
            time.sleep(1)

if __name__ == '__main__':
    global count, mutex
    threads = []
    num = 4
    count = 1
    # 创建锁
    mutex = threading.Lock()
    # 创建线程对象
    for x in xrange(0, num):
        threads.append(Test(10))
    # 启动线程
    for t in threads:
        t.start()
    # 等待子线程结束
    for t in threads:
        t.join()
在程序中,最后join()方法的调用就明白了,是主进程挨个调用子线程的join()方法。当四个线程都执行完毕后,主线程才会执行下面的代码,在这里也就是退出了。 相对应的在网上一起找到的另一个方法: 3.守护进程 setDaemon() 这个方法基本和join是相反的。当我们在程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成。如果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是,只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以用setDaemon方法啦

Continue

开始看了一大堆的base64的资料,准备用python写代码的时候发现,这么简单,根本不需要知道算法。。。。 用了python会不会越来越懒。T_T base64模块真正用的上的方法只有8个,分别是encode, decode, encodestring, decodestring, b64encode,b64decode, urlsafe_b64decode,urlsafe_b64encode。 他们8个可以两两分为4组,encode,decode一组,专门用来编码和 解码文件的,也可以对StringIO里的数据做编解码; encodestring,decodestring一组,专门用来编码和解码字符串; b64encode和b64decode一组,用来编码和解码字符串,并且有一个替换符号字符的功能。这个功能是这样的:因为base64编码后的字符除 了英文字母和数字外还有三个字符 + / =, 其中=只是为了补全编码后的字符数为4的整数,而+和/在一些情况下需要被替换的,b64encode和b64decode正是提供了这样的功能。至于什 么情况下+和/需要被替换,最常见的就是对url进行base64编码的时候。urlsafe_b64encode和urlsafe_b64decode 一组,这个就是用来专门对url进行base64编解码的,实际上也是调用的前一组函数。

>>> base64.urlsafe_b64encode('13\'')
'MTMn'
>>> base64.urlsafe_b64encode('13')
'MTM='
>>> base64.urlsafe_b64decode('MTMn')
"13'"

Continue

找到几个零碎的学习资料: http://www.cnblogs.com/holbrook/tag/python/ http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944771.html http://www.cnblogs.com/twelfthing/articles/2095502.html Python实现多线程下载学习代码 http://www.oschina.net/code/snippet_70229_2407 官网文档: http://docs.python.org/library/thread.html http://docs.python.org/library/threading.html

Continue

几天前的事了,断断续续也写了几天。用了wxpython写的界面,在ubuntu下写的,在xp下编译成功,win7测试成功。 为防止工具乱用,只支持一个贴吧。代码很多是参考别人的写法,省去了自己阅读javascript的时间,所以总体比较简单,借机大体学习了wxpython,很强大,就是用py2exe编译出来的文件太大了。可能是自己没有优化吧。 现在写程序发现总是调用别人写的代码,神马时候能有水平写个接口让别人用一下T_T..

Continue

官网文档:http://www.wxpython.org/docs/api/wx.CheckListBox-class.html 主要用到一个GetChecked(self) Return a tuple of integers corresponding to the checked items in the control, based on IsChecked.

#获取选择的列表,返回一个元组
	    select_list = self.clb.GetChecked()
	    for i in range(len(select_list)):
		#print select_list[i],'...'
		del_url = TIEBA_URL + self.URLList[select_list[i]]
		#print self.sampleList[select_list[i]]

Continue

MySQL-python for Windows Distributions http://www.codegood.com/downloads python下载地址被墙了,需要vpn,到ftp里面下载就不需要了: http://www.python.org/ftp/python/ python 2.6.7没有for windows版本。

Continue

>>> import datetime
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2012, 2, 14, 16, 24, 36, 171000)
>>> dir(now)
发现取得时间方法是now.year的方式。
>>> now2 = datetime.datetime.now()
>>> dd=now2-now
>>> dd
datetime.timedelta(0, 209, 938000)
>>> dir(dd)
>>> dd.days
0
>>> dd.microseconds
938000
>>> dd.seconds
209
MD5加密方法:
>>> import md5
>>> v = md5.new('uuuuu').hexdigest()
>>> v
'3c9aa281ced92294f259c0c55520b2cf'
>>> b= md5.new('uuuuu').hexdigest()[16:]
>>> b
'f259c0c55520b2cf'

Continue