创建一个扩展名为nb的图片,浅谈Python的文件管理和序列化操作

什么是文件?

在计算机没有被发明出来之前,它通常以纸质的形式存在,通过文字和笔墨将人们口述或者大脑里的想法记录下来的实体。

在记事本中编写的手

文件可以是竹简、纸张、牛羊皮等等,它记录了人类的智慧结晶和一切生产行为,如果没有文件存在并进行传承,那整个人类的文明就无从谈起了。

计算机和编程语言本质上就是人类的智慧结晶,高度抽象化的产物。

那么在计算机中,文件是如何产生并存在的呢?

我们都知道计算机中有两个东西必不可少,内存和硬盘。

简单的说我们在计算机中产生文件其实就是将内存中的数据存储到硬盘里,

大家肯定在编写文档的时候随时选择保存防止数据丢失吧。

那你现在大概已经知道了当你敲击键盘每次产生的数据都临时放在内存中,直到你点击菜单选择保存时计算机会将内存中的数据存储到硬盘中。

今天我们就来讲讲Python的文件管理、对象序列化相关的内容。

通过本章的学习我们将掌握如何读写文件,自定义文件内容相关知识。

知识点:

  • Python文件读取、写入、删除

  • Python的对象序列化和反序列化

  • 自定义nb文件格式

Python文件读取

让我们先来准备一个文本文件并且写一段代码来读取它。

打开UC浏览器 查看更多精彩图片

首先我在电脑上写了一个叫hello.txt的文本文件并保存了下来,其中有两行内容。

f = open(‘hello.txt’, ‘r’)print(f.read())

现在我们来看看程序运行的结果。

结果跟你想的一样吗?

通过这两行行代码和输出结果我们会学到几个知识点。

  1. Python里通过**open()**内置函数打开一个文件,其中open()函数接收的第二个参数表示打开文件的模式,例如我只想读取文件,就传一个 “r” 字符就行了,它是英文 read 的意思。

  2. open()函数 打开文件后会得到一个 文件对象,我们定义了一个变量f来接收它。

  3. 通过文件对象的**read()**函数会获取全部内容,由print() 函数打印出来。

关于文件打开模式这里有一个表格,希望大家保存记住,便于随时查阅。

现在我们再想想刚才的代码,其实有个缺陷,那就是我们能不能根据自己的需求一行一行的读取文件内容,而不是一下就把它打印了出来。

我们来看看如何读取文件的每一行内容吧。

f = open(‘hello.txt’, ‘r’)for i in f.readlines(): print(f"文件内容:{i}")

我们通过文件对象的 **readlines()**函数对文件按行读取内容,实际上readlines()函数会得到一个列表,列表里的每个元素就是每一行的实际内容。

打开UC浏览器 查看更多精彩图片

通过以上例子我们可以发现readlines() 函数其实会获得一个列表对象。

不过唯一有一点疑惑的就是为什么“第一行”后面会多一个**"\n"**,而且它叫换行符,表示遇到它时就该换行了。

因为Python的print()函数在输出内容时本来就会进行自动换行,所以我们会发现在之前的输出结中。

文件内容:第一行文件内容:第二行

这个输出文件内容之间多了一个换行,其实就是这个 “\n” 换行符起了作用。

Python文件写入

了解了读取文件信息,现在我们来看看怎么用Python写入文件信息的。

f = open(‘hello.txt’, ‘r+’)for x in range(1, 10): line_txt = f"第{x}行内容\n"f.write(line_txt)f.close()

现在来解读一下代码。

  1. 我们用 “r+” 模式进行读写文件

  2. 生成一个可迭代对象,从1循环到10

  3. 通过文件对象的**write()**函数写入文件内容

  4. 写入文件完成后,通过文件对象的close()函数关闭文件,它的作用是关闭文件对象,不再接受新的输入信息,这个时候如果再写入文件内容,程序就会报错了,需要重新用open函数打开文件才能继续写入。

以下是hello.txt的内容,一共写入了9行文字内容和最后一个空行"\n"。

Python文件删除

关于如何删除文件,在Python里有很多种方式,在这里我们只介绍一种。

import osos.remove(文件名)

通过引入 os 这个Pyhton自带的库,我们可以完成很多跟文件相关的操作,其中的**remove()**函数就是用来删除文件的,当我们remove()一个不存在的文件或者文件夹时,程序就会会报错。

Python的对象序列化

在讲序列化之前先想想,我们的计算机里除了刚才的 hello.txt 这类的txt文本文件之外是不是还有 xls、png、avi、mp3等等各种类型的文件格式?

它们是如何产生的?它们存储的格式是怎么样的呢?

这些文件的存储格式不再是文本格式,而是字节流信息,换句话说就是二进制信息。

我们知道程序在运行时向内存申请资源,然后开始计算,将计算结果暂存在内存里的各种对象里。对象包括图片信息、视频信息、电子表格信息等等。

程序将对象通过二进制的方式从内存存储到硬盘文件的过程就叫做序列化

本章的前言里说到人类通过纸张将大脑里的信息用笔通过文字录下来,变成了文件。

那么在计算机里把对象序列化的这个过程其实就是人类用文字和笔记录下来的过程。

现在我们来试试Python怎么进行对象序列化的。

import picklef = open(‘object_file’, ‘wb’)list1 = [1,2,3,4,5,6]pickle.dump(list1, f)

以上代码我们引用到了Python自带的库pickle。

pickle是Python中专门用来做对象序列化操作的库

通过它我们可以把对象进行序列化或者反序列化,简单的说就是把对象存储到文件里,或者从文件里直接读取出对象信息到程序里。

而pickle的**dump()**函数的作用就是 将一个对象直接输出到硬盘文件里。

现在回到代码里来理解一下执行过程。

  1. 程序先是用 “wb” 的方式新建一个文件,叫做 object_file。“wb” 模式表示写入一个二进制文件。

  2. 创建了一个1-6的列表内容

  3. 通过dump()函数把对象直接写入到文件里,dump()第一个参数是需要存储的对象,第二个参数是需要存储的文件。

现在来看看我们写入的文件内容。

打开UC浏览器 查看更多精彩图片

两个字,看不懂!

因为我们用文本编辑器打开的一个二进制文件,它无法识别这些二进制文件的内容。

对于初学者来说这就是一堆莫名其妙的符号。

那么如何正确的解析这些数据呢?这个时候就需要用到反序列化了

Python的对象反序列化

通过以上代码,我们利用pickle的load() 函数进行反序列化,把刚才保存在文件里的二进制信息又变成了列表对象了。

反序列化本身其实没什么好讲的,它就是将文件里的信息读取出来并转换为程序里可用的对象,反序列化顾名思义就是它所做的事情和序列化的过程完全相反。

自定义nb文件格式

现在我们了解了对象序列化的方法后,是不是可以发散思维。我们是不是可以自定义一种文件格式,就叫它 nb格式吧。

文件名看起来像这样 111.nb、222.nb,然后这种文件格式可以在屏幕上展示图像内容,当然这些图像内容如何展现都取决于我们自己。

具体流程如下(细节不用深究):

  • 创建一种文件扩展名为nb的格式

  • 通过Python现成的matplotlib库来进行画图

  • 定义图片格式内容,简单期间,我们就在屏幕上画一条曲线

  • 准备两个列表,作为曲线的x和y坐标数据,分别命名为x,y

现在我们来写代码吧。

通过以上10行代码,我们创建了一种新的文件格式出来。

需要注意的是pickle.dump()可以多次写入数据,每次写入一个对象信息。

现在我们看看写入的111.nb文件内容是什么样的。

打开UC浏览器 查看更多精彩图片

不出所料,111.nb是一堆二进制的数据,现在我们需要写程序来进行反序列化,解析它的内容了。

来解读一下上面的代码。

  1. 我们多引入了一个叫matplotlib的库,利用到了它的pyplot模块来进行绘图。

  2. 然后通过**“rb”**模式(二进制文件读取)打开111.nb文件。

  3. 通过pickle的**load()**函数加载文件里的内容,并将其还原成Python里的对象,用 x、y这两个变量保存起来。

  4. 这个还原的过程load()函数会自动帮我们完成,我们在现阶段不需要关心它的原理,以后高级课程会讲到。

  5. load()函数同样可以多次加载数据,直到文件里的所有对象全部读出为止。

最后,我们通过pyplot模块绘制图形。

pyplot.plot(x, y) 这行代码用于加载x、y的信息,通过pyplot.show()将图片显示出来。

至此我们基本完成了一种名为nb文件格式的设计,可能有人会问,那我直接把这个文件传给我的朋友,他打开后会显示图片吗?

当然不会!甚至在你的电脑上都不能够直接显示,你需要借助刚才编写的代码对其进行解析后才能够显示出来。

你想想如果你的电脑上不装Excel或者Word,那么xls表格文件和doc文档可以打开吗?

像jpg、png、gif之类的文件之所以能直接被打开并显示,原因是因为操作系统本身对其做了支持。

现在我们已经搞懂了如何利用Python的pickle生成自己想要的二进制信息并对其进行解析了,在以后可以利用它创建更多的自定义格式文件出来。

在大多数情况下我们只会用到pickle的dump和load函数来做序列化相关的事情

使用pickle的注意事项

在使用pickle库进行序列化的时候要注意最好不要用它来存储大容量的对象信息(例如1亿个字符串),如果有大容量数据的需求,可以选择用别的库来实现,pickle库只是应对于常见情况。

同时也要注意在load时确保来源数据文件是可信的,因为在load时Python会自动加载模块构造对象,如果攻击者恶意制造一个破坏系统信息的对象文件,我们去load时就会有麻烦了。

总结

关于Pyhton文件管理相关的基础知识就讲到这,通过本章的知识我们可以创建一些自定义内容的数据将其保存起来,在网络上进行传输。

掌握好文件管理相关的技能,才能更好的编写实用性的Python代码,并帮助我们更好的工作。

推荐我们的Python学习扣qun:784758214 ,看看前辈们是如何学习的!从基础的python脚本到web开发、爬虫、django、数据挖掘等【PDF,实战源码】,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!每天都有大牛定时讲解Python技术,分享一些学习的方法和需要注意的小细节,点击加入我们的 python学习者聚集地

发布了50 篇原创文章 · 获赞 14 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/ITHHH777/article/details/104224747