`
linvar
  • 浏览: 254218 次
  • 性别: Icon_minigender_1
  • 来自: 未定
社区版块
存档分类
最新评论

python2.x学习笔记(10) -- 文件和输入输出

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

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

3. 通常, 文件使用模式 'r', 'w', 或是 'a'模式来打开, 分别代表读取, 写入和追加. 还有个 'U' 模式, 代表通用换行符支持.
  指示文件打开模式的字符串中也可以包含字符 "b" , 但它不能做为第一个字符出现.这样做的目的是为了严格地满足 ANSI C3.159-1989 (即 ANSI C)中的规定; 事实上它没有任何效果, 所有POSIX 兼容系统, 包括 Linux , 都会忽略 "b" (其它系统可能会区分文本文件和二进制文件, 如果你要处理一个二进制文件, 并希望你的程序可以移植到其它非 Unix 的环境中, 加上"b" 会是不错的主意

4. 文件对象的内建方法列表
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 前, 它只是字符串的列表

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

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

7. 有助于跨平台开发的 os 模块属性
  os 模块属性   描述
  linesep   用于在文件中分隔行的字符串(\n)
  sep     用来分隔文件路径名的字符串(/)
  pathsep   用于分隔文件路径的字符串(:)
  curdir    当前工作目录的字符串名称(.)
  pardir    (当前工作目录的)父目录字符串名称(..)
  不管你使用的是什么平台, 只要你导入了 os 模块, 这些变量自动会被设置为正确的值, 减少了你的麻烦.

8. 标准文件
    一般说来, 只要你的程序一执行, 那么你就可以访问三个标准文件. 它们分别是标准输入(一般是键盘), 标准输出(到显示器的缓冲输出)和标准错误(到屏幕的非缓冲输出). (这里所说的"缓冲"和"非缓冲"是指 open() 函数的第三个参数.) 这些文件沿用的是 C 语言中的命名, 分别为stdin , stdout 和 stderr . 我们说"只要你的程序一执行就可以访问这三个标准文件", 意思是这些文件已经被预先打开了, 只要知道它们的文件句柄就可以随时访问这些文件.
    Python 中可以通过 sys 模块来访问这些文件的句柄. 导入 sys 模块以后, 就可以使用sys.stdin , sys.stdout 和 sys.stderr 访问. print 语句通常是输出到 sys.stdout ; 而内建raw_input() 则通常从 sys.stdin 接受输入.

9. sys 模块通过 sys.argv 属性提供了对命令行参数的访问。
argv 变量代表一个从命令行上输入的各个参数组成的字符
串数组;该列表的第一项 sys.argv[0] 永远是程序的名称.

10. 对文件系统的访问大多通过 Python 的 os 模块实现. 该模块是 Python 访问操作系统功能的主要接口.

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

目录/文件夹
chdir()/fchdir()a 改变当前工作目录/通过一个文件描述符改变当前工作目录
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 设备号

12. 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()    两个路径名是否指向同个文件

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

14. marshal 和 pickle 模块的区别在于 marshal 只能处理简单的 Python 对象(数字, 序列, 映射, 以及代码对象), 而pickle 还可以处理递归对象, 被不同地方多次引用的对象, 以及用户定义的类和实例. pickle 模块还有一个增强的版本叫 cPickle , 使用 C 实现了相关的功能.

15. shelve 模块使用 anydbm 模块寻找合适的 DBM 模块, 然后使用 cPickle 来完成对储存转换过程. shelve 模块允许对数据库文件进行并发的读访问, 但不允许共享读/写访问. 这也许是我们在 Python 标准库里找到的最接近于永久性储存的东西了.
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics