查看原文
其他

给妹子讲python-S01E09文件操作小意思

给妹子讲python Python爱好者社区 2019-04-07

作者:酱油哥/ 清华程序猿      
微信公众号: python数据科学家
知乎专栏: 《给妹子讲python》
https://zhuanlan.zhihu.com/c_147297848



前文传送门:

给妹子讲python-S01E01好用的列表

给妹子讲python-S01E02学会用字典

给妹子讲python-S01E03元组的使用

给妹子讲python-S01E04容器遍历和列表解析式

给妹子讲python-S01E05字符串的基本用法

给妹子讲python-S01E06字符串用法进阶

给妹子讲python-S01E07字符编码历史观:从ASCII到Unicode

给妹子讲python-S01E08理清python中的字符编码方法

【要点抢先看】

1.文件操作模式,他的本质是字符串
2.文件的读方法和文件迭代器逐行扫描
3.文件的关闭与刷新
4.二进制文件的读写与对象的文件存储

前面几集里,我们详细介绍了python字符串以及编解码的有关内容,这些内容实质上也是文件操作的基础。今天这一集,我们就正好来说说文件操作。

先预热一下,看一个利用open函数打开文件的简单例子:

myfile = open('myfile.txt','w')
myfile = open('myfile.txt','r')

【妹子说】文件读写应该有很多种模式,比如只读、可读可写等等,应该如何实现?

我们可以看出,利用内置函数open进行文件操作时,第一个参数是文件名,第二个参数是处理模式。典型的使用模式参数有:r为以只读模式打开文件,w为输出模式打开文件,a代表在文件尾部追加内容而打开文件,模式字符串尾部加上b可以进行二进制数据处理。

内置open函数会创建一个python文件对象,作为文件操作的接口。

我们需要牢记一点:文件的内容是字符串。从文件读取的数据经过函数返回时是一个字符串,如果字符串不是你所需的,比如你其实需要的是一个浮点数,你就需要将字符串转换为浮点数类型,而把数据写入文件时,也必须传递一个已经格式化的字符串给write方法。

【妹子说】那还是老套路,举几个实际的例子看看:

OK,我们来看看实际使用文件的例子:我们在文件中写入两行字符串(包含了换行),然后利用几种不同的方法将其读出,首先写入数据:

myfile = open('myfile.txt','w')
myfile.write('hello text file\n')
myfile.write('goodbyt text file\n')
myfile.close()

首先使用的是readline方法,一次手动读取一行,最后一次返回一个空字符串,意味着已经到达了文件底部

myfile = open('myfile.txt','r')
print(myfile.readline())
print(myfile.readline())
print(myfile.readline())

hello text file
goodbyt text file

其次,也可以使用read方法一次性读取全部的文件内容

myfile = open('myfile.txt','r')
print(myfile.read())

hello text file
goodbyt text file

最后再看一种更加python的方法,可以一行一行的自动扫描文件

myfile = open('myfile.txt','r')
for line in myfile:
    print(line, end='')

hello text file
goodbyt text file

这个方法涉及到了文件迭代器的概念,open方法创建的文件对象myfile将自动在每次循环迭代的时候读入并返回新的一行数据。这种形式通常很容易编写,可以很好的使用内存,且运行速度快。

关于迭代器的概念,我们在后续会专题介绍,这里只用记住:利用文件迭代器这种方法进行逐行数据读取,是最方便的。

我们再说说二进制文件的读写操作。需要记住的是我们必须使用bytes字符串处理二进制文件。因为当我们读取一个二进制数据文件的时候,得到的是一个bytes对象,二进制文件不会对数据执行任何转换。

提醒一下,对于二进制文件,不能以文本模式打开,因为文本文件实现了unicode编码,若将二进制文件的内容进行unicode解码,显然毫无意义,同时还可能会失败。上一小节我们谈过这个问题,这里就不多讲了,我们只回顾一个例子就可以了,

myfile = open('data.bin','wb')
myfile.write(b'abcdefg')
myfile.close()

data = open('data.bin', 'rb').read()
print(data)
print(list(data))

b'abcdefg'
[97, 98, 99, 100, 101, 102, 103]

再来简单说说文件的关闭与刷新

文件的关闭。调用文件close方法将会终止对外部文件的链接,即手动关闭文件。如在文件不再使用的时候,这个文件对象的内存空间就会被收回,虽然python也有自动关闭文件的特性,但是手动关闭是一个最为保险的方法。后面会专门介绍文件对象的上下文管理器,他可以自动地关闭文件。

默认情况下,文件总是带有缓冲的,这意味着写入的文本可能不会立即自动从内存转换到硬盘。而关闭一个文件,或者运行flush方法,可以迫使缓存的数据立即进入硬盘。

相较于之前字符串形式的文件,我们最后来讲讲一种特殊的文件存储方式:对象存储

pickle模块是能够让我们直接在文件中存储几乎任何python对象的高级工具,也并不要求我们把字符串转换来转换去,他是一个通用的数据格式化和解析工具,我们举个例子,在文件中直接存储一个字典对象和一个列表对象

import pickle
D = {'a': 1, 'b': 2, 'c': 3}
L = [3, 4, 5]
with open('datafile.pkl', 'wb') as file:
    pickle.dump(D, file)
    pickle.dump(L, file)

这样就很简单的把两个对象存储在指定的文件中了,想要取用这些对象,只需简单的进行对象重建即可

with open('datafile.pkl', 'rb') as file:
    print(pickle.load(file))
    print(pickle.load(file))

{'b': 2, 'a': 1, 'c': 3}
[3, 4, 5]

Pickle模块执行的所谓对象序列化,本质上就是pickle内部字典对象、列表对象与字节字符串之间的转换过程。

还有一种struct工具,处理打包的二进制文件,这里简单的提一下,有个印象就好,struct工具能够构造并解析打包的二进制数据。从某种意义上来说,它也是一种数据转换工具。

首先我们来看如何将数据打包成二进制数据,并存储在文件中,第一个参数是格式化字符串,>表示高位在前、一个4字节整数、一个5字节字符串、一个浮点数的格式。

import struct

F = open('data.bin', 'wb')
data = struct.pack('>i5sf', 8, b'abcde', 4.3)
print(data)
F.write(data)
F.close()


F = open('data.bin', 'rb')
data = F.read()
print(data)
values = struct.unpack('>i5sf', data)
print(values)

b'\x00\x00\x00\x08abcde@\x89\x99\x9a'
b'\x00\x00\x00\x08abcde@\x89\x99\x9a'
(8, b'abcde', 4.300000190734863)

后半部分很容易理解,就是读取文件中的字节字符串,并用相同的格式将其解压出来就可以了,python直接将其转换为普通的Python对象

但是,我想说的是,一般来说二进制文件处理模式是用于处理更简单的二进制文件,例如图片和音频文件,是不需要解压它的内容的。同时若想存储数据,还是多使用数据库吧。

【妹子说】恩,当今天为止,我们学习了python中的几种主要的数据类型:列表、字典、元组和字符串。在基本数据类型的基础上,进一步了解了容器中的高级概念---迭代和列表解析式以及字符串里的重难点---字符编码与文件访问。要好好整理复习呀~

Python爱好者社区历史文章大合集

Python爱好者社区历史文章列表(每周append更新一次)

福利:文末扫码立刻关注公众号,“Python爱好者社区”,开始学习Python课程:

关注后在公众号内回复“课程”即可获取:

小编的Python入门免费视频课程!!!

【最新免费微课】小编的Python快速上手matplotlib可视化库!!!

崔老师爬虫实战案例免费学习视频。

陈老师数据分析报告制作免费学习视频。

玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存