Python文件操作

计算机体系架构

运算器:完成各种算术运算、逻辑运算、出具传输等数据加工处理

控制器:控制程序的执行

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完后把当前字符串写入磁盘
b:行缓冲,缓冲区的值可以超过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

发表评论

登录后才能评论

This site uses Akismet to reduce spam. Learn how your comment data is processed.

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班