文件IO:文件操作

冯诺依曼体系解构

冯诺依曼体系

冯诺依曼体系5大部件:

CPU由运算器和控制器组成
  1. 运算器:完成各种算数运算,逻辑运算,数据传输等数据加工处理
  2. 控制器:控制程序的执行
  3. 存储器:用于记忆程序和数据,列如内存
  4. 输入设备:将数据或者程序输入到计算机中,列如键盘,鼠标
  5. 输出设备:将数据或程序的处理结果展示给用户,列如显示器,打印机等

文件IO的常见操作

 1. columm()		#column
 2. open()			#打开文件
 3. read() 			#读取文件
 4. write()			#写入文件
 5. clos()			#关闭文件
 6. readline()		#读取行
 7. readlines()		#读取多行
 8. seek()			#文件指针操作
 9. tell()			#当前指针位置

打开操作:open

open(file, mode = 'r', buffering = -1, encoding = None,errors = None, newline = None, closefd = True,opener = None):打开一个文件 返回一个文件对象(流对象)和文件描述符,打开文件失败,则返回异常。

open的参数

file:打开或者要创建的文件名,如果不知道路径,默认是当前路径

mode模式:

 1. r 模式:没有指定的话,表示只读打开
 2. w 模式:只写打开 如果文件存在 则冲开头写入
 3. x 模式:创建并写入一个新文件,如果文件已经存在则报错
 4. a 模式:写入打开,如果文件存在,则在文件后面追加内容
 5. b 模式:二进制模式,进行二进制操作
 6. t 模式:表示缺省的 不指定的话就是文本模式操作
 7. + 模式:如果是只读就给他加上写的功能,是只写就加上读的功能

open默认是只读模式 r 打开已经存在的文件。
r
只读打开文件,如果使用write方法,会抛异常。如果文件不存在,抛出FileNotFoundError异常
w
表示只写方式打开,如果读取则抛出异常
如果文件不存在,则直接创建文件
如果文件存在,则清空文件内容

a
文件存在,只写打开,追加内容
文件不存在,则创建后,只写打开,追加内容
r是只读,wxa都是只写。
wxa都可以产生新文件,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])

移动文件指针位置。offest偏移多少字节,whence从哪里开始。

文本模式下
whence 0缺省值,表示从头开始,offest只能正整数
whence 1表示从当前位置,offest只接受0
whence 2表示从EOF开始,offest只接受0

文本模式支持从开头向后偏移的方式。
whence为1表示从当前位置开始偏移,但是只支持偏移0,相当于原地不动,所以没什么用。
whence为2表示从EOF开始,只支持偏移0,相当于移动文件指针到EOF。
seek是按照字节偏移的。
read在文本模式是按照字符读取的。

**二进制模式下
whence 0缺省值,表示从头开始,offest只能正整数
whence 1表示从当前位置,offest可正可负
whence 2表示从EOF开始,offest可正可负

二进制模式支持任意起点的偏移,从头、从尾、从中间位置开始。
向后seek可以超界,但是向前seek的时候,不能超界,否则抛异常。

buffering:缓冲区

**-1表示使用缺省大小的buffer。如果是二进制模式,使用io.DEFAULT_BUFFER_SIZE值,默认是4096或者8192。如果是文本模式,如果是终端设备,是行缓存方式,如果不是,则使用二进制模式的策略。
0,只在二进制模式使用,表示关buffer
buffering=0
这是一种特殊的二进制模式,不需要内存的buffer,可以看做是一个FIFO的文件

1,只在文本模式使用,表示使用行缓冲。意思就是见到换行符就flush
大于1,用于指定buffer的大小
buffer缓冲区
缓冲区一个内存空间,一般来说是一个FIFO队列,到缓冲区满了或者达到阈值,数据才会flush到磁盘。
flush()将缓冲区数据写入磁盘
close()关闭前会调用flush()
io.DEFAULT_BUFFER_SIZE缺省缓冲区大小,字节
**

buffering 说明
  1. buffering = -1:t和b,都是io.DEFAULT_BUFFER_SIZE
  2. buffering = 0: b模式(关闭缓冲区),t模式(不支持)
  3. buffering = 1 :b(就1个字节) t(一行缓冲,遇到换行符才flush)
  4. buffering > 1: b模式表示缓冲大小,缓冲区的值可以超过io.DEFAULT_BUFFER_SIZE,直到设定的值后才把缓冲区flush。t 模式,是io.DEFAULT_BUFFER_SIZE字节,flush完成后把当前字符串也写入磁盘
    似乎看起来很麻烦,一般来说,只需要记得:
    1.文本模式,一般都用默认缓冲区大小
    2.二进制模式,是一个个字节的操作,可以指定buffer的大小
    3.一般来说,默认缓冲区大小是个比较好的选择,除非明确知道,否则不调整它
    4.一般编程中,明确知道需要写磁盘了,都会手动调用一次flush,而不是等到自动flush或者close的时候

encoding:编码,仅对文本模式使用

None表示使用缺省编码,依赖操作系统。windows,和linux系统下的编码不一样,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’会被替换为指定的字符

closed:关闭文件描述符,True表示关闭它。False会在文件关闭后保持这个描述符。fileobj.fileno()查看

read(size = -1):size表示读取的多少字符或者字节;负数或者None表示读取带结尾(EOF)

行读取(readline(size = -1)):一行行读取文件内容,size设置一次就能读取行内几个字符或者字节。readline(hint = -1):表示读取所有行的列表,指定hint则返回指定的行数。

write:写入操作

write(s),把字符串s写入到文件中并返回字符的个数
writelines(lines),将字符串列表写入文件。

close:关闭文件操作:flush(写入内存)并关闭文件对象,文件已经关闭,再次关闭没有任何效果

其他操作

 1. seekable()		#是否可seek
 2. readabel()		#是否可读
 3. writable()		#是否可写
 4. closed			#是否已经关闭了文件

上下文管理:在linux下执行

#下面必须这么写
lst= []
for_inrange(2000):
	lst.append(open('test'))
# OSError: [Errno 24] Too many open files: 'test'
print(len(lst))

lsof列出打开的文件,(如果sof没有就用 yum install losf 安装)

$ psaux |greppython
$ lsof-p9255|greptest |wc-l
$ ulimit-a

ps命令返回进程,grep出python进程ID
lsof -p进程号,列出该进程的所有文件描述符,grep出test文件文件描述符,wc统计ulimit -a查看所有限制。其中open files就是打开文件数的限制,默认1024

forxinlst:
	x.close()
	
将文件一次关闭,然后就可以继续打开了。再看一次lsof。

1、异常处理
当出现异常的时候,拦截异常。但是,因为很多代码都可能出现OSError异常,还不好判断异常就是应为资源限制产生的。

f=open('test')
try:
	f.write("abc")	#文件只读,写入失败
finally:
	f.close()	#这样才行
使用finally可以保证打开的文件可以被关闭

2、上下文管理一种特殊的语法,交给解释器去释放文件对象

delf
withopen('test')asf:
	f.write("abc")	#文件只读,写入失败
	
#测试f是否关闭
f.closed# f的作用域

上下文管理
1.使用with … as关键字
2.上下文管理的语句块并不会开启新的作用域
3. with语句块执行完的时候,会自动关闭文件对象另一种写法

f1=open('test')
withf1:
	f1.write("abc")	#文件只读,写入失败
	
#测试f是否关闭
f1.closed# f1的作用域

对于类似于文件对象的IO对象,一般来说都需要在不使用的时候关闭、注销,以释放资源。
IO被打开的时候,会获得一个文件描述符。计算机资源是有限的,所以操作系统都会做限制。就是为了保护计算机的资源不要被完全耗尽,计算资源是共享的,不是独占的。
一般情况下,除非特别明确的知道资源情况,否则不要提高资源的限制值来解决问题。

练习

指定一个源文件,实现copy到目标目录
def copy(src,dest):
    with open(src) as f1:
        with open(dest,'w') as f2:
            f2.write(f1.read())
copy('hello.txt','newfile.txt')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值