python —— I/O

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
>>>abcd

f = open('test2', 'x')

a:
	文件存在,可写可打开,追加内容
	文件不存在,则创建后,可写可打开,追加内容

f = open('test3', 'a')
f.read()

f.write('zzzzzzz')
f.close()

>>cat test3
>>>zzzzzzz

f = 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)
>>>a
f.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只接受0
test4 = ('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() #0
f.read()#b'\xe6\xb5\x8b\xe8\xaf\x95'
f.tell() #6
f.write(b'abc')
f.seek(0)#0
f.seek(2,1)#2
f.read()#b'\x8b\xe8\xaf\x95abc'
f.seek(-2,1)#7
f.seek(2,2)#9
f.seek(0)#0
f.seek(-2,2)#
f.read()#'bc'
f.seek(-20,2)#Error  Invaild argument
f.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
>>>8192

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,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 f
with open('test')as f:
     f.write('hello')     #文件只读,写入失败
f.closed(测试f是否关闭)
 

  

posted @ 2017-10-25 19:06  zzzzz~  阅读(209)  评论(0编辑  收藏  举报