1、文件操作
1.1 冯诺依曼体系结构(五大结构:输入输出设备、存储器、运算器、控制器)
- CPU 由运算器和控制器组成:
1、运算器:完成各种算术运算、逻辑运算、数据传输等数据加工处理;
2、控制器:控制程序的执行;
3、存储器:用于记忆程序和数据;例如,内存。
4、输入设备:将数据或者程序输入到计算机中;例如,键盘、鼠标。
5、输出设备:将数据或者程序的处理结果展示给用户;例如,显示器。
扩展:(一般说 IO 操作,指的是文件 IO ,如果指的是网络 IO,都会直接说网络 IO ;数据落地指的是,将内存中的数据存储到本地磁盘中;)
1.2 文件 IO 常用操作
- open:打开
- read:读取
- write:写入
- close:关闭
- readine:行读取
- readines:多行读取
- seek:文件指针操作
- tell:指针位置
1.2.1 打开操作
open(file,mode=’r‘,buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)
file:文件 mode:模式 buffering:缓冲 encoding:编码 newline:换行符
file = Path(路径)打开一个文件,打开或者要创建的文件名,打开后返回一个文件对象(流对象)和文件描述;
- 文件使用完关闭;
- 文件操作中,最常用的操作就是读和写;
- 文件访问的模式有两种:文本模式(t)和 二进制模式(b);
- 不同模式下,操作函数不尽相同,表现的结果也不一样;
1.2.2 open的参数
- open 默认是只读模式 r 打开已经存在的文件。
- r :只读打开文件,如果使用 write 方法,会抛异常。如果文件不存在,抛出 FileNotFoundError 异常;
- w :表示只写方式打开,如果读取则抛出异常,如果文件不存在,则直接创建文件,如果文件存在,则清空文件内容;
- file:打开或者要创建的文件名。如果不指定路径,默认是当前路径;
- mode模式
- r:缺省的,表示只读打开
- w:只写打开(创建空白纸)
- x:创建并写入一个新文件,如果文件以存在则抛异常;(只会创建新文件,也就是不存在的文件)FileExistsError 文件已存在
- a:写入打开,如果文件存在,则追加( append )
- b:二进制模式
- t:缺省的,文本模式
- +:读写打开文件。给原来只读,只写方式打开提供缺失的读或者写能力;
w、x、a 都是只写模式的;如果文件不存在,则生成新的文件;
w 不论文件存在与否都会生成全新文件内容;
a 不管文件是否存在,都能在打开的文件尾部追加;
x 必须要求文件不存在,自己造一个新文件;
+ 为 r、w、a、x 提供缺失的读或写功能,但是,获取文件对象依旧按照 r、w、a、x 自己特征。+ 不能单独使用,可以认为它是为前面的模式字符做增强功能的。
1.3 文本模式(t)和 二进制模式(d)
- 文本模式 t 字符流:将文件的字节按照某种字符编码理解,按照字符操作。open 的默认mode就是 rt ;
- 二进制模式 b 字节流:见文件就按照字节理解,与字符编码无关。二进制模式操作时,字节操作使用 bytes 类型;
- Linux 默认编码是 UTF-8 ,Windows 默认编码是 gbk;(utf-8 汉字占三个字节,gbk 汉字占两个字节)
- + 为 r、w、a、x 提供缺失的读或写功能,但是,获取文件对象依旧按照 r、w、a、x 自己的特征。+ 不能单独使用,可以认为他是为前面的模式字符做增强功能的。
2、 文件指针
文件指针,指向当前字节位置
- tell():显示指针当前位置;
- seek(offset [,whence ]):移动文件指针位置。offset偏移多少字节,whence从哪里开始(whence只有0:起始,1:当前,2:末尾 三个数字);
- 文本模式下当 whence 0 缺省值,表示从头开始,offest 只能正整数, whence 1 表示从当前位置,offest 只接受 0 whence 2 表示从 EOF 开始,offest 只接受 0 .
- 特别注意:文本模式 和 二进制模式情况不同;
- 二进制模式下 whence 0 缺省值,表示从头开始,offest 只能正整数 whence 1 表示从当前位置,offest 可正可负,whence 2 表示从EOF开始,offest 可正可负;
- 二进制模式支持任意起点的偏移,从头、从尾、从中间位置开始。向后seek可以超界,但是向前seek的时候,二进制模式 和 文本模式都不能超界,否则抛异常;
文本模式 | 二进制模式 | |
whence 0:头 | offest 只能正整数 | offest 只能正整数 |
whence 1:当前 | offest 只接受0 | fooest 可正可负 |
whence 2:尾 | offest 只接受0 | fooest 可正可负 |
3、buffering:缓冲区
-1 表示使用缺省值大小的buffer。如果是二进制模式,使用 io.DEFAULT_BUFFER_SIZE 值(缺省缓冲区大小,字节),默认是4096 或者 8192.如果是文本模式,如果是终端设备,是行缓存方式,如果不是,则使用二进制模式的策略。
- 0 只在二进制模式使用,表示 关buffer
- 1 只在文本模式使用,表示使用行缓冲。意思就是见到换行符就 flush
- 大于 1 用于指定buffer的大小,一般不指定,使用默认值;
- buffer 缓冲区一个内存空间,一般来说是一个 FIFO 队列,到缓冲区满了或者达到阈值,数据才会 flush 到磁盘。
- flush() 将缓冲区数据写入磁盘 ,close() 关闭前会调用 flush()
- buffering = 0 ,这是一种特殊的二进制模式,不需要内存的 buffer,可以看做是一个 FIFO 的文件;
buffering | 说明 |
buffering = -1 | t 和 b,都是 io.DEFAULT_BUFFER_SIZE |
buffering = 0 | b 关闭缓冲区 t 不支持 |
buffering = 1 | b 就1个字节 t 行缓冲,遇到换行符才 flush |
buffering > 1 | b 模式表示行缓冲大小。缓冲区的值可以超过 io.DEFAULT_BUFFER_SIZE,直到设定的值超出后才把缓冲区flush t 模式,是 io.DEFAULT_BUFFER_SIZE字节,flush完后把当前字符串也写入磁盘; |
- 文本模式,一般都用默认缓冲区大小;
- 二进制模式,是一个个字节的操作,可指定buffer的大小;
- 一般来说,默认缓冲区大小是个比较好的选择,除非明确知道,否则不调整它;
- 一般编程中,明确知道需要写入磁盘了,都会手动调用一次 flush,而不是等到自动 flush 或者 close 的时候;
4、encoding:编码,仅文本模式使用
None 表示使用缺省编码,依赖操作系统。 windows 默认的是gbk编码、linux 默认是utf-8编码;
5、其他参数
- errors 什么样的编码错误将被捕获 None 和 stric 表示有编码错误将抛出 ValueError 异常;ignore 表示忽略;
- newline 文本模式中,换行的转换。可以为 None、“ ”空串、’ \r '、' \n '、' \r\n ' 读时
- None表示 ’ \r '、' \n '、' \r\n ' 都被转换为 ’ \n ‘ ;
- “ ” 空串表示不会自动转换通用换行符;
- 其他合法字符表示换行符就是指定字符,就会按照指定字符分行写
- closefd 关闭文件描述符。True 表示关闭它,False 会在文件关闭后保持这个描述符。fileobj.fileno()查看;
- read( size= -1 ):size表示读取的多少字符或字节;负数或者None表示读取到EOF;
- readline( size=-1 ):一行行读取文件内容。size设置一次能读取行内几个字节 或 字符;
- readlines( hint=-1 ):读取所有行的列表。指定 hint 则返回指定的行数;
- write(s),把字符串s写入到文件中并返回字符的个数 writelines(lines),将字符串列表写入文件;
- close :flush 并关闭文件对象。文件已经关闭,再次关闭没有任何效果;
名称 | 说明 |
seekable() | 是否可seek |
readable() | 是否可读 |
writeable() | 是否可写 |
closeable() | 是否已经关闭 |
6、with...as:上下文管理(一种特殊的语法,交给解释器去释放文件对象)
try: finally: 块异常处理;
上下文管理:
- 使用 with...as 关键字;
- 上下文管理的语句块并不会开启新的作用域;
- with 语句块执行完的时候,会自动关闭文件对象;
- 另一种写法:eg:f1 = open( 'test' )
with f1:
f1.write(" abc ")
- 对于类似于文件对象的 IO 对象,一般来说都需要在不使用的时候关闭、注销,以释放资源;
- IO 被打开的时候,会获得一个文件描述符。
- 计算机资源是有限的,所以操作系统都会做限制。就是为了保护计算机的资源不要被完全耗尽,计算机资源是共享的,不是独占的;
- 一般情况下,除非特别明确的知道资源情况,否则不要提高资源的限制来解决问题;