CPU构成: 运算器:完成各种算数运算、逻辑运算、数据传输等数据加工处理 控制器:控制程序的执行 存储器:用于记忆程序和数据,例如内存 输入设备:将数据或者程序输入到计算机中,例如:键鼠 输出设备:将数据或者程序处理结果展示给用户 例如:显示器、打印机等 一般I/O操作,指的是文件IO,若是网络IO会直接称呼网络IO文件IO常用操作: Open :打开 Read :读取 write:写入 close:关闭readline: 行读取readlines:多行读取seek:文件指针操作tell:指针位置open(file, mode=’r’, buffering = -1, encoding= None, errors = None, newline = None, closefd = Ture, opener = None)打开一个文件,返回一个文件(流)对象和文件描述符。打开文件失败则返回异常F = open(‘test’) #file对象 -> 打开test文件f.read() 读文件f.close() 关闭文件文件的访问模式有两种: 文本模式和二进制模式不同模式下,操作函数不尽相同,表现的结果也不一样Open参数:file: 打开或者要创建的文件名,如果不指定路径,默认当前工作路径(相对路径)Mode —> 模式:#r 模式-> 可读不可写f = open('test') f.read()f.write('abc')#不可写f.close()f = open('test', 'r')#使用r 只读方式 不可写f.write('abc')f.close()#打开一个不存在的文件 报错f = open('test1', 'r') #w 模式f = open('test', 'w')f.write('ccc')f.close()>>>cat test>>> ccc#在使用一次写入功能 直接覆盖test为空f = open('test', mode = 'w')f.close()>>> cat test>>>#w 可以直接新建个test1 写入'123'f = open('test1', mode='w')f.write('123')f.close()>>>cat test1>>>123%open默认是只读模式r打开已经存在的文件。r: 只读打开文件,如果使用write方法,抛异常 如果文件不存在,抛FileNotFoundError异常w: 只写方式打开,读取则抛异常 文件不存在,可以直接创建文件 如果文件存在,清空文件内容-----------------------------------------------x: 文件不存在,创建文件,只可写入 文件存在,抛出FileExistsError异常f = open('test2', 'x')f.read()f.write('abcd')f.close()>>>cat test2>>>abcdf = open('test2', 'x')a: 文件存在,可写可打开,追加内容 文件不存在,则创建后,可写可打开,追加内容f = open('test3', 'a')f.read()f.write('zzzzzzz')f.close()>>cat test3>>>zzzzzzzf = open('test4', 'a')f.wirte('test4')f.close()>>>cat test4>>>test4总结: r是只读,wxa都是只写 wxa都可以产生新文件。 w不管文件存在与否,都会生成全新内容的文件 a不管文件是否存在,都能在打开的文件尾部追加内容 x必须要求文件事先不存在,自己创建一个新文件文本模式 t: 字符流,将文件的字节按照某种字符编码理解,按照字符操作。open默认mode是rt二进制模式 b: 字节流,将文件按照字节理解,与字符编码无关。二进制模式操作时,字节操作使用bytes类型f = open('test', 'wb')f.write('abc测试'.encode())f.close()f = open('test')f.read(3)>>>bc测f.read(1)>>>af.close()f = open('test', 'rb')f.read(1)>>>'a'f.read(3)>>>'bc\xe6'f.close()--------------------------------------------------f = open('test', 'r+')f.write('abc123')f.read()f.close()f = open('test', 'w+')f.write('abc123')f.read()f.close()f = open('test', 'a+')f.write('abc123')f.read()f.close()f = open('test2', 'x+')f.write('abc123')f.read()f.close()以上f.read都为空,但是cat可以显示内容+: 为r/w/a/x 提供缺失的读写功能(缺读给读,缺写给写),但是,获取文件对象依旧按照r/w/a/x自己的特征。+ 不能单独使用,可以认为它是为前面的模式字符做增强功能的。文件指针: 指向当前字节位置 mode = r 指针起始在0 mode = a 指针起始在EOF(文件末尾) tell() 显示指针当前位置 seek(offset[,whence]) 移动文件指针位置。offset 偏移x个字节文本模式下: whence 0 缺省值,表示从头开始,offset只能正整数 whence 1 表示从当前位置开始, offset 只接受0 whence 2 表示从EOF开始,offset只接受0test4 = ('test4') f = open('test4', 'r+') f.tell() #起始 0 f.read() #'test4' f.tell() # EOF 5 f.seek(0)# 0 f.read() # test4 f.seek(2,0) # 2 f.read() #st4 f.seek(2,0) #st4 f.seek(2,1) #Error offset 只能为0 f.seek(2,2) #Error offset 只能为0 f.close()中文 f = open('test4', 'w+') f.write('测试') f.tell() #6 f.close() f = open('test4', 'r+') f.read(3)#'测试' f.seek(1)#1 f.tell()#1 f.read()#Error f.seek(2)#2 f.close()文本模式支持从开头向后偏移的方式二进制模式: whence 0 缺省值,表示从头开始,offset只能正整数 whence 1 表示从当前位置开始,offset可正负 whence 2 表示从EOF开始,offset可正负f = open('test4', 'rb+')f.tell() #0f.read()#b'\xe6\xb5\x8b\xe8\xaf\x95'f.tell() #6f.write(b'abc')f.seek(0)#0f.seek(2,1)#2f.read()#b'\x8b\xe8\xaf\x95abc'f.seek(-2,1)#7f.seek(2,2)#9f.seek(0)#0f.seek(-2,2)#f.read()#'bc'f.seek(-20,2)#Error Invaild argumentf.close()buffering:缓冲区 -1 表示使缺省值大小的buffer,如果是而精致模式,使用io.defaults_buffer_size值,默认是4096或者8192如果是文本模式,如果是终端设备,是行缓存方式,如果不是则使用二进制的策略 0只在二进制模式使用,表示管buffer 1只在文本模式使用,表示使用行缓冲,意思就是见到换行符flush 大于1 用于指定buffer的大小buffer缓冲区: 缓冲一个内存空间,一般来说是一个FIFO队列,到缓冲区满了或者达到阈值,数据才会flush到磁盘flush() 将缓冲区数据写入磁盘close() 关闭前会调用flush()io.DEFAULT_BUFFER_SIZE 缺省缓冲区大小,字节>>>import io>>>io.DEFAULT_BUFFER_SIZE>>>8192buffering = -1 t和b,都是io.DEFAULT_BUFFER_SIZEbuffering = 0 b 关闭缓冲区,t不支持buffering = 1 b 就一个字节,t行缓冲,遇到换行符才flushbuffering > 1 b模式表示缓冲大小。缓冲区的值可以超过io.DEFAULT_BUFFER_SIZE,直到设定的值超出后才把缓冲区flush。 t模式,是io.DEFAULT_BUFFER_SIZE,flush完成后把当前字符串也写入磁盘总结: 1、文本模式,一般都用默认缓冲区大小 2、二进制模式,是一个个字节的操作,可以指定buffer的大小 3、默认缓冲区大小是个比较好的选择,除非明确的知道,否则不调整 4、明确知道需要写磁盘,都会手动调用一次flush,而不是等到自动flush或者close的时候上下文管理:ulimit -a查看所有限制,其中open files就是打开文件数的限制,默认1024异常处理:当出现异常的时候,拦截异常,但是因为很多代码都可能出现oserror异常,不好判断异常,是因为资源限制产生的f = open('test')try: f.write('abc') #文件只读,写入失败finally: f.close() #正确做法使用finally可以保证打开的文件可以被关闭上下文管理,一种特殊的语法,交给解释器取释放文件对象使用with...as关键字上下文管理的语句块并不会开启新的作用域with语句块执行完的时候,会自动关闭文件对象def fwith open('test')as f: f.write('hello') #文件只读,写入失败f.closed(测试f是否关闭)