python学习--文件操作

文件操作


冯诺依曼体系架构


python学习--文件操作
CPU由运算器和控制器组成:

  • 运算器,完成各种算数运算、逻辑运算、数据传输等数据加工处理
  • 控制器,控制计算机各部件协调运行
  • 存储器,用于记忆程序和数据,例如内存
  • 输入设备,将数据或者程序输入到计算机中,例如键盘、鼠标
  • 输出设备,将数据或程序的处理结果展示给用户,例如显示器、打印机等
  • 一般说IO操作,指的是文件IO,如果指的是网络IO,都会直接说网络IO

文件IO常用操作

python学习--文件操作

打开操作

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

  • 创建一个文件test,然后打开它,用完关闭

文件操作中,最常用的操作就是读和写。
文件访问的模式有两种:文本模式和二进制模式。不同模式下,操作函数不尽相同,表现的结果也不一样。

open的参数

file

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

mode模式
描述字符 意义
r 缺省的, 表示只读打开
w 只写打开
x 创建并写入一个新文件
a 写入打开, 如果文件存在, 则追加
b 二进制模式
t 缺省的, 文本模式
+ 读写打开一个文件, 给原来只读, 只写方式打开提供缺失的读或者写能力

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

  • 只读打开文件,如果使用write方法,会抛异常。
  • 如果文件不存在,抛出FileNotFoundError异常

w模式:

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

x模式:

  • 文件不存在,创建文件,并只写方式打开
  • 文件存在,抛出FileExistsError异常

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

二进制模式下:

  • whence0缺省值,表示从头开始,offest只能正整数
  • whence1表示从当前位置,offest可正可负
  • whence2表示从EOF开始,offest可正可负
  • 向后seek可以超界,但是向前seek的时候,不能超界,否则抛异常。
buffering: 缓冲区

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

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

flush()将缓冲区数据写入磁盘
close()关闭前会调用flush()

io.DEFAULT_BUFFER_SIZE缺省缓冲区大小,字节
python学习--文件操作
似乎看起来很麻烦,一般来说,只需要记得:

  • 1.文本模式,一般都用默认缓冲区大小
  • 2.二进制模式,是一个个字节的操作,可以指定buffer的大小
  • 3.一般来说,默认缓冲区大小是个比较好的选择,除非明确知道,否则不调整它
  • 4.一般编程中,明确知道需要写磁盘了,都会手动调用一次flush,而不是等到自动flush或者close的时候
encoding:编码,仅文本模式使用

None表示使用缺省编码, 依赖操作系统windows下缺省GBK(0xB0A1), 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会在文件关闭后保持这个描述符。fileobj.fileno()查看

read操作


read(size=-1)

size表示读取的多少个字符或字节;负数或者None表示读取到EOF

行读取


readline(size=-1)

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

读取所有行的列表。指定hint则返回指定的行数。

write操作


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

close操作


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

其他


python学习--文件操作

上下文管理

上下文管理:

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

对于类似于文件对象的IO对象,一般来说都需要在不使用的时候关闭、注销,以释放资源。

IO被打开的时候,会获得一个文件描述符。计算机资源是有限的,所以操作系统都会做限制。就是为了保护计算机的资源不要被完全耗尽,计算资源是共享的,不是独占的。

一般情况下,除非特别明确的知道资源情况,否则不要提高资源的限制值来解决问题。