文件和输入输出
文件对象
文件对象不仅可以用来访问普通的磁盘文件, 而且也可以访问任何其它类型抽象层面上的”文 件”. 一旦设置了合适的”钩子”, 你就可以访问具有文件类型接口的其它对象, 就好像访问的是普 通文件一样.
文件内建函数[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.closed | True 表示文件已经被关闭, 否则为 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