第七周:文件和数据格式化
7.1 文件的使用
1.文件的类型
文件是数据的抽象和集合:文件是存储在辅助存储器上的数据序列;文件是数据存储的一种形式;文件展现形态有文本文件和二进制文件。最根本上是二进制文件。
(1)文本文件:由单一特定编码组成的文件,如UTF-8编码。由于存在文件,也被看成存储着的长字符串。
(2)二进制文件:文件直接由比特0和1组成,没有统一字符编码。一般存在二进制0和1的组织结构,即文件格式。
2.文件的打开和关闭
文件处理步骤:打开-操作-关闭。
在不打开文件的时候,文件处于存储状态。当我们需要对其进行操作的时候,要使文件处于占用状态,此时操作对文件具有独一的、排他的操作。处理完成后,需要将文件关闭。
python中常用的读文件函数为a.read(size)、a.readline(size)和a.readlines(hint);常用的写文件函数为a.write(s)、a.writelines(lines)和a.seek(offset)。
打开文件的方式:
<变量名>=open(<文件名>,<打开模式>)
文件名是指文件路径和名称,源文件如果同目录可以省略路径(路径中的斜杠使用反斜杠/或者双斜杠//)。文件路径的四种方式:1.绝对路径使用反斜杠;2.绝对路径使用双斜杠;3.若文件在程序文件所在目录的子目录中,可以使用例如./PYE/F.txt的方式;4.若是相同目录,可直接使用文件名。
打开模式:文本or二进制、读or写。如表1.1所示。
表1.1 打开模式
文件打开模式 | 描述 |
‘r’ | 只读模式,默认值,如果文件不存在,返回FileNotFoundError。 |
‘w’ | 覆盖模式,文件不存在则创建,否则完全覆盖。 |
‘x’ | 创建写模式,文件不存在则创建,存在则返回FileExistsError。 |
‘a’ | 追加写模式,文件不存在则创建,存在则在文件最后追加内容。 |
‘b’ | 二进制文件模式。 |
‘t’ | 文本文件模式,默认值。 |
‘+’ | 与r/w/x/a一同使用,在员工能基础上增加同时读写功能。 |
其它还可以参见:http://www.yushuai.me/2017/10/18/3494.html。该文章中部分内容摘录如下。
r只读,r+读写,不创建 w新建只写,w+新建读写,二者都会将文件内容清零 (以w方式打开,不能读出。w+可读写) 以a,a+的方式打开文件,附加方式打开 (a:附加写方式打开,不可读;a+: 附加读写方式打开) 以 'U' 标志打开文件, 所有的行分割符通过 Python 的输入方法(例#如 read*() ),返回时都会被替换为换行符\n. ('rU' 模式也支持 'rb' 选项) . r和U要求文件必须存在 不可读的打开方式:w和a 若不存在会创建新文件的打开方式:a,a+,w,w+ |
文件关闭方式:
<变量名>.close()
3.文件内容的读取
表1.2 文件内容的读取
操作方法 | 描述 |
a.read(size) | 读入全部内容,如果给出参数size,则只读入前size长度的内容。 |
a.readline(size) | 读入一行内容,如果给出参数size,则只读出该行前size长度的内容。 |
a.readlines(hint) | 读入文件所有行,以每行为元素形成列表,如果给出参数,读入前hint行。 |
(1)文件的全文本操作
遍历全文本:方法一(一次性读入,不适合大文件)
fname = input("请输入要打开的文件名称:")fo = open(fname,'r')txt.fo.read()#对全文操作fo.close()
方法二(按数量读入,分步处理)
fname = input("请输入要打开的文件名称:")fo = open(fname,'r')txt.fo.read(2)while txt!="": #对txt进行处理 txt.fo.read(2)fo.close()
逐行遍历文件:方法一(一次读入,分行处理)
fname = input("请输入要打开的文件名称:")fo = open(fname,'r')txt.fo.read(2)for line in fo.readlines(): print(line)fo.close()
方法二(分行读入,逐行处理)
fname = input("请输入要打开的文件名称:")fo = open(fname,'r')txt.fo.read(2)for line in fo: print(line)fo.close()
4.数据的文件写入
表1.3 数据的文件写入
操作方法 | 描述 |
a.write(s) | 向文件写入一个字符串或字节流。 |
f.writelines(lines) | 将一个元素全为字符串的列表写入文件(所有行被合并一起写入)。 |
f.seek(offset) | 改变当前文件操作指针的位置,offset含义如下:0位文件开头;1位当前位置;2位文件结尾。 |
例如:
fo = open(fname,'w+')ls=["中国","法国","美国"]fo.writelines(ls)for line in fo: print(line)fo.close()
为什么没有任何输出呢?
fo = open(fname,'w+')ls=["中国","法国","美国"]fo.writelines(ls)fo.seek(0)for line in fo: print(line)fo.close()
必须将指针恢复到文件开头才能真正输出信息,否则指针一直在文件最后,所以无法输出文件中的信息。
7.2 实例11:自动轨迹绘制
基本思路:
步骤1:定义数据文件格式(接口)。
步骤2:编写程序,根据文件接口解析参数绘制图形;
步骤3:编制数据文件。
数据接口定义是可以随意的,每个人都可以有自己的定义方式。在这里,我们用一行数字代表一次操作:其中第一个数字代表行进距离,第二个代表转向判断(0左转,1右转),第三个数字代表绝对转向角度,第四、五、六个数字代表RGB三个通道颜色(0~1之间的浮点数)。
代码:
# -*- coding: utf-8 -*-"""Created on Tue Apr 24 21:10:49 2018 @author: davidcheung"""import turtle as tt.title('自动轨迹绘制')t.setup(800,600,0,0)t.pencolor('red')t.pensize(5)#数据读取datals=[]f = open("data.txt")for line in f: line = line.replace("\n","") #去掉了每一行提取后变成字符串时的那个引号 datals.append(list(map(eval,line.split(",")))) #将去掉逗号的每个数据都转换成数字,然后再转换成列表 #map是将第一个参数里面函数的功能作用于第二个参数的每一个数值 #自动控制 for i in range(len(datals)): t.pencolor(datals[i][3],datals[i][4],datals[i][5]) t.fd(datals[i][0]) if datals[i][1]: t.right(datals[i][2]) else: t.left(datals[i][2])
7.3 一维数据的格式化和处理
1.数据组织的维度
一维数据是由对等关系的有序或无序数据构成,采用线性方式组织。它对应列表、数组和集合等概念。
二维数据是由多个一维数据构成,是一维数据的组合形式。表格是典型的二维数据。
多维数据是由一位或二维数据在新维度上扩展而成。
高维数据是仅利用最基本的二元关系展示数据间的复杂结构,例如键值对。
数据的操作周期分为三个阶段:存储<->表示<->操作。
数据存储中我们关心存储格式;数据表示是程序表达的方式,我们关心数据类型;数据操作我们关心操作方式。
2.一维数据的表示
如果数据间有序,使用列表类型。for循环可以遍历数据,进而对每个数据进行处理。
如果数据间无序,使用集合类型。for循环可以遍历数据,进而对每个数据进行处理。
3.一维数据的存储
存储方式一:空格分隔。只用空格分隔,不换行。缺点是数据中不能存在空格。
存储方式二:逗号分隔。使用英文半角逗号分隔数据,不换行。缺点是数据中不能有英文逗号。
存储方式三:其他方式。利用特殊符号进行分隔,缺点是需要根据数据特点定义,通用性差。
4.一维数据的处理
这里的处理是指将存储于表示相互转换,包括:将存储的数据读入程序,将程序表示的数据写入文件。
将数据写入文件中,文件中内容采用空格分隔方式。代码如下:
fname = 'country.txt'ls = ['中国','美国','日本']f = open(fname,'w')f.write(' '.join(ls))#将join前面的字符块分隔放入join参数中的字符串f.close()
7.4 二维数据的格式化和处理
1.二维数据的表示
使用列表类型,是二维列表。这只是一种基础的。可以使用两层for循环遍历所有数据。外层列表中,每个元素可以对应一行,也可以对应一列。
2.CSV格式与二维数据的存储
CSV,即Comma-Separated Values,也就是用逗号分隔的值的意思。这是一种国际上通用的一二维数据存储格式,一般用.csv扩展名。它每行一个一维数据,采用逗号分隔,无空行。CSV是数据转换的通用标准格式。CSV有以下约定:
(1)如果某个元素缺失,逗号仍要保留。
(2)二维数据的表头可以作为数据存储,也可以另行存储。
(3)逗号是英文半角逗号,逗号与数据之间没有空格间隔。
(4)按行存和按列存均可,具体由程序决定。但是一般索引习惯:ls[row][column],即先行后列。
3.二维数据的处理
(1)从CSV格式的文件中读入数据
fo = open(fname)ls = []for line in fo: line = line.replace('\n','') ls.append(line.split(','))fo.close()
(2)将数据存入CSV格式的文件中
ls=[[],[],[]]#二维列表f = open(fname,'w')for item in ls: f.write(','.join(item)+'\n')f.close()
(3)二维数据的逐一处理
ls=[[],[],[]]#二维列表for row in ls: for column in row: print(ls[row][column])
7.5 模块6:worldcloud库的安装和使用
1.wordcloud库的安装
输入命令:
pip install wordcloud
2.wordcloud使用
wordcloud库把词云当作一个WordCloud对象。即wordcloud.WordCloud()代表一个文本对应的词云,它可以根据文本中词语出现频率等参数绘制云。
它的常规方法:使用w=wordcloud.WordCloud()生成一个词云对象,以该对象为基础,配置参数、加载文本、输出对象。方法如表5.1所示。
表5.1 wordcloud库常规方法
方法 | 描述 |
w.generate(txt) | 向WordCloud对象w中加载文本txt。 |
w.to_file(filename | 将词云输出为图像文件,png或者jpg格式。 |
使用方法:
(1)配置对象参数。
(2)使用generate方法加载词云文本。
(3)输出词云文件。
示例代码如下:
import wordcloudc = wordcloud.WordCloud()c.generate("wordcloud by Python")c.to_file("ceshi.png")
在这里面,代码做了哪些事情呢?首先,以空格分隔单词。然后统计单词出现次数并过滤。再然后根据统计配置字号。最后布局颜色环境尺寸。
wordcloud的配置对象参数格式如下:
w= wordcloud.WordCloud(<参数>)
其可配置参数如表5.2所示。
5.2 配置对象参数
参数 | 描述 |
width | 指定词云对象生成图片的宽度,默认400像素。 |
height | 指定词云对象生成图片的高度,默认200像素。 |
min_font_size | 指定词云中字体的最小字号,默认4号。 |
max_font_size | 指定词云中字体的最大字号,根据高度自动调节。 |
font_step | 指定词云中字体字号的步进间隔,默认为1。 |
font_path | 指定字体文件的路径,默认为None。 |
max_words | 指定词云显示的最大单词数量,默认为200。 |
stop_words | 指定词云的排除词列表,即不显示的单词列表。 |
mask | 指定词云形状,默认为长方形,需要引进imread()函数。例如: from scipy.misc import imread mk = imread(“pic.png”) w= wordcloud.WordCloud(mask=mk) |
background_color | 指定词云图片的背景颜色,默认为黑色。 |
例程:
import wordcloudimport jiebatxt = "百度,全球最大的中文搜索引擎、最大的中文网站。\1999年底,身在美国硅谷的李彦宏看到了中国互联网及中文搜索\引擎服务的巨大发展潜力,抱着技术改变世界的梦想,他毅然辞掉\硅谷的高薪工作,携搜索引擎专利技术,于2000年1月1日\在中关村创建了百度公司"w = wordcloud.WordCloud(width = 1000,\ height = 700,font_path="msyh.ttc")w.generate(" ".join(jieba.lcut(txt)))w.to_file("ceshi.png")
图片效果如图1所示。
图1
7.6 实例12:政府报告词云
代码如下:
import jiebaimport wordcloudf = open("2018年政府工作报告.txt", "r", encoding="utf-8") t = f.read()f.close()ls = jieba.lcut(t) txt = " ".join(ls)w = wordcloud.WordCloud( \ width = 700, height = 300,\ background_color = "white", font_path = "msyh.ttc",max_words = 20 )w.generate(txt)w.to_file("grwordcloud.png")
结果图如2所示。
图2