存档

文章标签 ‘python’

用python解决amule中文乱码的问题

2010年6月18日 wgzhao 3 条评论

Linux下的amule并不会对链接做编码转换,也就是说,比如下面这样的链接地址:
ed2k://|file|%E7%94%9F%E6%B4%BB%E5%A4%A7%E7%88%86%E7%82%B8.The.Big.Bang.Theory.S02E15.Chi_Eng.HR-HDTV.AC3.960X528.x264-YYeTs%E4%BA%BA%E4%BA%BA%E5%BD%B1%E8%A7%86.avi|230043648|e49a10d7052b5dfee4aa8b3336b76301|h=qkhaltxhuygwphznp2holcvdarxki3e6|/

直接交给amule下载时,给出的文件名就会变成下面这个样子:
生活大爆炸.The.Big.Bang.Theory.S02E04.Chi_Eng.HR-HDTV.AC3.960X528.x264-YYeTs人人影视.avi

阅读全文…

查找当前目录的重复文件

2010年6月11日 wgzhao 没有评论

Ubuntu下有一个fdupes程序可以用来打印当前目录下有多少文件是重复的。因为是二进制程序,所以效率上更高。
而用Python实现的,效率就很低了,同样的目录,fdupes只用了2秒的样子,而Python程序就用了15s,大约7-8倍速度差距。
所以这个代码仅仅只是一个演示罢了。代码参考《Python for Unix and Linux System Administration》一书。

分类: Linux技术 标签:

core python programming 2nd chapter 20 exercise

2010年6月10日 wgzhao 没有评论

这一章主要是网络客户端编程,讨论了包括SMTP,POP3,FTP,URL在内的一些编程技术。Python针对网络编程有一个非常强大的模块,那就是Twisted,这个工具太强大,以至于有专门的书籍来讲述如何使用。

后面的习题大部分都是写一些代码片段,比如获取一个页面,连接一个FTP服务器,连接你的邮箱。

我选取了修改这张描述的网页抓取代码修改作为练习。主要是做了两个工作:
1)用新的一些模块替换即将过期的模块,比如HTMLParser
2)加入了多线程功能,使得当网站很大的时候,下载速度加快了很多。

不过加入这个多线程后,暂时有一个问题我不能解决。就是如何保证线程是在所有的页面都下载完后才全退出。
目前的做法是一个无线循环,除非你杀死,否则不会退出。

另外,对于图片等资源目前还无法处理,我打算专门写一个脚本来镜像某一个网站的图片资源,嘿嘿,用处嘛,你懂的。

core python programming 2nd chapter 19 exercise

2010年6月9日 wgzhao 没有评论

因为这一章是图形化编程,第一版和第二版都只是简单的描述了一下Tkinter如何使用。其他模块,比如PyGtk,WxPython更加是一笔带过了,所以要完成后面的习题,还得自己找一些资料看。
关于Tkinter的资料,国内不过,基本上还是官方文档为主,Python官方站点给出了一个关于Tkinter的专题,集中了一些资料,感兴趣的可以看看。
阅读全文…

core python programming 2nd chapter 18 exercise

2010年6月5日 wgzhao 2 条评论

18-4. 线程和文件。把练习 9-19 的答案做一些改进。我们要得到一个字节值,一个文件名然后显示在文件中那个字节出现了多少次。假设这个文件非常的大。文件是可以有多个
读者的,那我们就可以创建多个线程,每个线程负责文件的一部分。最后,把所有的线程的结果相加。使用 timeit()对单线程和多线程分别进行计时,对性能的改进进行讨论。

18-5. 线程,文件和正则表达式。你有一个非常大的 mailbox 文件——如果没有的话,你可以把你所有的 e-mail 的原始信息放到一个文本文件中。你现在要做的是,使用你在 15 章写的识别 e-mail 地址和网页 URL 的正则表达式,分析出这个大文件里的所有的 e-mail 地址和 URL,把这些链接写到一个.html(或.htm)文件中。在这个文件生成时,会自动显示一个浏览器,打开这个文件,显示所有的链接。使用多线程来分隔处理大文件和把结果写到一个新的.html 文件的操作。在浏览器中测试一下你的结果,确保那些链接都能正常工作。

阅读全文…

core python programming 2nd chapter 9 exercise

2010年6月5日 wgzhao 没有评论

9–1.文件过滤. 显示一个文件的所有行, 忽略以井号( # )开头的行. 这个字符被用做Python , Perl, Tcl, 等大多脚本文件的注释符号.
附加题: 处理不是第一个字符开头的注释.

去掉以#开头的行比较好办,用startswith函数也行,用string[0]获得第一个字符也行。
麻烦的是如果要去掉行中间的注释,我这里采取用的是正规表达式(RE)方法,代码如下:

import re
def ex9_1(filename):
    '''
    过滤以#字符作为注释的行,输出过滤后的文本
    '''
    #首先过滤掉#开头的行
    data = [ line for line in open(filename) if line[0] != '#']
    #过滤从#开始一直到行尾的字符
    p = re.compile(r'#.*$')
    result = [ p.sub('',line) for line in data ]

    print ''.join(result)

阅读全文…

core python programming 2nd chapter 15 exercise

2010年6月1日 wgzhao 1 条评论

15–16. 修改脚本 gendata.py 的代码,使数据直接写入文件 redata.txt 中,而不是输出到屏幕上。
15–17.统计生成的 redata.txt 文件中,星期中的每一天出现的次数(或统计各月份出现的次数)。
15–18.通过检查每个输出行中整数字段部分的第一个整数是否和该行开头的时间戳相匹配来验证 redata.txt 中的数据是否完好。
根据各练习的要求写出相应的正则表达式:
15-19 提取出每行中完整的时间戳字段。
15-20 提取出每行中完整的电子邮件地址。
15-21 只提取出时间戳字段中的月份。
15-22 只提取出时间戳字段中的年份。
阅读全文…

core python programming 2nd chapter 11 exercise

2010年5月31日 wgzhao 没有评论

11–7. 用 map() 进 行 函 数 式 编 程 。 给 定 一 对 同 一 大 小 的 列 表 , 如 [1 , 2 , 3] 和
['abc','def','ghi',....],将两个标归并为一个由每个列表元素组成的元组的单一的表,以使我
们的结果看起来像这样:{[(1, 'abc'), (2, 'def'), (3, 'ghi'), ...}.

def ex11_7(list1,list2):
    '''
    用 map() 进 行 函 数 式 编 程 。 给 定 一 对 同 一 大 小 的 列 表 , 如 [1 , 2 , 3] 和
    ['abc','def','ghi',....],将两个标归并为一个由每个列表元素组成的元组的单一的表,以使我
    们的结果看起来像这样:{[(1, 'abc'), (2, 'def'), (3, 'ghi'), ...}.不要使用内置的zip函数
    >>> ex11_7([1,2,3],['abc','def','ghi'])
    [(1, 'abc'), (2, 'def'), (3, 'ghi')]
    ”’
    if len(list1) != len(list2):
        print ‘Error’
    else:
        result = []
        while list1:
            result.append((list1.pop(0),list2.pop(0)))
    print result
if __name__ == ‘__main__’:
    import doctest
    doctest.testmod()

阅读全文...