读写文件
不光是在我们的文件系统中,在运行Python时,有很多情况是需要我们对文件进行操作的, 比如生成一个文件,用来记录一些信息,读取文件获取信息等等。 这一次我们就来讲解这个文件管理系统大项目当中,必定会存在的文件读写的过程。
创建文件¶
第一步当然是凭空创建一个文件啦,下面是一个标准的创建文件步骤。
这个文件会被保存在哪呢?正常来说,他会保存在你脚本的当前目录下,比如所你运行的是 me.py
脚本, 那么 new_file.txt
就会被创建在这个脚本的同级目录中。
|- me.py
|- new_file.txt
如果你觉得要写一个 f.close()
或者有时候你怕自己忘记要 close()
, Python 人性化地提供了另外一种打开文件的方式。 这个方式把打开和关闭嵌入到了一个 with
架构中。所以再也不用担心忘记关闭文件了,这种 with
的模式也是我个人比较喜欢的模式。 下面这个案例,除了使用了 with
模式,我还换了一种写入数据的方式 writelines()
, 当你传入像列表样的数据时, 列表中的每个元素就是一行记录,数据会分行来写。
注意,在列表里,每个元素最后都最好写一个\n
来表示要另起一行。不然读出来的时候就黏在一起了。不信你试试。
读文件¶
在目录中创建好了这个文件,我们肯定有需要读它的时候,在读文件的时候,和写文件的方式是十分类似的,就把里面的 w
改成 r
。 也就是说,其实 w
代表的是 write
, r
代表的是 read
。
上面有演示如果你的记录是一个列表,你想在文件中每行记录列表当中的一个值,可以用 writelines()
,那么在读文件的时候, 也可以 readlines()
直接读出来一个列表。
在机器学习和大数据的时代,我们的数据往往是非常大的,很多都是以GB为单位。而如果一次性读取一个这么大的文件,很有可能你的内存都放不下。 怎么办呢?我们能不能一行一行读取,取代一次性读取,不让内存被一次性占满?当然可以,readline()
就来拯救你了。 注意哦,这个功能没有 s
,不是上一个功能哦。
文件编码,中文乱码¶
在做中文项目的时候,有一个很头疼的事情,很有可能你的文件是从不同平台拿过来的,比如 Windows 的文件要在 MacOS 里打开。 英文的还好,一般不会有什么问题,但是中文的就很容易出现编码不一的情况,出现中文乱码。这时候我们怎么办呢? 首先你要弄清楚原文件的编码,通常来说是 utf-8
、gbk
、gb2312
其中的某一种。
下面我模拟一下,有些文件在 Windows 存储的时候,是以 gbk 的格式存储的,下面的 chinese.txt
我就模拟用 gbk 编码保存。 注意这里我选用的写模式 w
还多了一个 b
,合起来是 wb
,意思是 write 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 | 创建 |
下面我们来举几个例子,体验一下。