Python文件和输入输出
Python 核心编程[第九章]
0x00文件对象
文件只是连续的字节序列,数据的传输经常会用到字节流,无论字节流是由单个字节还是大块数据组成。
一、文件内建函数
-
open() 内建函数成功打开文件后会返回一个文件对象,否则引发一个错误。当操作失败时 Python 会产生一个 IOError 异常。
-
open()的基本语法:
file_object = open(file_name,access_mode = ‘r’,buffering = -1) -
access_mode (‘r’(默认),w,a,U,+,b)
-
buffering(缓冲 0,1,n)
1.通用换行符支持(UNS)
不同平台的结束符表示方式不同:当用 ‘U’ 标志打开文件时,所有行分隔符通过 python 都会被替换为 \n
二、文件内建方法
文件方法可分为四类:输入、输出、文件内移动、杂项操作
1.输入
- 方法 read():返回字符,size读入个数,默认 -1 表示至文件末尾
- 方法 readline():返回字符串,返回包括行结束符,size
- 方法 readlines():返回读取行的字符串列表,sizhint表示返回最大字节大小
2.输出
- write()
- writelines()
- 没有 writeline() 方法,因为它等价于使用以行结束符结尾的单行字符串调用 - write() 方法
- 注:当输入方法选取 read 或 readlines 从文件中读取时,行结束符并不会被删除,write writelines 方法也不会自动加入行结束符
3.文件内移动
- seek() 可以将文件指针移动到不同位置,offset 代表对于某个位置的偏移量。whence 从哪个位置开始偏移,默认为0,代表从文件开头算起,1 代表从当前位置算起,2 代表从文件末尾算起
- text() 方法是对 seek() 的补充,它告诉你当前文件指针在文件中的位置,以字节为单位
4.文件迭代
for eachLine in f:
;
##也可以使用迭代器的 next() 方法。
5.其他
- close() 通过关闭文件来结束对它的访问。如果不显式的关闭可能丢失缓冲区的数据
- flush() 直接把内部缓冲区中的数据立刻写入文件,而不是等待输出缓冲区被写入
- isatty() 是一个布尔内建函数,当文件是一个类 tty 设备时返回 True ,否则返回False
- truncate() 将文件截取到当前指针位置或指定 size ,以字节为单位
6.文件方法杂项
```
##读取文件高效
fname = input(" file name ")
f = open('fname','r')
for eLine in f:
print(eLine,end='')
f.close()
```
- 注:换行符的差异 \n ( POSIX) \r (旧 Mac OS) \r\n (DOS Wind32),路径分割符 / (POSIX) \ (DOS Wind32) : (旧 Mac OS)
- tell() 告诉当前位置(从1开始计数)
- raw_input() 不会保留用户输入的换行符
- 文件对象的方法:表9.3
三、文件内建属性
属性保存了文件对象相关的附加数据,例如:文件名(file.name),文件打开模式(file.mode),文件是否已被关闭(file.closed),标记变量(file.softspace)决定使用 print 语句打印下一行前是否加入一个空白字符,使用编码(file.encoding),flie.newlines。
0x02文件系统
对文件系统的访问大多通过 Python 的 os 模块实现。该模块是 Python 访问操作系统功能的主要接口。os 模块实际上只是真正加载的模块的前端,而真正的那个“模块”显然要以来具体的操作系统。这个“真正”的模块可能是一下几种之一:posix, nt(win32), mac, dos7, os2 等。只要导入 os 模块,Python会正确选择模块。 除了对进程和进程运行环境进行管理外,os 模块还负责处理大部分的文件系统操作,这些功能包括删除/重命名文件,遍历目录树,管理文件访问权限。 os.path 可以完成一些针对路径名的操作。它提供的函数可以完成管理和造作文件路径名中的各个部分,获取文件或子目录信息,文件路径查询等操作。
表9.5 os 模块的文件/目录访问函数
文件处理
- mkfifo() / mknod():创建命名管道 / 创建文件系统节点
- remove() / unlink():删除文件
- rename() / renames():重命名文件
- *stat():返回文件信息
- symlink():创建符号链接
- utime():更新时间戳
- tempfile():创建并打开(‘w+b’)一个新的临时文件
- walk():生成一个目录树下的所有文件名
目录/文件夹
- chdir() / fchdir():改变当前工作目录 / 通过一个文件描述符改变当前工作目录
- chroot():该百年当前进程的根目录
- listdir():列出指定目录的文件
- getcwd() / getcwdu():返回当前工作目录 / 功能相同,但返回一个 Unicode 对象
- mkdir() /makedirs():创建目录 / 创建多层目录
- rmdie() / removedirs():删除目录 / 删除多层目录
访问/权限
- access():检验权限模式
- chmod():改变权限模式
- chown() / lchown():改变 owner 和 group ID/ 功能相同,但不会跟踪链接
- umask():这只默认权限
文件描述符操作
- open():底层的操作系统 open
- read() / write():根据文件描述符读取/写入数据
- dup() /dup2():复制文件描述符/功能相同,但是是复制到另一个文件描述符
设备号
- makedev():从 major 和 minor 设备号创建一个原始设备号
- major() / minor():从原始设备号获取 major / minor 设备号
表9.6 os.path 模块中的路径访问函数
分隔
- basename():去掉目录路径,返回文件名
- dirname():去掉文件名,返回目录路径
- join():将分离的各部分分组组合成一个路径名
- split():返回(dirname(),basename())元组
- splitdrive():返回(dirvename,pathname)元组
- splitext():返回(filename,extension)元组
信息
- getatime():返回最近访问时间
- getctime():返回文件创建时间
- getmtime():返回最近文件修改时间
- getsize():返回文件大小
查询
- exists():指定路径(文件、目录)是否存在
- isabs():指定路径是否为绝对路径
- isdir():指定路径是否存在且为一个目录
- isfile():指定路径是否存在且为一个文件
- islink():指定路径是否存在且为一个符号链接
- ismount():指定路径是否存在且为一个挂载点
- samefile():两个路径名是否指向同一文件
- 使用见例 9.1
0x03 文件的相关知识
一、文件执行
需要涉及其他位置的其他文件,甚至启动另外的 Python 解释器,了解如何启动其他程序,以及与他们进行通信,或者是 Python 执行环境的一般信息,去看第十四章。
二、标准文件
标准输入 stdin(一般是键盘)、标准输出 stdout(显示器的缓冲区输出)、标准错误 stderr(屏幕的非缓冲区输出)(这里说的‘缓冲区’和‘非缓冲区’是指 open 的第三个参数)。只要你的程序一执行就可以访问这三个标准文件,这些文件已经被预先打开了,只要知道他们的文件句柄就可以随时访问这些文件。
可以通过 sys 模块访问 sys.stdin … print 通常输出到 sys.stdout input() 通常从 sys.stdin接收,sys.*是文件,所以你必须自己处理好换行符。
三、命令行参数
sys 模块通过 sys.argv 属性提供了对命令行参数的访问。Python 中 argc 其实就是 argv 列表的长度,而该列表的第一项 argv[0] 永远是程序名。
Python 提供了两个模块 getopt(简单),optparse(强大,更面向对象)用来辅助处理命令行参数
四、持久存储
可以把用户的数据归档保存起来供以后使用,大部分永久性存储模块是用来存储字符串数据,但是也有方法来归档的 Python 对象。
1.pickle 和 marshal 模块
pickle 和 marshal 可以用来转换并存储 Python 对象。该过程将比较基本复杂的对象转换为一个二进制数据机和,这样就可以把数据集合好存起来或通过网络发送,然后再重新把数据集合恢复为原来的对象格式。这个过程也被称为数据的扁平化、数据的序列化或数据的顺序化。
这些模块本身并没有提供“永久性存储”的功能,因为他们没有为对象提供名称空间,也没有提供永久性存储对象的并发写入访问。他们只能存储转换 Python 对象,为保存和传输提供方便。marshal 只处理简单的 Python 对象,而 pickle 还可以处理递归对象,被不同地方多次引用对象,以及用户定义的类和对象。
2.DBM 风格模块
只提供了 Python 字符串的永久性存储。 anydbm模块,它会自动检测系统上已经安装的 DBM兼容模块,并选择“最好”的一个。它们只能存储字符串,不能对 Python 对象进行序列化。
3.shelve 模块
上述两个功能都具备。shelve 模块使用 anydbm 模块寻找合适的 DBM模块,然后使用 cPickle 来完成对存储转换过程。shelve 模块允许对数据库文件进行并发的访问,但不允许共享读/写访问。 pick 模块中的两个主要函数是 dump() 和 load()。dump()函数接收一个文件句柄和一个数据对象作为参数,把数据对象以特定格式保存到给定文件里。当我们使用 load() 函数从文件中取出已保存的对象时,pickle 知道如何恢复这些对象到他们本来的格式。 建议看一下 pickle 和 shelve 模块。
0x03相关模块
- 表9.7
- base64:提供二进制字符串和文本字符串见的编码/解码操作
- binascii:提供二进制文件和 ascii 编码的二进制字符串间的编码/解码操作
- bz2:访问 BZ2 格式的压缩文件
- csv:访问 csv 文件
- filecmp:用于比较目录和文件
- fileput:提供多个文本文件的行迭代器,模块遍历一组输入文件,每次读取它们内容的一行,如果没有明确给定文件名,则默认从命令行读取文件
- getopt / optparse:提供了命令行参数解析/处理
- glob / fnmatch:提供 Unix 央视的通配符匹配功能,提供了Unix shell 样式文件名的通配符,如(*),(?)
- gzip / zlib:读写 GNU zip文件(压缩需要 zlib 模块)
- shutil:提供高级文件访问功能,包括复制文件、复制文件的访问权限、递归地目录树复制
- c / StringIO:对字符串对象提供类文件接口,见字符串一章,这个接口包括文件对象的所有标准方法
- tarfile:读写 TAR 归档文件,支持压缩文件
- tempfile:创建一个临时文件(名)
- uu:uu 格式编码和解码
- zipfile:用于读取 ZIP 归档文件的工具
上一篇: struts升级到2.5.2遇到的问题及解决方案(推荐)
下一篇: C语言实现辗转相除法(两种方法)