文件管理

文件操作

文件IO常用操作

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

打开文件

open(file, mode = 'r', buffering = -1, encoding = None, errors = None, newline = None, closefd = True,opener = None)
file : 文件名称或者是文件路径
mode : 文件模式
buffering : 缓冲区
encoding : 编码模式,utf-8 编码,Gbk 编码

打开一个文件,返回一个文件对象(流对象)和文件描述符。打开文件失败,则返回异常
基本使用
创建一个文件test,然后打开它,用完###关闭###
f = open('test') # file 对象
print(f.read()) # 读取文件
f.close() # 关闭文件
在上条语句中 打开test文件,mode 为默认的'rt'模式
文件操作中,最常用的操作就是读和写
文件访问的模式有两种 : 文本模式和二进制模式。不同模式下,操作函数不尽相同,表现得结果也不一样
windows 中使用 codepage 代码页,可以认为每个代码页就是一张编码表。cp936等同于GBK

open

file
打开或者要创建的文件名。如果不指定路径,默认是当前路径

mode 模式

 描述字符        意义
    r            缺省的,表示只读打开
    w            只写打开
    x            创建并写入一个新文件
    a            写入打开,如果文件存在,则追加
    b            二进制模式 ,不能单独使用
    t            缺省的,文本模式,不能单独使用
    +            读写打开一个文件。给原来只读、只写的方式打开提供缺失的读或者写的能力,不能单独使用
 在上面例子中,可以看到默认是文本打开模式,且是只读的
 open 默认是只读模式r打开已经存在的文件
   
   r 模式
     只读打开文件,如果使用write方法会抛异常
     如果文件不存在,则会抛出 FileFoundErroor异常

   w 模式
     表示只写方式打开,如果读取则抛异常
     如果文件不存在,则直接创建文件
     如果文件存在,则清空文件内容

   x 模式
     文件不存在,创建文件,并只写方式打开
     文件存在,则抛出FileExistsError
   a 模式
     文件存在,只写打开,追加内容
     文件不存在,则创建后,只写打开,追加内容

 r 是只读,wxa都是只写
 wxa 模式都可以产生新文件
     w 不管文件存在与否,都会产生全新内容的文件
     a 不管文件是否存在,都能在打开文件尾部追加
     x 必须要求文件实现不存在,自己要造一个新文件
  
   t 模式
      按照字符模式操作
   b 模式
      与字符编码无关。二进制模式操作,与字符编码无关 ,bytes类型
   + 模式
      为 r,w,a,x提供缺失的读或者写的功能,但是获取文件对象依旧按照r,w,a,x 自己的特征
      + 模式不能单独使用,可以认为它是为前面的模式字符做增强功能的
文件指针
文件指针,指向当前文件字节的位置
  mode = r ,指针起始在0
  mode = a ,指针起始在EOF
  tell() 显示指针当前位置

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

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

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

二进制模式下
whence 0 缺省值,表示从头开始,offset只能正整数
whence 1 表示从当前位置,offset 可正可负
whence 2 表示从EOF 开始,offset可正可负
二进制模式支持任何模式的偏移,从头,从尾,从中间开始
向后 seek 可以超界,但是向前seek 的时候,不能超界,否则抛异常

buffering
-1  表示使用缺省值大小的buffer,如果是二进制模式,使用io.DEFAULT_BUFFER_SIZE值,

默认是4096或者8192.
如果是文本模式,如果是终端设备,是行缓存方式,如果不是,则使用二进制模式的策略

  0 只在二进制模式使用,表示关buffer
  1 只在文本模式使用,表示使用行缓冲,意思就是见到换行符就是flush
  大于1,用于指定buffer的大小
buffer 缓冲区

缓冲一个内存空间,一般来说是一个FIFO队列,到缓冲区满了或者到达阈值,数据才会flush到磁盘
flush() 将缓冲区写入磁盘
close() 关闭前会调用flush()
io.DEFAULT_BUFFER_SIZE 缺省缓冲区大小,字节

buffering = 0
这是一种特殊的二进制模式,不需要内存的buffer,可以看做是一个FIFO的文件

buffering 说明
buffering = -1 t和b,都是io.DEFAULT_BUFFER_SIZE

buffering = 0 b 关闭缓冲区
t 不支持

buffering = 1 t 行缓冲,遇到换行符才flush

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下缺省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’
会被替换为指定的字符

closefd

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

read

read(size = -1)
size 表示读取多少个字节或字符:负数或者None表示读取到EOF

行读取

readline(size = -1)
一行行读取文件内容。size设置一次能读取行内几个字节或字符

readlines(hint = -1)
读取所有行的列表。指定hint则返回指定的行数

write

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

close

flush 并关闭文件对象
文件已经关闭,再次关闭没有任何效果

其他

名称 说明
seekable() 是否可seek
readable() 是否可read
writeable() 是否可写
closed 是否已经关闭

上下文管理

with open(‘test’) as f :
print(f,f.closed)
f.write(‘abc’)
文件只读写入失败,但是可以关闭
f1 = open(‘test’)
with f1:
f1.write(‘ancd’)
文件只读写入失败,但是可以关闭
上下文管理
1.使用 with…as 关键字
2.上下文管理的语句块并不会开启新的作用域
3.with 语句块执行的时候,会自动关闭文件对象

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值