计算机体系架构
运算器:完成各种算术运算、逻辑运算、出具传输等数据加工处理
控制器:控制程序的执行
CPU = 运算器 + 控制器
存储器:用于记忆程序的数据,内存
输入设备:将数据或程序输入到计算机中
输出设备:将数据或程序的处理结果展示给用户
文件IO常用操作
open |
打开 |
read |
读取 |
write |
写入 |
close |
关闭 |
readline |
行读取 |
readlines |
多行读取 |
seek |
文件指针操作 |
tell |
指针位置 |
打开
open(file, mode=’r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
打开一个文件,返回一个文件对象(流对象)和文件描述符,打开文件失败,则返回异常
文件访问的模式有两种:文本模式、二进制模式,不同模式的操作函数不同,表现的结果也不一样
open的参数
file:打开或要创建的文件名。不指定路径,默认在当前路径下
mode
r |
默认模式,只读打开 |
w |
只写打开 |
x |
创建并写入一个新文件 |
a |
写入打开,文件存在则追加 |
b |
二进制模式 |
t |
默认,文本模式 |
+ |
读写打开一个文件,给原来只读、只写方式打开提供缺失的读或写的能力 |
open默认只读模式r打开已经存在的文件
r
只读打开文件,若使用到write方法会抛异常
若文件不存在,则FileNotFoundError
w
只写打开文件,若read则抛异常
若文件不存在则新建文件
若文件存在,则清空文件内容
x
文件不存在,创建文件并以只写方式打开
文件存在则FileExistsError
a
文件存在,只写打开,追加内容
文件不存在,则新建并只写打开,追加内容
r是只读,w、x、a都是只写
w、x、a均可产生新文件,w不管文件存在与否都会生成全新内容的文件;a不管文件存在与否都只能在文件尾部追加;x要求事先文件不存在,只能自己创建
t
文本模式,字符流,将文件的字节按照某种字符编码理解,按照字符操作。open默认mode为rt
b
二进制模式,字节流,将文件按照字节理解,与字符编码无关,二进制模式操作时,字节操作使用bytes类型
+
为r、w、a、x提供缺失的读写功能,但获取文件对象依旧按照r、w、a、x自己的特征,不能单独使用
文件指针
指向当前字节位置
mode=r,指针起始位置在0
mode=a,指针起始位置在EOF
tell():显示指针当前位置
seek(offset[,whence]):移动文件指针位置。offset表示偏移多少字节,whence从何处开始
文本模式下
whence=0,缺省值,表示从头开始,offset只能为正整数
whence=1,表示从当前位置开始,offset只能为0
whence=2,表示从EOF开始,offset只能为0
只支持从开头向后偏移的方式
二进制模式下
whence=0,表示从头开始,offset只能为正整数
whence=1,表示从当前位置开始,offset可正可负
whence=2,表示从EOF开始,offset可正可负
向后seek可以超界,向前不能超界,会抛异常
buffering:缓冲区
-1表示使用缺省大小的buffer。若为二进制模式,使用io.DEFAULT_BUFFER_SIZE值,默认为4096或8192;若为文本模式,如果是终端设备,则为行缓存方式,如果不是则使用二进制模式的策略
0:只在二进制模式下使用,表示关闭buffer
1:只在文本模式下使用,表示使用行缓存,即见到换行符就flush
>1:大于1的数值用于指定buffer的大小
Buffer缓冲区
一个内存空间,FIFO队列,只有缓冲区满了或者达到阈值,数据才会flush到磁盘中
flush():将缓冲区数据写入磁盘
close():关闭前调用flush()
buffering |
作用 |
buffering=-1 |
t和b,都是io.DEFAULT_BUFFER_SIZE |
buffering=0 |
t:不支持;b:关闭缓冲区 |
buffering=1 |
t:行缓冲,遇到换行符才flush;b:1个字节 |
Buffering>1 |
t:io.DEFAULT_BUFFER_SIZE,flush完后把当前字符串写入磁盘 |
总结
文本模式:一般使用默认缓冲区大小
二进制模式:一个个字节的操作,可以指定buffer的大小
一般默认缓冲区大小是比较好的选择,一般不调整
一般编程中,明确知道需要写磁盘的时候,都会手动调用flush,而不是等到自动flush或close的时候
encoding
编码,仅文本模式使用。None表示使用缺省编码,和操作系统有关,Windows:GBK、Linux:UTF-8
errors
何种编码错误将被捕获
None和strict表示有编码错误将抛出ValueError;ignore表示忽略
newline
文本模式中,换行的转换。可以为None、””、’\r’、’\n’、’\r\n’
读时,None表示’\r’、’\n’、’\r\n’都被转换成’\n’;””表示不会自动转换通用换行符;其他合法字符表示换行符就是指定字符,就会按照指定字符进行分行
写时,None表示’\n’都会被替换为系统缺省行分隔符os.linesep;’\n’或”表示’\n’不替换;其他合法字符表示’\n’会被替换为指定的字符
closefd
关闭文件描述符,True表示关闭它。False会在文件关闭后保持该描述符,fileobj.fileno()查看
read
read(size=n):size表示读取多少个字符或字节,复数或None表示读取到EOF
readline(size=n)
一行行读取文件内容,size设置一次读取行内几个字符或字节
write
write(s):把字符串s写入到文件中并返回字符的个数
writelines(lines):将字符串列表写入到文件
close
flush并关闭文件对象
文件已经关闭,再次关闭没有任何效果
其他
seekable():是否可seek
readable():是否可读
writable():是否可写
closed:是否已经关闭
上下文管理
异常处理
当出现异常的时候,拦截异常
上下文管理
特殊语法,交给解释器去释放文件对象
使用with…as关键字
上下文管理的语句块并不会开启新的作用域
with语句块执行完的时候,会自动关闭文件对象
StringIO
io模块中的类
from io import StringIO
在内存中开辟一个文本模式的buffer,可以像文件对象一样处理
当close方法被调用时,该buffer会被释放
操作
getvalue():获取全部文件内容,和文件指针位置无关
好处
一般磁盘的操作比内存的操作要慢得多,内存足够的情况下,一般的优化思路是少落地,减少磁盘IO的过程,可以大大提高程序的运行效率
BytesIO
io模块中的类
from io import BytesIO
在内存中开辟一个二进制模式的buffer,可以像文件对象一样处理
当close方法调用的时候,该buffer会被释放
操作
getvalue():获取全部文件内容,和文件指针位置无关
file-like对象
类文件对象,可以像文件对象一样处理
socket对象、输入输出对象(stdin、stdout)都是类文件对象
原创文章,作者:ZBD20,如若转载,请注明出处:http://www.178linux.com/97325