第12章
使用Python进行数据管理
目录2引言数据对象的持久化使用itertools模块分析和处理数据实例:教务信息数据分析与处理Python中SQLite数据库的使用实例:封装MySQL数据库操作12.112.212.312.412.512.6
12.1引言
12.1引言4信息管理数据分析数据管理在当今社会环境下,各个领域都在产生着大量的数据,如财务数据、医疗数据、社交网络数据等。在这些领域中,数据的分析和管理都具有不可替代的作用。本章将首先介绍如何使用持久化模块持久化地存储程序中的数据对象,随后将会向读者展示如何使用Python中的itertools模块对数据进行处理和分析,最后将介绍如何在Python中使用一种更为高级的数据管理工具—数据库,以应对更为复杂的数据管理需求。信息分析在本章中,将会使用一个“教务信息”数据集作为贯穿全章的例子,以展示各项数据分析和管理功能。
12.1引言5这个数据集由3部分组成:学生信息student、课程信息course和选课信息election。以嵌套列表的形式给出这三部分数据OAL
12.2数据对象的持久化
12.2数据对象的持久化7在很多场景中,我们希望将程序中的数据对象保存下来,以供下次运行或其他程序使用,这种功能需求被称为数据持久化。在本节将分别介绍如何使用pickle、json和shelve三个模块对数据对象进行持久化存储和随机读取OAL
12.2.1使用pickle模块存取对象8picle模块的功能是将Python对象转换为二进制字节序列并存储在文件中。被转换的对象包括基本数据类型,系统和用户自定义的类对象,甚至包括列表、元组等容器对象。这个模块的使用十分简单,只需使用该模块的dump(data,file)函数即可将数据对象data存储在file文件对象中,而使用load(file)文件可以将保存在file中的持久化数据对象读取出来。
12.2.1使用pickle模块存取对象9此时,student对象被原样取出。然而,这里存在一个问题,存储在文件中的数据对象只能一次性地被读入内存,而不支持随机访问其中一条数据。假设有上万条学生信息,而经常一次只需要访问少数几位学生的信息,这时一次读入全部文件的方式就显得十分笨拙且低效了。为解决这个问题,用户可以使用下一小节中的shelve模块实现持久化对象的随机读取。
12.2.2使用json模块进行数据序列化与反序列化10json模块支持将数据按照JSON格式序列化后存储入文件,或者从具有JSON格式的文件中读取数据。json模块也提供了dump、load等函数进行数据处理,使用方法和功能与pickle模块非常相似,但两个模块在数据可互操作性与可读性方面存在差异。经json模块转化后的数据可以被非Python程序读取和使用,而pickle模块所使用的数据格式仅限Python使用。此外,json模块采用文本序列化格式对数据进行编码,转化后的数据可以直接阅读;而pickle模块使用二进制格式来存储数据,经pickle转化的数据文件通常难以理解。相比于pickle模块,json模块在进行数据处理时具有更高的安全性,当用户需要对不信任的数据进行反序列化操作时,使用json模块可以避免安全漏洞的产生。
12.2.2使用json模块进行数据序列化与反序列化11
12.2.2使用json模块进行数据序列化与反序列化12json模块还提供了dumps和loads函数,用于Python对象与具有JSON格式字符串(str)的相互转化程序输出为:序列化后的dic:{a:Python,b:C++,c:Java,d:SQL}序列化后的数据类型:classstr反序列化后的json_str:{Python:a,C++:b,Java:c,SQL:d}反序列化后的数据类型:classdict
12.2.3使用shelve模块随机访问对象shelve模块提供了类似字典的持久化解决方案。对于要对字典做的几乎所有事情,都可以用shelve实现。两者唯一的区别是shelve模块的数据持久化对象存储在硬盘中而不是内存中,只有当需要的时候某一字典项才会被调入内存。虽然会有一定速度上的牺牲,但是这意味着我们可以在内存有限的情况下操作非常大的字典,更为重要的是,这个字典是持久化的,可以在程序的多次运行或多个程序中被使用。
12.2.3使用shelve模块随机访问对象如前所述,与pickle模块只有读入所有文件内容才可以访问数据对象不同,当访问“lists”数据时,只有该项内容会被调入内存,即“tuple”项不会被同时读入。
12.2.3使用shelve模块随机访问对象下面通过将教务信息使用she