python核心编程(九&十)— 文件和输入输出、错误和异常

文件和输入输出

文件对象

文件对象不仅可以用来访问普通的磁盘文件, 而且也可以访问任何其它类型抽象层面上的”文 件”. 一旦设置了合适的”钩子”, 你就可以访问具有文件类型接口的其它对象, 就好像访问的是普 通文件一样.

文件内建函数[open()和file()]

作为打开文件之门的”钥匙”, 内建函数 open() [以及 file() ]提供了初始化输入/输出(I/O) 操作的通用接口. open() 内建函数成功打开文件后时候会返回一个文件对象, 否则引发一个错误. 当操作失败, Python 会产生一个 IOError 异常. 内建函数 open() 的基本语法是:file_object = open(file_name, access_mode='r', buffering=-1)

file_name 是包含要打开的文件名字的字符串, 它可以是相对路径或者绝对路径. 可选变量 access_mode 也是一个字符串, 代表文件打开的模式. 通常, 文件使用模式 ‘r’, ‘w’, 或是 ‘a’ 模式来打开, 分别代表读取, 写入和追加. 还有个 ‘U’ 模式, 代表通用换行符支持.

使用 ‘r’ 或 ‘U’ 模式打开的文件必须是已经存在的. 使用 ‘w’ 模式打开的文件若存在则首 先清空, 然后(重新)创建. 以 ‘a’ 模式打开的文件是为追加数据作准备的, 所有写入的数据都将 追加到文件的末尾. 即使你 seek 到了其它的地方. 如果文件不存在, 将被自动创建, 类似以 ‘w’ 模式打开文件. 如果你是一个 C 程序员, 就会发现这些也是 C 库函数 fopen() 中使用的模式.

其它 fopen() 支持的模式也可以工作在 Python 的 open() 下. 包括 ‘+’ 代表可读可写, ‘b’ 代表二进制模式访问.

文件对象的访问模式

文件模式操作
r以读方式打开
rU 或 Ua以读方式打开, 同时提供通用换行符支持 (PEP 278)
w以写方式打开 (必要时清空)
a以追加模式打开 (从 EOF 开始, 必要时创建新文件)
r+以读写模式打开
w+以读写模式打开 (参见 w )
a+以读写模式打开 (参见 a )
rb以二进制读模式打开
wb以二进制写模式打开 (参见 w )
ab以二进制追加模式打开 (参见 a )
rb+以二进制读写模式打开 (参见 r+ )
wb+以二进制读写模式打开 (参见 w+ )
ab+以二进制读写模式打开 (参见 a+ )
a.Python 2.3 中新增
工厂函数 file()

open() 和 file() 函数具有相同的功能, 可以任意替换.

通用换行符支持(UNS)

不同平台用来表示行结束的符号是不同的, 例如 \n, \r, 或者 \r\n.所以Python 的解释器也要处理这样的任务, 特别是在导入模块时分外重要。

Python 2.3 引入了 UNS. 当你使用 ‘U’ 标志 打开文件的时候, 所有的行分割符(或行结束符, 无论它原来是什么)通过 Python 的输入方法(例 如 read*() )返回时都会被替换为换行符 NEWLINE(\n). (‘rU’ 模式也支持 ‘rb’ 选项) . 这个特性 还支持包含不同类型行结束符的文件. 文件对象的 newlines 属性会记录它曾“看到的”文件的行结 束符.

在编译 Python 的时候,UNS 默认是打开的. 如果你不需要这个特性, 在运行 configure 脚本 时,你可以使用 --without-universal-newlines 开关关闭它. 如果你非要自己处理行结束符, 请查阅核心笔记,使用 os 模块的相关属性.

文件内建方法

open() 成功执行并返回一个文件对象之后, 所有对该文件的后续操作都将通过这个”句柄”进 行. 文件方法可以分为四类: 输入, 输出, 文件内移动, 以及杂项操作.

文件对象的内建方法列表

文件对象的方法操作
file.close()关闭文件
file.fileno()返回文件的描述符(file descriptor ,FD, 整数值)
file.flush()刷新文件的内部缓冲区
file.isatty()判断 file 是否是一个类 tty 设备
file.next()返回文件的下一行(类似于 file.readline() ), 或在没有其它行时引发 StopIteration 异常
file.read(size=-1)从文件读取 size 个字节, 当未给定 size 或给定负值的时候, 读取剩余的所有字节, 然后作为字符串返回
file.readinto(buf, size)从文件读取 size 个字节到 buf 缓冲器(已不支持)
file.readline(size=-1)从文件中读取并返回一行(包括行结束符), 或返回最大 size个字符
file.readlines(sizhint=0)读取文件的所有行并作为一个列表返回(包含所有的行结束符); 如果给定 sizhint 且大于 0 , 那么将返回总和大约为 sizhint 字节的行(大小由缓冲器容量的下一个值决定)( 比 如说缓冲器的大小只能为 4K 的倍数,如果 sizhint 为 15k,则 最后返回的可能是 16k———译者按)
file.xreadlines()用于迭代, 可以替换 readlines() 的一个更高效的方法
file.seek(off, whence=0)在文件中移动文件指针, 从 whence ( 0 代表文件其始, 1 代 表当前位置, 2 代表文件末尾)偏移 off 字节
file.tell()返回当前在文件中的位置
file.truncate(size=file.tell())截取文件到最大 size 字节, 默认为当前文件位置
file.write(str)向文件写入字符串
file.writelines(seq)向文件写入字符串序列 seq ; seq 应该是一个返回字符串的可迭代对象; 在 2.2 前, 它只是字符串的列表

文件内建属性

文件对象除了方法之外,还有一些数据属性. 这些属性保存了文件对象相关的附加数据, 例如 文件名(file.name), 文件的打开模式(file.mode), 文件是否已被关闭(file.closed), 以及 一个标志变量, 它可以决定使用 print 语句打印下一行前是否要加入一个空白字符(file.softspace).

文件对象的属性

文件对象的属性描述
file.closedTrue 表示文件已经被关闭, 否则为 False
file.encoding文件所使用的编码 - 当 Unicode 字符串被写入数据时, 它们将自动使 用 file.encoding 转换为字节字符串; 若 file.encoding 为 None 时使 用系统默认编码
file.mode文件打开时使用的访问模式
file.name文件名
file.newlines未读取到行分隔符时为 None , 只有一种行分隔符时为一个字符串, 当文件有多种类型的行结束符时,则为一个包含所有当前所遇到的行结束符的列表
file.softspace为 0 表示在输出一数据后,要加上一个空格符,1 表示不加。

文件系统

模块的文件/目录访问函数

文件处理

函数描述
mkfifo()/mknod()创建命名管道/创建文件系统节点
remove()/unlink()Delete file 删除文件
rename()/renames()重命名文件
*stat()返回文件信息
symlink()创建符号链接
utime()更新时间戳
tmpfile()创建并打开(‘w+b’)一个新的临时文件
walk()生成一个目录树下的所有文件名

目录/文件夹

函数描述
chdir()/fchdir()改变当前工作目录/通过一个文件描述符改变当前工作目录
chroot()改变当前进程的根目录
listdir()列出指定目录的文件
getcwd()/getcwdu()返回当前工作目录/功能相同, 但返回一个 Unicode 对象
mkdir()/makedirs()创建目录/创建多层目录
rmdir()/removedirs()删除目录/删除多层目录

访问/权限

函数描述
access()检验权限模式
chmod()改变权限模式
chown()/lchown()改变 owner和group ID/功能相同, 但不会跟踪链接
umask()设置默认权限模式

文件描述符操作

函数描述
open()底层的操作系统 open (对于文件, 使用标准的内建 open() 函数)
read()/write()根据文件描述符读取/写入数据
dup()/dup2()复制文件描述符号/功能相同, 但是是复制到另一个文件描述符

设备号

函数描述
makedev()从 major 和 minor 设备号创建一个原始设备号
major() /minor()从原始设备号获得 major/minor 设备号

os.path 模块中的路径名访问函数

分隔

函数描述
basename()去掉目录路径, 返回文件名
dirname()去掉文件名, 返回目录路径
join()将分离的各部分组合成一个路径名
split()返回 (dirname(), basename()) 元组
splitdrive()返回 (drivename, pathname) 元组
splitext()返回 (filename, extension) 元组

信息

函数描述
getatime()返回最近访问时间
getctime()返回文件创建时间
getmtime()返回最近文件修改时间
getsize()返回文件大小(以字节为单位)

查询

函数描述
exists()指定路径(文件或目录)是否存在
isabs()指定路径是否为绝对路径
isdir()指定路径是否存在且为一个目录
isfile()指定路径是否存在且为一个文件
islink()指定路径是否存在且为一个符号链接
ismount()指定路径是否存在且为一个挂载点
samefile()两个路径名是否指向同个文件

永久存储模块

pickle 和 marshal 模块

Python 提供了许多可以实现最小化永久性储存的模块. 其中的一组( marshal和pickle )可以用来转换并储存 Python 对象. 该过程将比基本类型复杂的对象转换为一个二进制数据集合, 这样就可以把数据集合保存起来或通过网络发送, 然后再重新把数据集合恢复原来的对象格式.这个过程也被称为数据的扁平化, 数据的序列化, 或者数据的顺序化.

pickle 模块中的两个主要函数是 dump() 和 load() . dump() 函数接受一个文件句柄和一个 数据对象作为参数, 把数据对象以特定格式保存到给定文件里. 当我们使用 load() 函数从文件中 取出已保存的对象时, pickle 知道如何恢复这些对象到它们本来的格式.

DBM 风格的模块

*db* 系列的模块使用传统的 DBM 格式写入数据, Python 提供了 DBM 的多种实现: dbhash/bsddb, dbm, gdbm, 以及 dumbdbm 等.

这些模块 为用户的对象提供了一个命名空间, 这些对象同时具备字典对象和文件对象的特点. 不过不足之处 在于它们只能储存字符串, 不能对 Python 对象进行序列化.

shelve 模块

一个更为完整的解决方案, shelve 模块.shelve 模块使用 anydbm 模块寻找 合适的 DBM 模块, 然后使用 cPickle 来完成对储存转换过程. shelve 模块允许对数据库文件进行 并发的读访问, 但不允许共享读/写访问.

储存转换模 块与永久性储存模块之间的关系

错误和异常

异常和java相似,不在阐述。


Python核心编程
备注:
转载请注明出处:http://blog.csdn.net/wsyw126/article/details/54562930
作者:WSYW126

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值