输入设备(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操作时, 把文件当成“流”来处理. (没太理解)
完整版是:
open(file,mode=’r’,buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)
用来打开文件, 根据参数来创造一个文件对象.
通过位置传参, 没有缺省值, 所以是必须由我们输入的参数.
可以写相对路径或者是绝对路径, 就是打开这个文件.
f = open('D:/test.txt')
f
<_io.TextIOWrapper name='D:/test.txt' mode='r' encoding='cp936'>
这个是以什么模式来打开这个文件, 我觉得他是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’, 也就是只读, 以文本模式显示.
这个参数是控制缓冲的大小, 默认值-1.
就是说, 文件都是存在磁盘里的, 磁盘的IO比较慢, 所以给文件写入一些东西之后, 这些东西会暂存在内存中, 等确认完全输入完毕, 或者内存存不下了, 在写入磁盘里, 这样效率比较高, 毕竟运算器出来的数据, 是不能直接和磁盘交流的.
那么内存中放多少, 需要一个限定值, 这个值就是缓冲, 这块地方叫做缓冲区.
缓冲区可以认为是一个先进先出的队列, 也有其他的结构, 比如说环状的.
buffering要和’t’模式, ‘b’模式配合使用:
buffering=1, 只能再’t’模式下使用, 表示用行缓冲. 就是输入的文本, 碰到换行符/r /n就存入一次.
buffering=0, 只在二进制模式使用, 表示关闭buffer.
buffering=int, 就是输入一个整数, 就表示缓冲区是多少, 单位是字节.
这是参数只能在文本模式下使用, 可以把没有被编码的文件内容, 按照encoding指定的编码表来编码.
Windows系统下默认的编码表GBK.
‘utf8’和’utf-8’的意思是一样的.
一般在打开文件的时候, 把encoding写上, 是一个好习惯.
缺省值是None, None和’strict’是一样的效果, 就是说如果在编码时出现了错误, 立即捕捉错误并报出.
‘ignore’表示如果在编码时出现了错误, 就忽略.
newline缺省值是None, 就是把换行符变成当前系统支持的换行符, 并且断开.
newline=” 表示什么都不做.
newline=’/r/n’ 就是以’/r/n’作为换行符断开.
newline=’/n’ 就是以/n作为换行符断开, 并且把换行符变成/n.
缺省值为True, 意思是在关闭这个文件时, 要不要删除文件描述符.
每个文件在打开的时候, 都会给一个文件描述符, 这个文件描述符在操作系统中是有限的, 所以最好是True, 也就是关闭文件之后要删除文件描述符.
先要声明, 在操作文件的时候, 有一个指针的概念, 有点类似于word或者txt里面的光标, 指针就是指明当前的位置在哪.
读取文件的内容, size控制读取的字符个数或字节个数;
读完之后, 指针会指导尾部.
给文件添加一些文本, ‘t’模式下写字符, ‘b’模式下写字节, 是在指针所在处往后写, 会覆盖后面的内容.
写完返回写入的字符数或者字节数个数.
关闭打开的文件, 文件用完了一定要关闭, 不然文件描述符不够用.
注意是没有括号的, 用来判断这个文件是否关闭.
关闭了返回True, 没关闭返回False.
设置指针的位置;
whence的值, 0代表文件开头, 2代表文件尾部, 1表示相对于当前位置.
pos是走多少步, 在文本模式下, 在1,2(也就是相对位置和尾部)不能走非0的pos, 就是不能动.
只有在字节模式下, 才能从后往前走, 就是pos为负数.
seek()不允许在0, 就是开始位置, 把指针向左移动
文件指针和字符无关, 指针每移动一步, 都是移动一个字节
文本模式, 读写操作的都是字符
字节模式, 读写操作的都是字节
查看指针的位置, 是当前位置, 按字节来数.
一行一行的读,
size控制读几个字符,
立即返回一个列表
把所有行显示出来,
放在一个列表里面,
hint控制读几行.
把列表补进去
列表内元素必须是str
\n得自己补上
查看文件对象的文件描述符
因为文件描述符是有限的, 所以文件用完之后必须关闭.
有时候吧, 就总忘了关. 自己忘了关, 就得靠程序来关.
小技巧
linux系统下:
• lsof 显示已经打开的文件;
• lsof | grep filename | wc -l | lsod -p
• ulimit -l 显示所有的限制
有两种方法可以保证一定关闭:
try:
尝试执行的代码
finally:
一定要执行的代码
比如这样:
try:
f = open(.....)
....
finally:
f.close() #返回值->True
这样不管try里面的代码如何, 最终都会执行f.close().
这个就叫上下文.
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只支持文件对象.