zoukankan      html  css  js  c++  java
  • 文件和目录相关工具


    概述

    该部分主要包含文件和目录相关工具,里面包含迭代、上下文管理、以及文件对象对unicode编码的支持。

    一、文件工具

    open

    python内建函数,用来在计算机底层系统下访问文件的主要工具。

    基本功能

    (1)被调用时将返回一个新的与外部相连的文件对象。
    (2)具备文件双向传输数据的方法,及执行多种文件相关操作。
    (3)为底层文件系统提供了可移植接口,可在多种平台上正常运行。

    文件对象模型

    文本文件

    (1)内容包含unicode文本序列
    (2)文件进行双向传输时,自动按照默认的编码进行转换,换行符自动转换
    (3)创建文件时使用那个str对象

    二进制文件

    (1)内容包含bytes序列
    (2)文件进行双向传输时,不进行任何转换
    (3)创建对象时使用bytes对象

    使用内建文件对象

    read,readline     #读取数据,注意打开文件的模式
    write,writelines   #写入数据,writelines列表对象输入
    close        #释放系统资源,可使用with环境语句
    seek         #移动到文件的任意位置
    flush         #缓存区数据刷新到磁盘
    fileno        #获取底层文件句柄

    使用文件迭代器读取行

    文件对象包含一个智能的迭代器,能够在for循环和列表解析等所有迭代环境下,在每次请求的情况下返回一行。

    其他打开选项

    文件名
      文件路径可以是一个绝对路径或相对于当前目录的路径
    打开模式
      r+,w+,a+ #文本模式下读写
      rb,wb #二进制模式下读写
    缓存策略
      指定缓冲策略,以便提高性能,因为linux以page页为单位,可设置open的buffer缓冲区大小减少系统IO调用。

    文本文件的unicode编码

      文本文件内容

        在文件内部是编码之后的形式,内存中则是解码(unicode序列)之后的形式。

    文本文件的换行符转换

      文本模式 -->
      文本模式 -->
      二进制模式 不发生转换,二进制模式可以避免unicode错误,同时也自动禁用了换行符转换。

    python2.x和python3.x的一些区别

      python2.x中文件会存在bytes和unicode两种类型的数据,读取时需要注意打开文件的模式。
      python3.x中文件只存在bytes一种数据类型,读取时可采用二进制通用的读取方法。

    用struct打包二进制数据

    可用于打包和解压二进制数据,二进制数据的内容相对来说内容比较丰富,会包含各种数据类型,如整数,浮点数,字符等。
    用途:
      如果需要使用一些持久化的数据结构文件来进行程序之间通信的话,struct会是一种比较好的选择,通常程序之间可采用xml这种文本格式来储存交换数据,
      又或者采用json这种通用的序列化工具,相对来说struct在一些简单的应用场景中,会显得比较简单高效些。
    读取和存储
      读取:采用二进制读取字节字符串
      存储:采用二进制的方式存储字节串
    示例

    import struct
    file = open('data.bin', 'rb')
    bytes = file.read()
    values = struct.unpack('>i4shf', data)
    values[3:4]
    struct.unpack('>h', values)

    二进制文件的随机访问

    1、二进制文件也可以进行常见的随机访问处理操作,使用seek移动到文件的任意内部位置。
    2、seek支持基于字节偏移的随机访问
    3、文本模式下不同的编码,会导致使用seek比较困难,这会涉及文本内容编解码和换行符转换问题从而导致错误。当文件数据中存在unicode和非unicode

         数据共存的时候,通过seek操作之后,可能导致后续的read操作出现异常,如定位到unicode编码字节的中间字节上,从而导致解码错误。

    os模块中的底层文件工具
      os调用是通过文件描述符来处理文件,基于文件描述符的文件以原始字节形式进行处理。
    os.open的使用
      file = open('file_path', ''r)
      file.fileno()   #获取文件描述符

        os.open的模式标识符
          os模块让脚本运行有更加精细的控制

        把描述符封装进文件对象
          利用os.fdopen()函数传入文件描述符参数,继而操作文件。
        其他os文件模块工具

    重命名文件
    删除文件
    修改文件权限
    ....

      文件扫描器  

        可利用文件对象的read等一系列方法来逐行读取文件内容,同时也可以利用for,map等迭代工具来扫描文件。
          def scanner():
            list(map(function, open(name, 'r')))
            #[ function(line) for line in open(name, 'r') ]
        文件过滤器
          def filter_files(name, function):
            with open(name, 'r') as input, open(name + '.out', 'w') as output:
            for line in input:
              output.write(function(line))

     

    二、目录工具

      遍历目录

        用os.popen执行shell命令
          #非迭代器用法,阻塞式
          os.popen('dir /b').readlines()

          #迭代器用法,非阻塞式,逐行进行读取输出
          for line in os.popen('dir /b'):
            print(line[:-1])

      glob模块

        该调用没有涉及派生shell命令,可用于在多个目录下收集匹配名称。      

      遍历目录树

        可以通过编写递归程序来遍历目录树,也可以使用os模块内建的工具,如os.walk。

      递归

        有条件的不断执行自我嵌套的函数,表征为:
        (1)包含判断逻辑
        (2)包含循环处理逻辑

      python3.x中处理文件名

        通过os.listdir,os.walk等模块生成的都是unicode字符串,那么这可能会遇到解码错误的问题,这时候可以
        选择将os.listdir以bytes参数的方式指定运行,那么函数将以编码好的直接字符串形式返回文件名。

      unicode策略:文件名和文件内容

        与文件相关的unicode概念有两种完全不同的形式,文件内容编码和文件名编码。
        文件内容编码取决于python解释器环境的设置,文件名编码取决于系统环境的设置。
          sys.getdefaultencoding() #文件
          sys.getfilesystemencoding() #文件名

    重点小结:

      1、不同类型文件的打开模式

      2、文件编解码

      3、struct模块的用法,打包和处理二进制文件的数据。

  • 相关阅读:
    bzoj1568: [JSOI2008]Blue Mary开公司
    bzoj3301: [USACO2011 Feb] Cow Line
    bzoj4745: [Usaco2016 Dec]Cow Checklist
    bzoj4746: [Usaco2016 Dec]Lasers and Mirrors
    bzoj2982: combination
    bzoj1822: [JSOI2010]Frozen Nova 冷冻波
    bzoj1027: [JSOI2007]合金
    bzoj 2004
    bzoj 3110&&codevs 1616
    bzoj 2134
  • 原文地址:https://www.cnblogs.com/solitarywares/p/10202522.html
Copyright © 2011-2022 走看看