python---------------------文件操作

文件操作

冯诺依曼体系架构:

  • cpu由运算器和控制器组成
    运算器,完成各种算数运算,逻辑运算,数据传输,等数据加工处理
    控制器,控制base总线,各部件协调运行
    储存器,用于记忆程序和数据,例如内存
    输入设备,将数据或者程序输入到计算机中,例如 键盘,鼠标
    输出设备,将数据或程序的处理结果展示给用户,例如显示器,打印机等

一般说IO操作,指的是文件IO,如果指的是网络IO,都会直接说网络IO

文件IO常用操作

open打开
read读取
write写入
close关闭
readine行读取
readlines多行读取
seek文件指针操作
tell指针位置
  • 打开操作

open(file,mode=‘r’,buffering=1,encoding=None,errors=None,newline=None,closefd=True,opener=None)

打开一个文件,返回一个文件对象(流对象)和文件描述符.打开文件失败,则返回异常

基本使用:
创建一个文件test,然后打开它,用完必须要关闭

f = open('test')  #file对象
#windows <_io.TextIOWrapper name='d:/test' mode='r+' encoding='cp936'>
#linux <_io.TextIOWrapper name='d:/test' mode='r+' encoding='utf-8'>
print(f.read())  #读取文件
f.close()  #关闭文件

文件操作中,最常用的操作就是读和写
文件访问的模式有两种:文本模式和二进制模式.不同模式下,操作函数不尽相同,表现的结果也不一样
注:
windows中使用codepage代码页,可以认为每一个代码页就是一张编码表,

open的参数

open(file,mode=‘r’,buffering=1,encoding=None,errors=None,newline=None,closefd=True,opener=None)

  • file
    打开或者要创建的文件名.如果不指定路径,默认就是当前路径下
  • mode模式
描述字符意义
r缺省的,表示只读打开文件
w只写打开
x创建并写入一个新文件
a写入打开,如果文件存在,则追加
b二进制模式
t缺省的,文本模式
+读写打开一个文件,原来只读,只写方式打开提供缺失的读或者写能力

在上面的例子中,可以看到默认的是文本打开模式,且是只读的.

open默认是只读模式r打开已经存在的文件

  • r模式
    只读打开文件,如果使用write方法,会抛异常
    如果文件不存在,抛出FileFoundError
  • w模式
    表示只写方式打开,如果读取则抛出异常
    如果文件不存在,则直接创建文件
    如果文件存在,则清空文件内容
#r模式
f = open('test')   #只读还是只写?
f.read()
f.write('abc)
f.close()

f = open('test','r')
f.write('abc')
f.close()

# W模式
f = open('test','w')
f.write('abc')
f.close()
  • x模式
    文件不存在,创建文件,并以只写方式打开
    文件存在,抛出FileExistsError异常
f = open('test2','x')
f.read() #
fwrite('abcd')
f.close()

f = open('test','x') #
  • a模式
    文件存在,只写打开,追加内容
    文件不存在,则创建后,只写打开,追加内容
f = open('test2','a')
f.read()

f.write('abcd')
f.close()
  • r是只读,wxa都是只写.
    wxa模式都可以产生新文件
    W不管文件存在与否,都会生成全新内容的文件
    a不管文件是否存在,都能在打开的文件尾部追加
    x必须要求文件事先不存在,自己造一个新文件
  • 文本模式t
    字符流,将文件的直接按照某种字符编码理解.按照字符操作,open的默认mode就是rt
  • 二进制模式b
    字节流,将文件就按照字节理解,与字符编码无关.二进制模式操作是,字节操作使用bytes类型
f = open('test3','rb')   #二进制只读
s = f.read()
print(type(s))           # bytes
f.close()

f = open("test","wb")
s = fwrite("中华".encode())
print(s)
f.close()
  • +模式
    为r,w,a,x提供确实的读或写功能,但是,获取文件对象依旧按照r,w,a,x自己的特征
    +模式不能单独使用,可以认为它是为前面的模式字符做增强功能

文件指针

文件指针,指向当前字节位置
seek(offset[,whence])
移动文件指针位置,gffest偏移多少字节mwhence从哪里开始

  • 文本模式下
    whence 0 缺省值,表示从头开始,offest只能正整数
    whence 1 表示从当前位置,offest只接受0
    whence 2 表示从EOF开始,offest只接受0
#文本模式
f = open("test4",'r+')
f.tell()    #起始
f.read()    
f.tell()    # EOF
f.seek(0)   # 其实
f.read()    
f.seek(2,0)
f.reaf()
f.seek(2,0)
f.seek(2,1)   #offset 必须为0
f.seek(2,2)   # offset必须为0
f.close()

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

  • 二进制模式下
    whence 0 缺省值,表示从头开始,offest只能正整数
    whence 1 表示从当前位置,offest可正可负
    whence 2 表示从EOF开始,offest可正可负
f = open('test4','rb+')
f.tell()  #起始
f.read()
f.tell()  # EOF
f.write(b'abc')
f.seek(0)
f.seek(2,1)      #从当前位置向后2
f.read()
f.seek(-2,1)     #从当前位置向前2

f.seek(2,2)      #从EOF开始向后2
f.seek(0)
f.seek(-2,2)     # 从EOF开始向前2
f.read()    

f.seek(-20,2)    #OSErroe
f.close()

buffering:缓冲区

-1表示使用缺省大小的buffer.如果是二进制模式,使用io.DEFAULT_BUFFER_SIZE值,默认是4096或者8192
如果是文本模式,如果是终端设备,是行缓存方式,如果不是,则使用二进制模式的策略

  • 0,只在二进制模式使用,表示关buffer
  • 1,只在文本模式使用,表示使用行缓冲,意思就是见到换行符就flush
  • 大于1,用于指定buffer的大小
    buffer缓冲区
    缓冲区一个内存空间,一般来说是一个FIFO队列,到缓冲区满了或者达到阀值,数据才会flaush到磁盘
    fluash()将缓冲区数据写入磁盘
    close()关闭前会调用flush()

io.DEFAULT_BUFFER_SIZE 缺省缓冲区大小,字节

import io
f = open('test','w+b')
print(io.DEFAULT_BUFFER_SIZE)
f.write("magedu.com",encode())
#cat test4
s.seek()
#cat test4
f.write("www.python.com",encode())
f.flush()
f.close()
f = open('test4','w+b',4)  #缓存区大小
fwrite(b'pyt')
#cat test4
f.write(b'hon')
#cat test4
f.close()
buffering说明
buffering = -1文本和二进制都是使用缺省值
buffering = 0b关闭缓冲区,t不支持=0
buffering = 1b缓冲区为1,文本模式有换行符写入
buffering > 1b缓冲区指定缓冲字节大小,对文本模式没有用,使用缺省值
  • encoding:编码,仅文本模式使用
    None表示使用缺省编码,依赖操作系统.windows,linux下测试如下代码
f = open('test','w')
f.write('啊')
f.close()

windows下缺省GBK,cp936(0xB0A1),linux下缺省UTF-8(0XE5 95 8A)

  • errors
    None和starict表示有编码错误将抛出valueerror异常,ignore表示忽略
  • newline
    文本模式中,换行的转换,可以为none,‘空串’,’\r’,’\n’,’\r\n’
    读时,none表示\r,\n,\r\n都被转换为\n,表示不会自动转换通用换行符,其他合法字符表示换行符就是指定字符,就会按照指定字符分行
    写时,none表示\n都会被替换成系统缺省行分割符分隔符
  • closefd
    关闭文件描述符,True表示关闭它,False会在文件关闭后保持这个描述符.

文件对象

  • read
    read(size=-1)
    size表示读取的多少个字节或字符,负数或者none表示读取到EOF
  • 行读取
    readline(size=-1)
    一行行读取文件内容,size设置一次能读取行内几个字符或者字节
    readline(hint=-1)
    读取所有行的列表,指定hint则返回指定的行数
  • write
    whrite(s),把字符串s写入文件中并返回字符的个数
    writelines(lines),将字符串列表写入文件
f = open('test','w+')

lines = ['abc','123\n','python']
f.writelines(lines)

f.seek(0)
print(f.read())
f.close()
  • close
    flush并关闭文件对象

文件以关闭的,再次关闭没有任何效果

上下文管理

每一个文件打开都有一个文件标识符标记,当文件打开过多,或者文件标识符不够时,会报"too many open files:‘test’"

  • 异常处理
    当出现异常的时候,拦截异常.但是,因为很多代码都可能出现oserror异常,还不好判断就是因为资源限制产生的
f = open('test')
try:
    f.writr('abc')
finally:
    f.close()

使用finallay可以保证打开的文件可以被关闭

  • 上下文管理
    一种特殊的语法,交给解释器去释放文件对象
with open('test') as f:
    f.write("abc")  #文件只读,写入失败

# 测试f是否关闭
f.closed 

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

f1 = open('test')
with f1:
    f1.write('abc')

# 测试f是否关闭
f.closed 

对于雷士文件对象的io对象,一般来说都需要在不适用的时候关闭,注销,以释放资源

IO被打开的时候,会获取一个文件描述符,计算机资源是有限的,所以操作系统都会做出显著,就是为了保护计算机的资源不要被完全耗尽,计算机资源是共享的,不是独占的.
一般情况下,除非特别明确的织到资源情况,否则不要提高资源的限制值来解决问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值