文件和目录相关工具
概述
该部分主要包含文件和目录相关工具,里面包含迭代、上下文管理、以及文件对象对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模块的用法,打包和处理二进制文件的数据。