Python的文件操作

1. 冯诺依曼体系

至今为止, 用的依旧是冯诺依曼体系:
这里写图片描述

输入设备(Input equipment) : 输入信息, 来让计算机进行操作的.

输出设备(Output equipment): 计算机通过输出设备, 把运算结果给我们看.
(上面两个合起来称为计算机的IO设备.)

储存器(Memory): 输入设备输入的数据, 或者给出的指令, 都要存在储存器里, 然后由CPU(Central Process Unit), 也就是中央处理器使用.

运算器: 拿到数据之后, 进行处理, 把运算结果返回给储存器

控制器: 从储存器里面获取指令, 然后根据指令, 对IO设备, Memory进行控制, 使它们协调完成计算机的.
(上面两个合起来称为计算机的CPU)

一些其他需要注意的:

CPU是计算机中运转最快的设备, 它不能直接从磁盘中取得数据, 因为磁盘的IO速度太慢了(通过磁信号), 所以只能把数据从磁盘中取出, 放到一个内存中(也就是储存器), 内存的IO速度虽然也不及CPU的运算速度, 但是比磁盘已经好太多了.

十几个G的蓝光文件, 播放的时候, 不可能一次把数据读取完, 应该是读取一批, 进入CPU进行渲染, 呈现给我们看, 期间同时读取下一批.

主板上的东西叫做内存存储芯片, 和上面的储存器是不一样的: 内存存储芯片掉电不丢失, 而内存掉电丢失数据.

所有的数据都是0和1的组成, 光盘是通过表面上面的凹凸不平来表示0和1.

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

代码提速的瓶颈往往都在IO上面.

文件存在磁盘这个过程, 俗称落地(input), 存储到掉电不丢失的设备中.

IO操作时, 把文件当成“流”来处理. (没太理解)

2. Python中的文件操作

2.1 open()

完整版是:
open(file,mode=’r’,buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)

用来打开文件, 根据参数来创造一个文件对象.

2.1.1 file参数

通过位置传参, 没有缺省值, 所以是必须由我们输入的参数.

可以写相对路径或者是绝对路径, 就是打开这个文件.

f = open('D:/test.txt')
f 
<_io.TextIOWrapper name='D:/test.txt' mode='r' encoding='cp936'>

2.1.2 mode参数

这个是以什么模式来打开这个文件, 我觉得他是open()函数里最重要的参数.

模式有:

  • ‘r’
    “open for reading (default)”
    就是说这个模式下打开的话, 只能阅读文件的内容, 但是不能对文件的内容进行修改.
    ‘r’模式是open()函数的mode的缺省值, 也就是如果没有指定, 打开的文件就只能阅读.
    如果以’r’模式打开文件, 但是文件不存在, 就会报错”No such file or directory”.

  • ‘w’
    “open for writing, truncating the file first”
    帮助文档说, 先把文件截断. 没太看懂.
    以这个模式打开, 这个文件就只能写, 但是不能读.
    ‘w’模式有创建文件的功能, 如果file参数的实参不存在, 就创建这个文件.
    ‘w’模式是要在一个空白的文件中写入内容, 以这个模式打开文件, 如果文件存在, 就会把文件的内容全部清除, 然后从头开始写入, 所以慎重!!!

  • ‘x’
    open for exclusive creation, failing if the file already exists.
    这个模式只能创建新的文件, 如果file参数的实参已经存在, 就会报错”File exists.”

  • ‘a’
    “open for writing, appending to the end of the file if it exists.”
    这个模式只能写, 不能读.
    如果文件存在, 在文件内容的尾部追加内容(写入).
    如果文件不存在, 就创建一个文件, 然后在开头写入(因为尾部就是开头).

这四个是mode的基础模式, 总的来看有三大功能: 创建, 阅读, 写入.
除了这四个基础模式, 还有四个附加模式, 一般要加在基础模式的后面:

  • ‘t’
    text mode (default)
    是open()的默认模式, 以字符的模式打开文件, 就是说显示的都是经过编码之后的字符. (按什么编码呢???)

  • ‘b’
    binary mode
    是把文件的内容以字节来显示, 也就是以一个个的二进制数字来显示.
    ‘b’模式下, 要写入bytes, 不能直接写str.

  • ‘+’
    open a disk file for updating (reading and writing)
    这个附加模式一写, 缺啥补啥, 只能写的话, 就补一个读的功能. 只能读的话, 就补一个写的功能.
    但是’r+’的写, 是从头开始写, 会覆盖原有的字节.

  • ‘U’
    universal newlines mode (deprecated)
    这个吧, 讲实话我没看懂.

mode的缺省值是’rt’, 也就是只读, 以文本模式显示.

2.1.3 buffering参数

这个参数是控制缓冲的大小, 默认值-1.

就是说, 文件都是存在磁盘里的, 磁盘的IO比较慢, 所以给文件写入一些东西之后, 这些东西会暂存在内存中, 等确认完全输入完毕, 或者内存存不下了, 在写入磁盘里, 这样效率比较高, 毕竟运算器出来的数据, 是不能直接和磁盘交流的.

那么内存中放多少, 需要一个限定值, 这个值就是缓冲, 这块地方叫做缓冲区.

缓冲区可以认为是一个先进先出的队列, 也有其他的结构, 比如说环状的.

buffering要和’t’模式, ‘b’模式配合使用:
buffering=1, 只能再’t’模式下使用, 表示用行缓冲. 就是输入的文本, 碰到换行符/r /n就存入一次.
buffering=0, 只在二进制模式使用, 表示关闭buffer.
buffering=int, 就是输入一个整数, 就表示缓冲区是多少, 单位是字节.

2.1.4 encoding参数

这是参数只能在文本模式下使用, 可以把没有被编码的文件内容, 按照encoding指定的编码表来编码.
Windows系统下默认的编码表GBK.
‘utf8’和’utf-8’的意思是一样的.
一般在打开文件的时候, 把encoding写上, 是一个好习惯.

2.1.5 error参数

缺省值是None, None和’strict’是一样的效果, 就是说如果在编码时出现了错误, 立即捕捉错误并报出.
‘ignore’表示如果在编码时出现了错误, 就忽略.

2.1.6 newline参数

newline缺省值是None, 就是把换行符变成当前系统支持的换行符, 并且断开.
newline=” 表示什么都不做.
newline=’/r/n’ 就是以’/r/n’作为换行符断开.
newline=’/n’ 就是以/n作为换行符断开, 并且把换行符变成/n.

2.1.6 closefd参数

缺省值为True, 意思是在关闭这个文件时, 要不要删除文件描述符.
每个文件在打开的时候, 都会给一个文件描述符, 这个文件描述符在操作系统中是有限的, 所以最好是True, 也就是关闭文件之后要删除文件描述符.

2.2 文件对象的方法

先要声明, 在操作文件的时候, 有一个指针的概念, 有点类似于word或者txt里面的光标, 指针就是指明当前的位置在哪.

2.2.1 .read(size=-1)

读取文件的内容, size控制读取的字符个数或字节个数;
读完之后, 指针会指导尾部.

2.2.2 .write(‘context’)

给文件添加一些文本, ‘t’模式下写字符, ‘b’模式下写字节, 是在指针所在处往后写, 会覆盖后面的内容.
写完返回写入的字符数或者字节数个数.

2.2.3 .close()

关闭打开的文件, 文件用完了一定要关闭, 不然文件描述符不够用.

2.2.4 .closed

注意是没有括号的, 用来判断这个文件是否关闭.
关闭了返回True, 没关闭返回False.

2.2.5 file.seek(pos, whence=0)

设置指针的位置;
whence的值, 0代表文件开头, 2代表文件尾部, 1表示相对于当前位置.
pos是走多少步, 在文本模式下, 在1,2(也就是相对位置和尾部)不能走非0的pos, 就是不能动.
只有在字节模式下, 才能从后往前走, 就是pos为负数.
seek()不允许在0, 就是开始位置, 把指针向左移动
文件指针和字符无关, 指针每移动一步, 都是移动一个字节
文本模式, 读写操作的都是字符
字节模式, 读写操作的都是字节

2.2.6 file.tell()

查看指针的位置, 是当前位置, 按字节来数.

2.2.7 file.readline(size=-1)

一行一行的读,
size控制读几个字符,
立即返回一个列表

2.2.8 file.readlines(hint=-1)

把所有行显示出来,
放在一个列表里面,
hint控制读几行.

2.2.8 file.writelines()

把列表补进去
列表内元素必须是str
\n得自己补上

2.2.9 file.fileno()

查看文件对象的文件描述符

2.3 上下文管理

因为文件描述符是有限的, 所以文件用完之后必须关闭.
有时候吧, 就总忘了关. 自己忘了关, 就得靠程序来关.

小技巧
linux系统下:
• lsof 显示已经打开的文件;
• lsof | grep filename | wc -l | lsod -p
• ulimit -l 显示所有的限制

有两种方法可以保证一定关闭:

2.3.1 try…finally…结构

try:
    尝试执行的代码
finally:
    一定要执行的代码

比如这样:

try:
    f = open(.....)
    ....
finally:
    f.close() #返回值->True

这样不管try里面的代码如何, 最终都会执行f.close().

2.3.2 with语法

这个就叫上下文.
with后面的文件, 只要离开这个with的解构, 不管是在执行完with下面的操作, 还是执行到一般抛异常, 一定会关闭.

例一:

f = open('filename')
with f:
    f.write('context')
    print('===')

例二:

with open('filename') as f:  #把操作的结果, 赋给as后面的对象
    print(f.read())
print(f.closed, 'test') #结果是True

把一个函数的返回值给一个标识符, 我所知道的with只支持文件对象.

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值