文件和目录相关工具


概述

该部分主要包含文件和目录相关工具,里面包含迭代、上下文管理、以及文件对象对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序列)之后的形式。

文本文件的换行符转换

  文本模式 \r\n --> \n
  文本模式 \n --> \r\n
  二进制模式 不发生转换,二进制模式可以避免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模块的用法,打包和处理二进制文件的数据。

posted @ 2018-12-31 17:13  孤独的海浪  阅读(351)  评论(0编辑  收藏  举报