zoukankan      html  css  js  c++  java
  • python标准库学习9

    fileinput 模块允许你循环一个或多个文本文件的内容

    使用 fileinput 模块循环一个文本文件

    import fileinput
    import sys
    
    for line in fileinput.input("samples/sample.txt"):
        sys.stdout.write("-> ")
        sys.stdout.write(line)
    
    -> We will perhaps eventually be writing only small
    -> modules which are identified by name as they are
    -> used to build larger ones, so that devices like
    -> indentation, rather than delimiters, might become
    -> feasible for expressing local structure in the
    -> source language.
    ->      -- Donald E. Knuth, December 1974
    

      你也可以使用 fileinput 模块获得当前行的元信息 (meta information). 其中包括 isfirstline , filename , lineno

    使用 fileinput 模块处理多个文本文件

    import fileinput
    import glob
    import string, sys
    
    for line in fileinput.input(glob.glob("samples/*.txt")):
        if fileinput.isfirstline(): # first in a file?
            sys.stderr.write("-- reading %s --\n" % fileinput.filename())
        sys.stdout.write(str(fileinput.lineno()) + " " + string.upper(line))
    
    -- reading samples\sample.txt --
    1 WE WILL PERHAPS EVENTUALLY BE WRITING ONLY SMALL
    2 MODULES WHICH ARE IDENTIFIED BY NAME AS THEY ARE
    3 USED TO BUILD LARGER ONES, SO THAT DEVICES LIKE
    4 INDENTATION, RATHER THAN DELIMITERS, MIGHT BECOME
    5 FEASIBLE FOR EXPRESSING LOCAL STRUCTURE IN THE
    6 SOURCE LANGUAGE.
    7    -- DONALD E. KNUTH, DECEMBER 1974
    

      文本文件的替换操作很简单. 只需要把 inplace 关键字参数设置为 1 , 传递给 input 函数, 该模块会帮你做好一切.

    使用 fileinput 模块将 CRLF 改为 LF

    import fileinput, sys
    
    for line in fileinput.input(inplace=1):
        # convert Windows/DOS text files to Unix files
        if line[-2:] == "\r\n":
            line = line[:-2] + "\n"
        sys.stdout.write(line)
    

      shutil 实用模块包含了一些用于复制文件和文件夹的函数.

    使用 shutil 复制文件

    import shutil
    import os
    
    for file in os.listdir("."):
        if os.path.splitext(file)[1] == ".py":
            print file
            shutil.copy(file, os.path.join("backup", file))
    
    aifc-example-1.py
    anydbm-example-1.py
    array-example-1.py
    ...
    

      copytree 函数用于复制整个目录树 (与 cp -r 相同), 而 rmtree 函数用于删除整个目录树 (与 rm -r )

    使用 shutil 模块复制/删除目录树

    import shutil
    import os
    
    SOURCE = "samples"
    BACKUP = "samples-bak"
    
    # create a backup directory
    shutil.copytree(SOURCE, BACKUP)
    
    print os.listdir(BACKUP)
    
    # remove it
    shutil.rmtree(BACKUP)
    
    print os.listdir(BACKUP)
    
    ['sample.wav', 'sample.jpg', 'sample.au', 'sample.msg', 'sample.tgz',
    ...
    Traceback (most recent call last):
     File "shutil-example-2.py", line 17, in ?
       print os.listdir(BACKUP)
    os.error: No such file or directory
    

      tempfile 模块允许你快速地创建名称唯一的临时文件供使用.

    使用 tempfile 模块创建临时文件

    import tempfile
    import os
    
    tempfile = tempfile.mktemp()
    
    print "tempfile", "=>", tempfile
    
    file = open(tempfile, "w+b")
    file.write("*" * 1000)
    file.seek(0)
    print len(file.read()), "bytes"
    file.close()
    
    try:
        # must remove file when done
        os.remove(tempfile)
    except OSError:
        pass
    
    tempfile => C:\TEMP\~160-1
    1000 bytes
    

      TemporaryFile 函数会自动挑选合适的文件名, 并打开文件而且它会确保该文件在关闭的时候会被删除. (在 Unix 下, 你可以删除一个已打开的文件, 这 时文件关闭时它会被自动删除. 在其他平台上, 这通过一个特殊的封装类实现.)

    使用 tempfile 模块打开临时文件

    import tempfile
    
    file = tempfile.TemporaryFile()
    
    for i in range(100):
        file.write("*" * 100)
    
    file.close() # removes the file!
    

       StringIO 模块的使用. 它实现了一个工作在内存的文件对象 (内存文件). 在大多需要标准文件对象的地方都可以使用它来替换.

    使用 StringIO 模块从内存文件读入内容

    import StringIO
    
    MESSAGE = "That man is depriving a village somewhere of a computer scientist."
    
    file = StringIO.StringIO(MESSAGE)
    
    print file.read()
    
    That man is depriving a village somewhere of a computer scientist.
    

      StringIO 类实现了内建文件对象的所有方法, 此外还有 getvalue 方法用来返回它内部的字符串值

     使用 StringIO 模块向内存文件写入内容

    import StringIO
    
    file = StringIO.StringIO()
    file.write("This man is no ordinary man. ")
    file.write("This is Mr. F. G. Superman.")
    
    print file.getvalue()
    
    This man is no ordinary man. This is Mr. F. G. Superman.
    

      

    使用 StringIO 模块捕获输出

    import StringIO
    import string, sys
    
    stdout = sys.stdout
    
    sys.stdout = file = StringIO.StringIO()
    
    print """
    According to Gbaya folktales, trickery and guile
    are the best ways to defeat the python, king of
    snakes, which was hatched from a dragon at the
    world's start. -- National Geographic, May 1997
    """
    
    sys.stdout = stdout
    
    print string.upper(file.getvalue())
    
    ACCORDING TO GBAYA FOLKTALES, TRICKERY AND GUILE
    ARE THE BEST WAYS TO DEFEAT THE PYTHON, KING OF
    SNAKES, WHICH WAS HATCHED FROM A DRAGON AT THE
    WORLD'S START. -- NATIONAL GEOGRAPHIC, MAY 1997
    

      cStringIO 是一个可选的模块, 是 StringIO 的更快速实现. 它的工作方式和 StringIO 基本相同, 但是它不可以被继承

    使用 cStringIO 模块

    import cStringIO
    
    MESSAGE = "That man is depriving a village somewhere of a computer scientist."
    
    file = cStringIO.StringIO(MESSAGE)
    
    print file.read()
    
    That man is depriving a village somewhere of a computer scientist.
    

      为了让你的代码尽可能快, 但同时保证兼容低版本的 Python ,你可以使用一个小技巧在 cStringIO 不可用时启用 StringIO 模块,

     后退至 StringIO

    try:
        import cStringIO
        StringIO = cStringIO
    except ImportError:
        import StringIO
    
    print StringIO
    
    <module  'StringIO' (built-in)>
    

      mmap 模块提供了操作系统内存映射函数的接口,  映射区域的行为和字符串对象类似, 但数据是直接从文件读取的.

     使用 mmap 模块

    import mmap
    import os
    
    filename = "samples/sample.txt"
    
    file = open(filename, "r+")
    size = os.path.getsize(filename)
    
    data = mmap.mmap(file.fileno(), size)
    
    # basics
    print data
    print len(data), size
    
    # use slicing to read from the file
    # 使用切片操作读取文件
    print repr(data[:10]), repr(data[:10])
    
    # or use the standard file interface
    # 或使用标准的文件接口
    print repr(data.read(10)), repr(data.read(10))
    
    <mmap object at 008A2A10>
    302 302
    'We will pe' 'We will pe'
    'We will pe' 'rhaps even'
    

      在 Windows 下, 这个文件必须以既可读又可写的模式打开( `r+` , `w+` , 或 `a+` ), 否则 mmap 调用会失败.

    对映射区域使用字符串方法和正则表达式

    mport mmap
    import os, string, re
    
    def mapfile(filename):
        file = open(filename, "r+")
        size = os.path.getsize(filename)
        return mmap.mmap(file.fileno(), size)
    
    data = mapfile("samples/sample.txt")
    
    # search
    index = data.find("small")
    print index, repr(data[index-5:index+15])
    
    # regular expressions work too!
    m = re.search("small", data)
    print m.start(), m.group()
    
    43 'only small\015\012modules '
    43 small
    

      


      

  • 相关阅读:
    winform 动态添加控件及事件
    C#调用WCF问题汇总
    如何实现验证登陆者
    如何利用wx.request进行post请求
    如何利用wx.login方法获取openid和sessionKey
    微信小程序开发调试阶段不校验请求域名
    第三方授权登陆
    node环境下:node_modules里面的文件
    windows下如何快速删除大文件
    webpack使用devtool :source map插件
  • 原文地址:https://www.cnblogs.com/rollenholt/p/2264946.html
Copyright © 2011-2022 走看看