文件编程主要包含文件 IO 和对文件的操作,在学习文件编程之前,我们现弄明白两个概念:IO 和文件。
IO 在计算机中指 Input/Output,也就是输入和输出。前面我们学习的 print 和 input 函数就是 IO 编程,我们通过 print 函数把内存中的数据输出到显卡(显卡会把数据输出到显示器),input 函数把键盘上的数据输入到内存。
如果我们在编写程序中需要内存和磁盘交互数据,就需要磁盘 IO,也就是把内存中的数据写入磁盘和把磁盘中的数据读入内存。
如果我们需要通过网络进行数据传输,就需要网络 IO,也就是把内存中的数据写入网卡(网卡会通过网络把数据发送到对方机器网卡)和把网卡中的数据读入内存。
我们在程序中用内存和键盘,显卡,磁盘,网卡等外部设备(后面我们统称外设)直接进行数据交互是不允许的, 这时候我们的程序可以通过操作系统间接和那些外设交互数据。 具体的实现过程是:我们的程序首先向操作系统申请一个文件对象用于和外设进行数据交互, 对于从内存中写数据到外设,我们的程序通过文件对象写入数据到操作系统,然后操作系统把数据写入外设中; 对于从外设中读数据到内存,我们的程序通过文件对象告诉操作系统要读取数据,操作系统从外设中取出数据返回给程序。
这种通过文件对象
进行数据读写的行为,我们广义上都称作文件 IO。
更有甚者,我们通过文件对象在内存和内存之间进行数据交互也叫做文件 IO,具体我们称之为内存 IO。
当然内存和内存之间可以直接进行数据交互,一般情况下我们没必要在内存之间交互数据使用文件对象,除非想装逼的情况下,比如我们本章小节中要学的 StringIO 和 BytesIO。
文件 IO 中最常用的是磁盘 IO 和 网络 IO,并且这两种 IO 是我们在项目需求中最常用的需求,对于互联网社会的今天,处处离不开网络和存储。 由于 CPU 和内存的速度远远高于外设的速度,所以,在 IO 编程中,就存在速度严重不匹配的问题。 比如要把 1G 的数据写入磁盘,CPU 输出 1G 的数据只需要 0.1 秒,可是磁盘要接收这 1G 数据可能需要 100 秒,怎么办呢?同样通过网络发送数据也遇到同样的问题。
我们以磁盘 IO 为例来分析如何处理 CPU 和磁盘速度严重不匹配的问题:第一种方法是 CPU 等着,也就是程序暂停执行后续代码,等 1G 的数据在 100 秒后写入磁盘,再接着往下执行,这种模式称为同步 IO; 第二种方法是 CPU 不等待,只是告诉磁盘,“你慢慢忙,不着急,我先去干其它事情了,我自己会不定时来查看你的状态或者你干完后通知我一声”,于是,CPU 继续执行后续的代码,这种模式称为异步 IO。
“你慢慢忙,不着急,我先去干其它事情了,我自己会不定时来查看你的状态”,这种异步 IO 称之为轮询模式; “你慢慢忙,不着急,我先去干其它事情了,你干完后通知我一声”,这种异步 IO 称之为通知模式。总之,异步 IO 的复杂度远远高于同步 IO。
本章我们要学习的 IO 编程都是同步模式,而且只针对磁盘 IO 和内存 IO。对于异步模式学习和网络 IO 知识点学习,我们在后续章节中讲解。
读文件
写文件
文件对象
windows 和 linux 命令行操作文件和目录
Python 操作文件的函数
Python 操作目录的函数
Python Python 操作文件名和目录名的函数
使用高级模块 shutil 操作文件和路径
StringIO
BytesIO
内存 IO(StringIO 和 BytesIO) 和文件 IO 的主要区别
pickle 模块
json 模块
前面很多的东西学学忘忘,管怎样还是希望 能认真理解这一门语言,能够驾驭网站开发和基本的数据爬虫,奥利给!!!