Python核心编程--学习笔记--9--文件和输入输出
本章将深入介绍Python的文件处理和相关输入输出能力,包括:文件对象(以及它的内建函数、内建方法和属性),标准文件,文件系统的访问方法,文件执行,最后简要涉及持久存储和标准库中与文件有关的模块。
1 文件对象
句柄、文件描述符,可以访问磁盘的普通文件,也可以访问设备文件等类文件。文件只是连续的字节序列,无论单字节还是大块数据,数据传输会用到字节流。
2 文件内建函数
open()和file()功能一样,打开一个文件,返回一个文件对象,打开错误则引发错误。推荐:打开文件时用open,为了说明文件对象时用file,例如isinstance(fd, file)。
语法:
file_object = open(file_name, access_mode = 'r', buffering = -1)
其中,参数访问模式包括:'r'读、'w'写、'a'追加(即使seek到其他地方,也是写入文件末尾)、'b'二进制(不能在前面出现)、'+'同时支持读写、'U'通用换行符。
参数缓冲方式包括:0-不缓冲,1-只缓冲一行,>=2-给定值作为缓冲区大小,负数-系统默认缓冲机制(tty设备行缓冲,其他设备正常缓冲)。
2.1 通用换行符UNS
不同OS的换行符不同,使用'U'标识打开文件时,通过Python的读方法返回的所有换行符都被替换为\n。
文件对象的newlines属性记录原来的行结束符。它在没有碰到行结束符时为None,读到第一个行结束符时为第一个行结束符,读到其他行结束符时变成一个包含不同换行符的元组。
UNS默认打开,不需要则在运行configure脚本时使用 --without-universal-newlines 开关关闭它。
3 内建函数
3.1 读文件
1 read() #读至文件结尾。如果给定参数size大小且为正,则最多读取size大小
2 readline() #读取下一行,包括行结束符,作为字符串返回。如果给定size,则最多读取size大小
3 readlines() #将各行组成一个列表返回,也有size参数,不常用
3.2 写入文件
1 write() #和read()功能相反
2 writelines() #接收一个字符串列表作为参数,行结束符需要自己添加
3.3 文件内移动
1 seek(offset[, whence]) #将文件指针移动offset个字节,默认0从文件头开始,1从当前位置开始,2从文件尾开始
2 tell() #返回文件指针的位置,从头开始计算
3.4 文件迭代
1 for eachline in fobj: #直接迭代,eachline包括换行符
pass
2 fobj.next() #返回下一行,包括换行符
3.5 其他
1 close() #关闭文件。如果不显式地关闭文件,可能丢失输出缓冲区的数据。
2 fileno() #返回打开文件的描述符。这是一个整数,可用在如os模块(os.read())的一些底层操作上。
3 flush() #直接把内部缓冲区中的数据立刻写入文件。
4 isatty() #当文件是一个类tty设备时返回True。
5 truncate() #将文件截取到当前文件指针位置或者到给定的size,以字节为单位。
3.6 示例
由于操作系统的不同,换行符、路径分隔符都不同,因此os模块有助于跨平台开发,只要导入os模块就会设置为正确值:
1 linesep #行分隔符的字符串,linux中为'\n'
2 sep #路径名分隔符的字符串,linux中为'/'
3 pathsep #文件路径分隔符的字符串,linux中为':'
4 curdir #当前工作目录的字符串名称,linux中为'.'
5 pardir #(当前工作目录的)父目录字符串名称,linux中为'..'
由于write()方法不会自己添加换行符,写入文件时要注意添加:
1 fobj.write('hello world\n')
2 fobj.write('%s%s' % ('hello world', os.linesep))
文件内移动文件指针:
>>> f=open('tmp', 'w+') #打开文件,读写模式
>>> f.tell() #文件指针在0位置
0L
>>> f.write('test line 1\n') #写入一行
>>> f.tell() #文件指针后移12个字节
12L
>>> f.seek(-12,1) #在当前位置左移12个字节
>>> f.tell() #回到0位置
0L
>>> f.readline() #读取第一行
'test line 1\n'
>>> f.tell() #又向后移动12个字节
12
>>> f.close() #记得关闭文件
4 文件内建的数据属性
1 file.closedTrue #文件已关闭则为True
2 file.encoding #文件所使用的编码 - 当写入Unicode字符串时,它们将自动使用encoding转换为字节字符串;若encoding为None时使用系统默认编码
3 file.mode #文件打开时使用的访问模式
4 file.name #文件名
5 file.newlines #未读取到行分隔符时为None,只有一种行分隔符时为一个字符串,有多种类型的行结束符时则为一个列表
6 file.softspace #为0表示在输出一数据后要加上一个空格符,1表示不加。一般程序员用不着,由程序内部使用。
5 标准文件
1 sys.stdin #标准输入
2 sys.stdout #标准输出
3 sys.stderr #标准错误
6 命令行参数
1 sys.argv #参数列表,类似于C语言的char ×argv[]
2 len(sys.argv) #参数歌手,Python没有argc
还有两个模块用于辅助处理命令行参数:
1 getopt #简单,不很精细
2 optparse #复杂,面向对象
7 文件系统
对文件系统的大部分访问通过os模块实现,它只是一个虚拟层,真正加载的模块与操作系统有关。
os模块可以删除/重命名文件、遍历目录树、管理文件访问权限等,访问文件/目录的函数:
**文件处理**
1 mkfifo()/mknod() #创建命名管道/创建文件系统节点 2 remove()/unlink() #删除文件 3 rename()/renames() #重命名文件 4 stat/lstat() #返回文件信息 5 symlink() #创建符号链接 6 utime() #更新时间戳 7 tmpfile() #创建并打开('w+b')一个新的临时文件 8 walk() #生成一个目录树下的所有文件名
**目录/文件夹** 9 chdir()/fchdir() #改变当前工作目录/通过一个文件描述符改变当前工作目录 10 chroot() #改变当前进程的根目录 11 listdir() #列出指定目录的文件 12 getcwd()/getcwdu() #返回当前工作目录/功能相同,但返回一个 Unicode 对象 13 mkdir()/makedirs() #创建目录/创建多层目录 14 rmdir()/removedirs() #删除目录/删除多层目录
**访问/权限** 15 access() #检验权限模式 16 chmod() #改变权限模式 17 chown()/lchown() #改变owner和group ID/功能相同,但不会跟踪链接 18 umask() #设置默认权限模式
**文件描述符操作** 19 open() #底层的操作系统open(对于文件,使用标准的内建open()函数) 20 read()/write() #根据文件描述符读取/写入数据 21 dup()/dup2() #复制文件描述符号/功能相同,但是是复制到另一个文件描述符
**设备号** 22 makedev() #从major和minor设备号创建一个原始设备号 23 major()/minor() #从原始设备号获得major/minor设备号
os.path完成管理和操作文件路径名中的各个部分、获取文件或子目录信息、文件路径查询等操作,路径名访问函数包括:
**分隔**
1 basename() #去掉目录路径,返回文件名
2 dirname() #去掉文件名,返回目录路径
3 join() #将分离的各部分组合成一个路径名
4 split() #返回(dirname(), basename())元组
5 splitdrive()#返回(drivename, pathname)元组
6 splitext() #返回(filename, extension)元组
**信息**
7 getatime() #返回最近访问时间
8 getctime() #返回文件创建时间
9 getmtime() #返回最近文件修改时间
10 getsize() #返回文件大小(以字节为单位)
**查询**
11 exists() #指定路径(文件或目录)是否存在
12 isabs() #指定路径是否为绝对路径
13 isdir() #指定路径是否存在且为一个目录
14 isfile() #指定路径是否存在且为一个文件
15 islink() #指定路径是否存在且为一个符号链接
16 ismount() #指定路径是否存在且为一个挂载点
17 samefile() #两个路径名是否指向同个文件
8 永久存储模块
转换并储存Python对象,该过程将比基本类型复杂的对象转换为一个二进制数据集合。这个过程也被称为数据的扁平化、数据的序列化、数据的顺序化。
marshal:只能处理简单Python对象。
pickle:可以处理递归对象、被不同地方多次引用的对象、以及用户定义的类和实例。dump()和load()函数相互转换。
DBM风格模块:数据库管理模块,anydbm可以自己选择最优模块。
shelve:使用anydbm模块寻找合适的DBM模块,然后使用cPickle来完成对储存转换过程。
9 相关的模块
1 base64 #提供二进制字符串和文本字符串间的编码/解码操作
2 binascii #提供二进制和 ASCII 编码的二进制字符串间的编码/解码操作
3 bz2 #访问BZ2格式的压缩文件
4 csv #访问csv文件(逗号分隔文件)
5 filecmp #用于比较目录和文件
6 fileinput #提供多个文本文件的行迭代器
7 getopt/optparse #提供了命令行参数的解析/处理
8 glob/fnmatch #提供 Unix 样式的通配符匹配的功能
9 gzip/zlib #读写GNU zip(gzip)文件(压缩需要zlib模块)
10 shutil #提供高级文件访问功能,包括复制文件及其访问权限等
11 c/StringIO #对字符串对象提供类文件接口
12 tarfilea #读写TAR归档文件,支持压缩文件
13 tempfile #创建一个临时文件(名)
14 uu #格式的编码和解码
15 zipfile #用于读取 ZIP 归档文件的工具