踏实,努力向上!

发布新日志

  • 从实际的网页得到 HTML

    2009-02-15 20:47:37

    import urllib.request
    f = urllib.request.urlopen('http://www.python.org/')
    htmlSource = f.read()
    #htmlSource = f.read(100)                          
    f.close()                                       
    print(htmlSource)

    从实际网页中得到html代码。

    提取用 urlopen 函数取回的网页的整个文本。打开一个 URL打开一个文件相似。urlopen 的返回值是像文件一样的对象,它具有一个文件对象一样的方法。

    使用由 urlopen 所返回的类文件对象所能做的最简单的事情就是 read,它可以将网页的整个 HTML 读到一个字符串中。这个对象也支持 readlines 方法,这个方法可以将文本按行放入一个列表中。

    当用完这个对象,要确保将它 close,就如同一个普通的文件对象.

  • open( )

    2009-01-19 23:41:15

    f=open('test.txt','r') 读方式打开文件

    f=open('test.txt','w')写方式打开文件

    f=open('test.txt','rb')读二进制文件

    f=open('test.txt','wb')写二进制文件

    f=open('test.txt','w+')追加写文件

  • <更新版>从文件夹拷贝文件

    2009-01-19 21:19:55

    import os
    import time
    from os import listdir
    from os.path import isdir
    import shutil
    source = 'D:\\python test'
    target_dir = 'D:\\python test2'
    now = time.strftime('%Y%m%d')
    if isdir(source) != True:
       print('Error: source is not a directory')
       exit()
    filelist = listdir(source)
    print(filelist)
    filelist2 = []
    for name in filelist :
        if name.find('txt') >=0  or name.find('png') >=0 :
           filelist2.append(name)
    print(filelist2)
    #exit()
    for name in filelist2 :
        srcFilename = source + '\\' + name
        desFilename = target_dir + '\\' + now + '_' + name
        shutil.copyfile(srcFilename, desFilename)

    使用了shutil.copyfile(src, dst) 这个函数。比上一个程序简单了很多。

    >>> import shutil
    >>> shutil.copyfile('test.txt','cc.txt')

     把test.txt复制到cc.txt.cc.txt可以存在,也可以不存在。

  • 从文件夹拷贝文件

    2009-01-19 00:01:41

    今天做这个例子,真是郁闷死了,遇到一问题怎么也解决不了。直到现在也解决不了,狭死瞎黄穑故钦庋?/P>

    先发这个东西上来:

    import os
    import time
    from os import listdir
    from os.path import isdir
    #source = ['/home/swaroop/byte', '/home/swaroop/bin']
    source = 'D:\\python test'
    target_dir = 'D:\\python test2'
    now = time.strftime('%Y%m%d')
    if isdir(source) != True:
        print('Error: source is not a directory')
        exit()
    k=0
    filelist = listdir(source)
    print(filelist)
    t = 0
    for name in filelist :
        if name.find('txt') == -1 and name.find('png') == -1 :
            del(filelist[t])
        t = t + 1
    print(filelist)
    #exit()
    for name in filelist :
         srcFilename = source + '\\' + name
         srcFilename = '"' + srcFilename + '"'
         desFilename = target_dir + '\\' + now + '_' + name
         desFilename = '"' + desFilename + '"'
         copy_command = "copy %s %s" % (srcFilename, desFilename)
         print(copy_command)
         if os.system(copy_command) == 0:
            k = k + 1
            print('Successful backup to copy from', srcFilename, 'to' ,desFilename)
         else:
            print('Fail to copy', srcFilename, 'to', desFilename)
    print('total copy', k, 'files')

    我原来是想拷贝txt , png的文件到目标文件夹,源文件夹中有txt,png,py后缀的文件若干过,就是去掉不匹配txt,png的。

    可是结果,txt,png的都拷了,这没错,可是py也还是有。真郁闷。怎么调都不行。

    t = 0
    for name in filelist :
        if name.find('txt') == -1 and name.find('png') == -1 :
            del(filelist[t])
        t = t + 1
    问题肯定出现这里,这里从数组filelist中del了一个py文件后,整个数组就重新排了,就如执行到1时,去掉一个py文件,但原来位置在2的py文件在新数组中变成了位置1,但循环却又从2开始了,所以不再执行1了,就漏掉检测这一个了。

    这里导致的结果就是删了一个不匹配的文件后,总会导致下一个漏掉检测,整个结果就会出现比原来想要的多了几个。

    这里一直找不到怎么解决。只好有待解决了。

    2008-1-19号

    问题终于解决了,得到了想要的结果.答案是不能这样操作,在循环中del就有错的。高手一看就知道我错在哪里了,他只稍微修改了另一种方式就可以了。

    filelist2 = []
    for name in filelist :
        if name.find('txt') >=0  or name.find('png') >=0 :
            filelist2.append(name)

    增加一个空数组,只要匹配的就放到这个数组中,这样不会改变原来的。name.find('txt') >=0表示匹配。

    这样终于解决问题了。其实很简单。

  • 复制(拷贝)对象(转)

    2009-01-18 23:42:31

    需求:

    你想复制一个对象.因为在Python中,无论你把对象做为参数传递,做为函数返回值,都是引用传递的.

    讨论:

    标准库中的copy模块提供了两个方法来实现拷贝.一个方法是copy,它返回和参数包含内容一样的对象.

    import copy
    new_list = copy.copy(existing_list)

    有些时候,你希望对象中的属性也被复制,可以使用deepcopy方法:

    import copy
    new_list_of_dicts = copy.deepcopy(existing_list_of_dicts)

    当你对一个对象赋值的时候(做为参数传递,或者做为返回值),Python和Java一样,总是传递原始对象的引用,而不是一个副本.其它一些语言当赋值的时候总是传递副本.Python从不猜测用户的需求 ,如果你想要一个副本,你必须显式的要求.
    Python的行为很简单,迅速,而且一致.然而,如果你需要一个对象拷贝而并没有显式的写出来,会出现问题的,比如:
    >>> a = [1, 2, 3]
    >>> b = a
    >>> b.append(5)
    >>> print a, b
    [1, 2, 3, 5] [1, 2, 3, 5]
    在这里,变量a和b都指向同一个对象(一个列表),所以,一旦你修改了二者之一,另外一个也会受到影响.无论怎样,都会修改原来的对象.
    注意:
    要想成为一个Python高手,首先要注意的问题就是对象的变更操作和赋值,它们都是针对对象的引用操作的.一个语句比如a = []将a重新绑定给一个新对象,但不会影响以前的对象.然而,对象复制却不同,当对象复制后,对象变更操作就有了区别.
    如 果你想修改一个对象,而且想让原始的对象不受影响,那你就需要对象复制.正如本节说的一样,你可以使用copy模块中的两个方法来实现需求.一般的,可以 使用copy.copy,它可以进行对象的浅复制(shallow copy),它复制了对象,但对于对象中的元素,依然使用引用.
    浅复制,有时无法获得一个和原来对象完全一致的副本,如果你想修改对象中的元素,不仅仅是对象本身的话:

    >>> list_of_lists = [ ['a'], [1, 2], ['z', 23] ]
    >>> copy_lol = copy.copy(lists_of_lists)
    >>> copy_lol[1].append('boo')
    >>> print list_of_lists, copy_lol
    [['a'], [1, 2, 'boo'], ['z', 23]] [['a'], [1, 2, 'boo'], ['z', 23]]

    在这里,变量list_of_lists,copy_lol指向了两个不同的对象,所以我们可以修改它们任何一个, 而不影响另外一个.然而,如果我们修改了一个对象中的元素,那么另一个也会受影响,因为它们中的元素还是共享引用.
    如果你希望复制一个容器对象,以及它里面的所有元素(包含元素的子元素),使用copy.deepcopy,这个方法会消耗一些时间和空间,不过,如果你需要完全复制,这是唯一的方法.
    对于一般的浅拷贝,使用copy.copy就可以了,当然,你需要了解你要拷贝的对象.要复制列表L,使用list(L),要复制一个字典d,使用dict(d),要复制一个集合s,使用set(s),这样,我们总结出一个规律,如果你要复制一个对象o,它属于内建的类型t,那么你可以使用t(o)来 获得一个拷贝.dict也提供了一个复制版本,dict.copy,这个和dict(d)是一样,我推荐你使用后者,这个使得代码更一致,而且还少几个字符.
    要复制一个别的类型,无论是你自己写的还是使用库中的,使用copy.copy,如果你自己写一个类,没有必要费神去写clone和copy函数,如果你想定义自己的类复制的方式,实现一个__copy__,或者__getstate__和__setstate__.如果你想定义自己类型的deepcopy,实现方法__deepcopy__.
    注意你不用复制不可修改对象(string,数字,元组),因为你不用担心修改它们.如果你想尝试一下复制,依然会得到原来的.虽然无伤大雅,不过真的浪费尽力:

    >>> s = 'cat'
    >>> t = copy.copy(s)
    >>> s is t
    True

    is操作符用于不仅判断两个对象是否完全一致,而且是同一个对象(is判断标识符,要比较内容,使用==),判断标识符是否相等对于不可修改对象没有什么意义.然而 ,判断标识符对于可修改对象有时候是很重要的,比如,你不确定a和b是否指向同一个对象,使用a is b会立刻得到结果.这样你可以自己判断是否需要使用对象拷贝.
    注意:
    你可以使用另一种拷贝方式,给定一个列表L,无论是完整切片L[:]或者列表解析[x for x in L],都会获得L的浅拷贝,试试L+[],L*1...但是上面两种方法都会使人迷惑,使用list(L)最清晰和快速,当然,由于历史原因,你可能会经常看到L[:]的写法.
    对于dict,你可能见过下面的复制方法:
    >>> for somekey in d:
    ... d1[somekey] = d[somekey]

    或者更简单一些的方法,d1={},d1.update(d),无论怎样,这些代码都是缺乏效率的,使用d1=dict(d)吧.

    相关说明:

    copy(x)
        Shallow copy operation on arbitrary Python objects.

        See the module's __doc__ string for more info.

    deepcopy(x, memo=None, _nil=[])
        Deep copy operation on arbitrary Python objects.

        See the module's __doc__ string for more info.

  • 获取系统目录

    2009-01-18 12:53:42

    import os
    print(os.getenv('WINDIR'))
  • 常用的python模块(转)

    2009-01-18 12:52:24

    [转]常用的python模块
     

    adodb:我们领导推荐的数据库连接组件
    bsddb3:BerkeleyDB的连接组件
    Cheetah-1.0:我比较喜欢这个版本的cheetah
    cherrypy:一个WEB framework
    ctypes:用来调用动态链接库
    DBUtils:数据库连接池
    django:一个WEB framework
    docutils:用来写文档的
    dpkt:数据包的解包和组包
    MySQLdb:连接MySQL数据库的
    py2exe:用来生成windows可执行文件
    Pylons:我们领导推荐的web framework
    pysqlite2:SQLite的连接组件
    pythonwin:Python的Windows扩展
    setuptools:无奈,PEAK的一套python包管理机制
    sqlalchemy:数据库连接池
    SQLObject:数据库连接池
    twisted:巨无霸的网络编程框架
    wxPython-2.6:因为需要保持与linux相同的版本才没用最新的,GUI编程框架
    pypcap:抓包的
    python-dnet:控制网络安全的其他设备
    pyevent:Python的事件支持
    pydot:画图的,graphiz
    sendpkt:Python发包
    simplejson:JSON的支持


    DPKT:raw-scoket网络编程
    Cx-oracle:连接oracle的好东东
    Mechanize:爬虫连接网站常用
    PIL:图像处理工具包


    reportlab for PDF 文件。
    PyQt4 for GUI界面

    feedparser: rss解析
    chardet:编码检测
    scons: 项目构建工具,写好了模板用起来还是很方便的
    scapy: 网络包构建分析框架,可编程的wireshark,有兴趣的google “Silver Needle in the Skype”
    pefile: windows pe文件解析器
    winpdb: 自己的程序或者用别的库不太明白的时候就靠它了
    pywmi: 省了好多折腾功夫
    pylint: 培养良好的编码习惯


    下面是准备用的,不做评论:

    pygccxml
    pyparsing
    pymacs
    idapython
    paimei
    pysvn
    pyLucene
    wikidpad

    1.Python操作PDF文件
    2.Python連接PostgreSQL引擎
    3.Python的.NET2.0的曲線表

    http://pybrary.net/
    —————————————————–
    1.Python Image Libary
    2.Tkinter Libary

    http://www.pythonware.com/index.htm
    —————————————————–
    1.Karrigell

    http://karrigell.sourceforge.net/
    —————————————————–
    1.The Standard Python Libary

    http://effbot.org/librarybook/
    —————————————————–
    1.Python操作PDF的Libary

    http://reportlab.org/
    —————————————————–
    1.Python cURL Libary

    http://pycurl.sourceforge.net/
    —————————————————–
    1.urlgrabber

    http://linux.duke.edu/projects/urlgrabber/
    —————————————————–
    1.MySQL-Python

    http://mysql-python.sourceforge.net/
    —————————————————–
    1.pyscrīpter
    2.Python for Delphi

    http://mmm-experts.com/Products.aspx
    —————————————————–
    1.Python Cookbook

    http://aspn.activestate.com/ASPN/Python/Cookbook/
    —————————————————–
    1.pygame

    http://www.pygame.org/news.html
    ——————————————————
    1.pymedia

    http://www.pymedia.org

    ——————————————————
    1.pydbf

    http://dbfpy.sourceforge.net/
    ——————————————————
    1.Pexpect

    http://pexpect.sourceforge.net/
    ——————————————————
    1.dabo
    desktop application frameworks

    http://dabodev.com/
    ——————————————————
    1.pySerial

    http://pyserial.sourceforge.net/
    http://wiki.woodpecker.org.cn/moin/PySerial
    ——————————————————
    1.python’s doc

    http://wiki.woodpecker.org.cn/moin/PythonZhDoc
    ——————————————————
    1.The Visual Module of VPython(3D)

    http://vpython.org/index.html
    ——————————————————
    1.PyLucene

    http://pylucene.osafoundation.org/
    ——————————————————
    1.DBUils

    http://www.webwareforpython.org/DBUtils
    ——————————————————
    1.http://happyiww.popo.blog.163.com/blog/

    a good people’s blog
    ——————————————————
    1.Applescrīpt,OSAComponents,HtmlCalendar

    http://freespace.virgin.net/hamish.sanderson/index.html
    ——————————————————
    1.Pypcap

    http://code.google.com/p/pypcap/
    http://monkey.org/~dugsong/dpkt/
    http://www.winpcap.org/install/default.htm


    python-memcached client module for memcached


    Kodos,python的正则表达式调试工具,


    PLY (Python Lex-Yacc)
    http://www.dabeaz.com/ply/
    正在用它写汇编器.

    wxPython - GUI Framework
    omniORBpy - CORBA Library
    ZODB3 - an OODB implement
    ReportLab - PDF generating solution
    numpy+scipy+matplotlib


    hachoir 各种多媒体元数据解析
    python-orge 演示用

    数据库的:
    sqlalchemy
    sqlobject
    MySQL-python (easy_install的时候就是这个名字)


    routes
    beaker

    两个模板引擎:
    genshi
    mako

    paster


    另外还有知道的
    PyCrypto 加密的
    paramiko 这个可以帮你写sftp,比twisted里面的那个好用一些

    twisted 写服务器玩的

    PyOpenGL

    PyGame

    Psyco 传说可以加速你的python程序

    PIL (Python Image Library) 处理图片

    PyObjC 这个是苹果上用的,写Cocoa程序


    Python desktop client GUI application:
    wxPython
    PyOpenGL
    PyXML

  • 文件由后面到前面读取,读取到另一文件中

    2009-01-17 18:54:33

    def readfiles():
              f = open("test.txt","r")
              l = f.seek(0 ,2)
              content = ""
              for c in range(l-1,-1,-1):
                 f.seek(c)
                 content += f.read(1)
              f.close()
              m = open("test2.txt","w")
              m.write(content)
              m.close()

    if __name__ == "__main__":
        readfiles()

     

    这里把当前目录下,test.txt的文件从后面读取,然后写入到test2.txt中。即运行后,test2中的内容是test的尾部读取得到的。

    l = f.seek(0 ,2)
    取得最后一个字节的位置。

    f.seek(c)
    content += f.read(1)定位一个位置,将此位置的内容写入content中。

  • 用python创建任意个文件

    2009-01-17 18:38:45

    def creatfiles(x):
        i = 0
        while i < x:
         bb = "fds"+str(i)+".txt" 
         f = open(bb,"w")
         f.write("today is 2009-1-7\n")
         f.write("I am very happy!")
         f.close()
         i = i+1


    if __name__ == "__main__":
        m = int(input('creatfile_numbers: '))
        creatfiles(m)

    运行后会提示要求输入生成文件的个数,输入后,即可以当前目前生成内容为以下的txt文件。如输入为5000,则运行后,会在当前目录下生成5000个文件。内容都是如下这些:

    today is 2009-1-7

    I am very happy!

    内容都是写定的,文件名也相当于写定。只在当前脚本所在的文件夹生成文件。

    如果想改为在其它文件夹下生成文件,可以在bb = "fds"+str(i)+".txt" 这里修改,比如在d:\test\目录下生成文件,则可以写成:"d:\\test\\"+"fds"+str(i)+".txt" .这样就可以在d:\test\目录下生成文件.

     

    备注:python 3.0中,print是需要括号的。

  • python 函数参数的传递(参数带星号的说明)

    2009-01-17 18:30:23

    以下转自其它博客。觉得总结得太好了,所以拿来自己参考一下。

    python中函数参数的传递是通过赋值来传递的。函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析

    先看第一个问题,在python中函数参数的定义主要有四种方式:
    1.F(arg1,arg2,...)
    这是最常见的定义方式,一个函数可以定义任意个参数,每个参数间用逗号分割,用这种方式定义的函数在调用的的时候也必须在函数名后的小括号里提供个数相等的值(实际参数),而且顺序必须相同,也就是说在这种调用方式中,形参和实参的个数必须一致,而且必须一一对应,也就是说第一个形参对应这第一个实参。例如:
    def a(x,y):
        print x,y
    调用该函数,a(1,2)则x取1,y取2,形参与实参相对应,如果a(1)或者a(1,2,3)则会报错。


    2.F(arg1,arg2=value2,...)
    这种方式就是第一种的改进版,提供了默认值
    def a(x,y=3):
        print x,y
    调用该函数,a(1,2)同样还是x取1,y取2,但是如果a(1),则不会报错了,这个时候x还是1,y则为默认的3。上面这俩种方式,还可以更换参数位置,比如a(y=8,x=3)用这种形式也是可以的。


    3.F(*arg1)
    上面俩个方式是有多少个形参,就传进去多少个实参,但有时候会不确定有多少个参数,则此时第三种方式就比较有用,它以一个*加上形参名的方式来表示这个函数的实参个数不定,可能为0个也可能为n个。注意一点是,不管有多少个,在函数内部都被存放在以形参名为标识符的tuple中。
    >>> def a(*x):
    if len(x)==0:
       print 'None'
    else:
       print x
    >>> a(1)
    (1,)        #存放在元组中
    >>> a()
    None
    >>> a(1,2,3)
    (1, 2, 3)
    >>> a(m=1,y=2,z=3)

    Traceback (most recent call last):
    File "<pyshell#16>", line 1, in -toplevel-
        a(m=1,y=2,z=3)
    TypeError: a() got an unexpected keyword argument 'm'


    4.F(**arg1)
    形参名前加俩个*表示,参数在函数内部将被存放在以形式名为标识符的dictionary中,这时调用函数的方法则需要采用arg1=value1,arg2=value2这样的形式。
    >>> def a(**x):
    if len(x)==0:
       print 'None'
    else:
       print x  
    >>> a()
    None
    >>> a(x=1,y=2)
    {'y': 2, 'x': 1}      #存放在字典中
    >>> a(1,2)            #这种调用则报错

    Traceback (most recent call last):
    File "<pyshell#25>", line 1, in -toplevel-
        a(1,2)
    TypeError: a() takes exactly 0 arguments (2 given)


    上面介绍了四种定义方式,接下来看函数参数在调用过程中是怎么被解析的,其实只要记住上面这四种方法优先级依次降低,先1,后2,再3,最后4,也就是先把方式1中的arg解析,然后解析方式2中的arg=value,再解析方式3,即是把多出来的arg这种形式的实参组成个tuple传进去,最后把剩下的key=value这种形式的实参组成一个dictionary传给带俩个星号的形参,也就方式4
    >>> def test(x,y=1,*a,**b):
    print x,y,a,b


    >>> test(1)
    1 1 () {}
    >>> test(1,2)
    1 2 () {}
    >>> test(1,2,3)
    1 2 (3,) {}
    >>> test(1,2,3,4)
    1 2 (3, 4) {}
    >>> test(x=1,y=2)
    1 2 () {}
    >>> test(1,a=2)
    1 1 () {'a': 2}
    >>> test(1,2,3,a=4)
    1 2 (3,) {'a': 4}
    >>> test(1,2,3,y=4)

    Traceback (most recent call last):
    File "<pyshell#52>", line 1, in -toplevel-
        test(1,2,3,y=4)
    TypeError: test() got multiple values for keyword argument 'y'

Open Toolbar