文件和输入输出
-
文件对象
- 泛义的文件对象:具有文件类型接口的对象,例如文件,Web网页,通讯。文件就是连续的字节序列。数据的传输经常用到字节流。
- open(): file_object = open(file_name, access_mode = 'r', buffering = -1)。 file_name可以是相当路径或是绝对路径。file()和open()功能完全可以替换。
- 通用换行符支持(UNS):当使用‘U’标志打开文件时,所有的行分隔符通过Python的输入方法返回时都会被替换为换行符NEWLINE(\n)。文件对象具有newlines属性。UNS只用于读取文本文件,没有对应的处理文件输出的方法.
- 有关二进制文件和文本文件的讨论在笔记的末尾
-
文件内建方法
文件方法分为四类:输入,输出,文件内移动,杂项操作
- 输入:
read()方法用来直接读取size个字节到字符串中。不指定size,读至文件末尾。(@deprecated)
readline()方法读取打开文件的一行,将包括行结束符的整行返回为一个字符串。也有size参数
readlines()方法读取所有(剩余)行,返回字符串列表。sizhint代表返回的最大字节大小
- 输出:
write()含有文本数据或二进制数据块的字符串写入到文件中
writelines()将一个字符串列表写入文件,但是行结束符不会自动加入行尾。需要自己处理列表中的字符串
read()和readlines()读取行,不会自行删去行分隔符,write()和writelines()写入时不会自行加入行分隔符,都需要程序员自行操作。
- 文件内移动:
seek()可以再文件中移动文件指针到不同的位置。offset字节代表相对于某个位置的偏移量。位置的默认值为0,代表从文件开头算起,1代表从当前位置,2代表从文件末尾。(类似fseek())。
text()方法告诉当前文件指针在文件中的位置,从文件起始算起,单位为字节。
- 文件方法杂项:
close()显示关闭文件来结束对它的访问。尽早的释放句柄是个好习惯,避免对资源的空闲占用。不显示关闭文件,可能丢失输出缓冲区的数据
fileno()返回打开文件的描述符。flush()方法会直接把内部缓冲区的数据立刻写入文件。truncate()方法将文件截取到当前文件指针位置或者到给定size,以字节为单位。
行分隔符和其他文件系统差异:Posix系统上,行分隔符是换行符NEWLINE(‘\n’)字符,旧的MacOS下是RETURN(\r),DOS和Wind32系统结合使用两者(\r\n)。路径分隔符Posix使用“/”,Dos和Windows使用“\”,旧的MacOS使用“:”。导入os模块,跨平台时会有差异的变量自动会被设置为正确的值。
print语句默认在输出内容末尾加一个换行符,在语句后加一个逗号可以取消这个行为。truncate()方法接受可选size作为参数,如果给定,文件将被截取到最多size字节处。没有,则截取到当前文件指针位置。tell()会返回开始截取的字节位置。
标准文件:标准输入(一般是键盘),标准输出(到显示器的缓冲输出),标准错误(到屏幕的非缓冲输出),命名同c,stdin,stdout,stderr。访问句柄:导入sys模块,使用sys.stdin,sys.stdout,sys.stderr.print语句通常是输出到sys.stdout.内建的raw_input()通常从sys.stdin接受输入。
sys.argv属性提供对命令行参数的访问。命令行参数是调用某个程序时除程序名以外的其它参数。sys.argv[0]永远是程序的名称
os模块式访问操纵系统功能的主要接口。os模块还负责处理大部分的文件系统操作,包括删除/重命名文件,遍历目录树,以及管理文件访问权限等。os.path 可以完成一些针对路径名的操作. 它提供的函数可以完成管理和操作文 件路径名中的各个部分, 获取文件或子目录信息, 文件路径查询等操作.
- 输入:
-
永久存储模块
数据的扁平化(或者数据的序列化,数据的顺序化)将比基本类型复杂的对象转换为一个二进制数据集合,这样就可以把数据集合保存起来或通过网络发送,然后再重新把数据集合恢复原来的对象格式。
- DBM风格的模块:
多种实现:dbhash/bsddb,dbm,gdbm,dumbdbm.建议使用anydbm模块,它会自动选择最合适的。它们只能存储字符串,不能对Python对象进行序列化
- shelve模块:
shelve模块使用anydbm选择最适合的DBM模块,然后使用cPickle来完成对存储转换过程。
- pickle和cPickle
使用pickle模块吧Python对象直接保存到文件里。无需关心其他。pickle模块中两个函数:dump()和load()。dump()接受一个文件句柄和一个数据对象作为参数,把数据对象以特定格式保存到给定文件里。load()函数从文件取出保存的对象。cPickle是pickle的一个更快的c语言编译版本
- DBM风格的模块:
错误和异常
-
检测和处理异常
try-except:语句语法:
try: try_suite # watch for exceptions here except Exception[,reason]: except_suite # exception-handling code
一个try当然可以带有多个except,用来分别处理多种类型的异常。一个except要处理多种异常,异常要被放在一个元组里
当函数没有显式的返回一个值时,它就返回None
捕获所有普通异常:except Exception:或者使用裸except子句 except:(不推荐@deprecated)
sys.exc_info()返回最近一个被except语句捕获的异常的信息。
两种特殊异常:SystemExit 是由于当前 Python 应用程序需要退出, KeyboardInterupt 代表用户按下了 CTRL-C (^C) , 想要关闭 Python .他们与Exception平级。要接受包括他们的所有异常,使用裸except或者except BaseException
二进制文件和文本文件返回原处
作为文件的数据,在计算机中都是以二进制的形式存储的,对于文本文件和二进制文件的区分,不是在物理上的,而是在逻辑上的。
文本文件是字符序列,是基于字符编码的,存储的是字符的编码(如ASCII码)序列;二进制文件时字节序列,是基于值编码的,或者说没有什么特别的编码,它同数据在内存中的形式相同,仅仅是二进制数组成的字节序列。
区别
- “文本文件、二进制文件”和“以文本方式打开、以二进制方式打开”是完全不同的概念。
- 是否以二进制方式打开文件,即调用fopen时是否带b,对使用fwrite以二进制方式写入的结果没有影响,不论是在Linux下还是在Windows下;对使用fprintf以文本方式写入的结果仅在Windows下有影响,影响结果就是不带b时会有‘\n'到'\r\n'的转换,带b时没有这个转换,对在Linux下的写入没有影响。
- 文本工具打开文件过程:首先读取文件物理上所对应的的二进制比特流,然后按照协议规定的解码方式来解释这个流,然后将解释结果显示出来。比如按照ASCII码形式,他会8个bit8个bit的解释文件流。