1、冯诺依曼体系
Cpu由运算器和控制器组成:
运算器,完成各种算数操作、逻辑运算、数据传输等数据加工处理。
控制器,控制程序的执行。
存储器,用于记忆程序和数据,例如内存。
输入设备,将数据或者程序输入到计算机中,例如键盘,鼠标。
输出设备:将计算机处理结果 展示给用户,例如显示器,打印机等。
2、一般说IO操作,指的是文件IO,如果指的是网络IO,那么就是网络IO操作。
3、文件IO常用操作
column |
column |
open |
打开 |
read |
读取 |
write |
写入 |
close |
关闭 |
readline |
行读取 |
readlines |
多行读取 |
seek |
文件指针操作 |
tell |
指针位置 |
4、打开操作
Open(file,mode=’r’,buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)
Open 打开一个文件,返回一个文件对象(流对象)和文件描述符,打开文件失败,返回异常。
基本使用:
f = open('test')
print(f.read())
f.close
文件操作中,最常用的操作就是读和写。
文件的访问模式也有两种:文本模式和二进制模式。不同模式,函数操作不尽相同,表现的结果也不一样。
5、poen的参数
1)file:
打开或者创建的文件名,如果不指定路径,默认是当前路径。
2)mode模式
描述字符 |
意义 |
r |
缺省的,表示只是打开 |
w |
只是写入的 |
x |
创建并写入一个新的文件 |
a |
写入打开,如果文件存在,则追加 |
t |
缺省的,文本模式 |
+ |
读写打开一个文件,给原来只读、只写方式打开缺失的读或者写的能力 |
3)编码
Windows下面:GBK CP936
Linux下面是:UTF-8
文件操作中,最常见的就是读和写。
文件访问的模式有两种:文本模式和二进制模式;不同模式下,函数的执行.
W特性是:没有的话创建,有的话直接覆盖。
Open默认是只读模式r打开已经存在的文件。
4)#基本练习
#只读的
f = open('test') #等价于 f = open(‘open’,‘r’)
f.read()
# f.write('abc')
f.close()
#只写
f = open('test','w')
print(f.write('abc'))
f.close()
Print 输入3,显示的是输入的是三个字符。
5)总结
Open模式是只读模式r打开已经存在的文件。
(1)r
只读打开文件,如果使用write方法,会抛出异常
如果文件不存在,抛出FileNotFoundError异常
(2)w
表示只写方式打开,如果读取则抛出异常。
如果文件不存在,则直接创建文件。
如果文件存在,则清空里面的内容。
(3)x
文件不存在直接创建。
文件存在的话直接抛出异常。
创建新文件是只写的。
f = open('test2','x')
#print(f.read())
print(f.write('abcd'))
f.close
(4) a
文件存在,只写打开,追加内容。
文件不存在,创建后,只写打开,追加内容。
f = open('test1','a')
# print(f.read())
f.write('abcd')
f.close()
(5)r 只读,wxa都是只写
wxa 都可以产生新文件;
w不管文件存在与否,都会生成全新内容的文件;
a不管文件是否存在,都能在打开的文件尾部追加;
x 必须要求文件事先不存在,自己造一个新的文件。
(6)文本模式t
字符流,将文件的字节按照某种字符编码理解,按照字符操作。Open的默认莫得就是rt。
默认都是文本字符。
(7)二进制模式b
字节流,将文件就按照字节理解,与字符编码无关,二进制模式操作时,字节操作使用beyes类型.
f = open('test1','rb')
s = f.read()
print(type(s))
print(s)
f.close()
控制台输出:
<class 'bytes'>
b'abcd'
f = open('test3','wb')
s = f.write("中国".encode())
print(s)
f.close()
控制台输出:
6
(8)+号模式功能
为r、w、a、x提供缺失的读写功能,但是,获取文件对象依旧按照r、w、a、x自己的特征。
+不能单独使用,可以认定他是为前面的模式做增强功能的。
f = open('test1','r+')
s = f.write('hijkl')
print(f.read())
f.close()
(9)b
里面是二进制字节,,其余是字符
Read(参数列表)
文本模式下指的是字符。
二进制 下指的字节。
6、文件指针
上面的例子中,说明有一个指针。
1) 文件指针,指向当前字节的位置
mode=r,指针起始在0
mode=a,起始位置在EOF
tell()显示指针所在位置。指的是字节的偏移量。
seek(offset[,whence]) 移动文件指针位置,offest偏移多少字节,whence是指在哪里开始。
2)文本模式下:
Whence为0的时候,文件开头向后偏移量。Offset只是接受正整数。
为1表示当前位置,offest只接受0
为2的时候表示从EOF开始,offest只接受0
3)二进制模式下:
Whence缺省值0,文件开头向后偏移,offest只是接受正整数。
为1表示当前位置,offest可以接受正负整数。
为2表示从EOF开始,offest可以接受正负整数。
二进制模式支持任意起点的偏移,从头、从尾,从中间位置开始,向后seek可以超界,但是向前就不可以,否则抛出异常.
f = open('test2','r+')
print(f.tell())
f.read()
print(f.tell())
f.seek(0)
print(f.read())
中文模式只是支持双字节便宜否则报错,因为中文都是双字节的、
7、buffering缓冲区
-1表示使用缺省大小的buffer,如果是二进制模式,使用io.DEFAULT_BUFFER_SIZE值。默认值4096或者8192.
如果是文本模式,如果是终端设备,是行缓存方式,如果不是,则使用二进制模式的策略。
0只在二进制模式使用,表示关buffer
1只在文本模式使用,表示行缓冲。遇到换行符的时候才flush。
大于1用于指定buffer。
buffer缓冲区:
缓冲区一个内存空间,一般来说是一个FIFO队列,到缓冲区满了或者达到阈值,数据才会到flush到磁盘。文本模式下不能关闭buffer。。
当缓冲区满了就该flush。
flush()将缓冲区数据写入磁盘。
close()关闭前会调用flush()
io.DEFAULT_BUFFER_SIZE缺省缓冲区大小、字节。
buffering |
|
buffering=-1 |
t和b,都是io.DEFAULT_BUFFER_SIZE |
buffering=0 |
b关闭缓冲区 t不支持 |
buffering=1 |
b就一个字节 t行缓冲,遇到换行符才flush |
Buffering>1 |
B模式表示行缓冲从大小,缓冲的值可以超过io.DEFAULT_BUFFER_SIZE,直到设置的值超出后才把缓冲区flush t 模式,是io.DEFAULT_BUFFER_SIZE |
Buffering=-1 t和b都是size
Buffering=0 b关闭缓冲区 t没有
Buffering=1 b就一个字节 t行换成,遇到换行符才flush
Buffering>1 b模式表示行缓冲大小。
f = open('test4','w+b')
print(io.DEFAULT_BUFFER_SIZE)
总结:
1、文本模式中,一般都默认使用缓冲区大小。
2、二进制模式。是一个个字节的操作,可以指定buffer的大小。
3、一般来说,默认缓冲区大小就是个比较好的选择,除非明确知道,否则不调整。
4、一般编程中,明确知道需要写磁盘了,都会手动调用一次flush,而不是等到自动flush或者close。
8、encoding
:编码,仅文本模式使用:
None表示缺省编码。依赖操作系统。Windows、linux下的如下代码。
Windows下缺省GBK()
Linux下缺省UTF-8
f = open('test2','w')
print(f.write('啊'))
# print(f.read())
f.close()
9、其它参数:
Errors:什么样的编码错误表示将被捕获。
None和strict表示有编码错误将抛出valueError异常,ignore表示异常。
10、Newline:
文本模式中,换行的转换,可以为None、空串””、’\r’、’\n’、’\r\n’
读时候,None表示’\r’,’\n’,’\r\n’都被转换为’\n’:”表示不会自动转换通用换行符,其它合法字符表表示换行符就是指定字符,就会按照指定字符分行。
写时,none表示’\n’都会被替换为系统缺省行分隔符os.linesep;’\n’或”表示’\n’不替换,其它合法字符表示’\n’会被替换为指定的字符。
11、Closedfd
关闭文件描述符,True表示关闭。False会在文件关闭后保持这个描述符,fileobj.fileno()查看这个特性。
12、Read
Read(size=-1) size表示读取的多少个字符或者字节,负数或者None表示读取到EOF
13、行读取:
Readline(size=-1) 一行行读取内容,size设置以后就按照要求设置的取几个字节或者字符。
Readlines(hint=1)
读取所有行的列表,指定hint()。
14、Write(写)
把字符串s写入到文件中并返回字符的个数
Writelines(lines),将字符串列表写入文件。
15、close
flush并关闭对象。
文件已经关闭,再次关闭没有任何效果。
16、其它
Seekable()是否可以seek
Readable()是否可读
Writable()是否可读
Closed是否已经关闭
17、上下文管理
1)异常处理,当出现异常的时候,拦截异常,但是,因为许多代码都可能出现OSError异常,不好判断因为资源限制产生的。
f = open('test')
try:
f.write('abc')
finally:
f.close()
使用finally可以保证打开的文件可以被关闭
2)上下文管理
一种特殊的语法,交给解释去去释放文件对象
with open('test') as f:
f.write('abc')
f.closed
f1 = open('test')
with f1:
f1.write('abc')
f.closed
With f:
文件管理就自持上下文管理,在退出with上下的时候,会调用close。
With open(‘test’) as f:
使用with ...as关键字。With...as不是函数。上下文管理的语句块并不会开启新的作用域。With语句块执行完的时候,会自动关闭文件对象。
对于类似于文件对象的IO对象,一般来说都需要在不使用的时候关闭、注销,以释放资源。
IO被打开的时候,会获得一个文件描述符,计算机资源是有限的,所以操作系统都会做限制,就是为了保护计算机的资源不要被完全的耗尽,资源是共享的,不是独占的。
一般情况下,除非特别声明情况下,不得提高资源的限制值来解决问题。