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 归档文件的工具

 

 

 

 

  

posted @ 2013-12-04 00:25  阿杰的专栏  阅读(356)  评论(0编辑  收藏  举报