读写文件 - 交互式学Python | 莫烦Python

读写文件

作者: 莫烦 编辑: 莫烦 2021-05-02

不光是在我们的文件系统中,在运行Python时,有很多情况是需要我们对文件进行操作的, 比如生成一个文件,用来记录一些信息,读取文件获取信息等等。 这一次我们就来讲解这个文件管理系统大项目当中,必定会存在的文件读写的过程。

创建文件

第一步当然是凭空创建一个文件啦,下面是一个标准的创建文件步骤。

这个文件会被保存在哪呢?正常来说,他会保存在你脚本的当前目录下,比如所你运行的是 me.py 脚本, 那么 new_file.txt 就会被创建这叫脚本的同级目录中。

|- me.py
|- new_file.txt

如果你觉得要写一个 f.close() 或者有时候你怕自己忘记要 close(), Python 人性化地提供了另外一种打开文件的方式。 这个方式把打开和关闭嵌入到了一个 with 架构中。所以再也不用担心忘记关闭文件了,这种 with 的模式也是我个人比较喜欢的模式。 下面这个案例,除了使用了 with 模式,我还换了一种写入数据的方式 writelines(), 当你传入的时候像列表样的数据时, 列表中的每个元素就是一行记录,数据会分行来写。

注意,在列表里,每个元素最后都最好写一个\n来表示要另起一行。不然读出来的时候就黏在一起了。不信你试试。

读文件

在目录中创建好了这个文件,我们肯定有需要读它的时候,在读文件的时候,和写文件的方式是十分类似的,就把里面的 w 改成 r。 也就是说,其实 w 代表的是 writer 代表的是 read

上面有演示如果你的记录是一个列表,你想在文件中每行记录列表当中的一个值,可以用 writelines(),那么在读文件的时候, 也可以 readlines() 直接读出来一个列表。

在机器学习和大数据的时代,我们的数据往往是非常大的,很多都是以GB为单位。而如果一次性读取一个这么大的文件,很有可能你的内存都放不下。 怎么办呢?我们能不能一行一行读取,取代一次性读取,不让内存被一次性占满?当然可以,readline() 就来拯救你了。 注意哦,这个功能没有 s,不是上一个功能哦。

文件编码,中文乱码

在做中文项目的时候,有一个很头疼的事情,很有可能你的文件是从不同平台拿过来的,比如 Windows 的文件要在 MacOS 里打开。 英文的还好,一般不会有什么问题,但是中文的就很容易出现编码不一的情况,出现中文乱码。这时候我们怎么办呢? 首先你要弄清楚原文件的编码,通常来说是 utf-8gbkgb2312其中的某一种。

下面我模拟一下,有些文件在 Windows 存储的时候,是以 gbk 的格式存储的,下面的 chinese.txt 我就模拟用 gbk 编码保存。 注意这里我选用的写模式 w 还多了一个 b,合起来是 wb,意思是保存为 binary 形式,取代默认的 text 形式。所以我读的时候, 也加上了一个 b,变成了 rb,read binary。你点运行试试,他会给你出一段乱码,因为Python不识别这段编码后的文本。

那如果我直接用原始的 r 来读文本呢?它甚至都会给我报一个错。读不了。

怎么办?方法还是有的,我们先确认是哪一种文件编码,然后在读的时候,需要传入一个 encoding 的参数,表示用这一种编码来读。 这样中文乱码的问题就顺利解决了。

更多读写模式

上面我们已经说了几种读写的 mode,比如 w, r, wb, rb。下面我们列一个表,来看看还有多少种不同模式。

mode 意思
w (创建)写文本
r 读文本,文件不存在会报错
a 在文本最后添加
wb 写二进制 binary
rb 读二进制 binary
ab 添加二进制
w+ 又可以读又可以(创建)写
r+ 又可以读又可以写, 文件不存在会报错
a+ 可读写,在文本最后添加
x 创建

下面我们来举几个例子,体验一下。


降低知识传递的门槛

莫烦很常从互联网上学习知识,开源分享的人是我学习的榜样。 他们的行为也改变了我对教育的态度: 降低知识传递的门槛免费 奉献我的所学正是受这种态度的影响。 通过 【赞助莫烦】 能让我感到认同,我也更有理由坚持下去。