笔记
- 文件和数据格式化
格式化分为字符串格式化和数据格式化
-字符串格式化:
如”{}{}{}”.format()将字符串按照一定规格和式样进行规范
-数据格式化:
将一组数据按照一定规格和式样进行规范:表示、存储、运算等 - 文件是数据的抽象和集合
-文件是存储在辅助存储器上的数据序列
-文件是数据存储的一种形式
-文件展示形态:文本文件和二进制文件
对于文本文件和二进制文件:
-文本文件和二进制文件只是文件的展示方式
-本质上,所有文件都是二进制形式存储
-形式上所有文件采用两种方式展示 - 文本文件(有统一编码):
-由单一特定编码组成的文件,如UTF-8编码
-由于存在编码,也被看成是存储着的长字符串
-适用于例如:.txt文件、.py文件 - 二进制文件(无统一编码):
-直接由比特0和1组成,没有统一字符编码
-一般存在二进制0和1的组织结构,即文件格式
-适用于例如:.png文件、.avi文件等 - 文件的打开关闭
文件处理的步骤:打开-操作-关闭
- 文件的打开
<变量名>=open(<文件名>,<打开模式>)
其中文件名为文件路径和名称,源文件同目录可省路径
打开模式包括以文本形式打开还是以二进制形式打开,打开过程是读信息还是可写信息
文件打开后,文件用一个抽象的变量以文件句柄来表示
打开模式
- 文件的关闭
<变量名>.close()
|
文件句柄 - 文件内容的读取
- 文件的全文本操作
(1)遍历全文本
遍历全文本:方法一
#遍历全文本:方法一
fname=input("请输入要打开的文件名称:")
fo=open(fname,"r")
txt=fo.read()
#对全文txt进行处理
fo.close()
特点:一次读入,统一处理
遍历全文本:方法二
fname=input("请输入要打开的文件名称:")
fo=open(fname,"r")
txt=fo.read(2)
while txt!=””
#对全文txt进行处理
txt=fo.read(2)
fo.close()
特点:分阶段按数量读入,逐步处理
(2)逐行遍历文件
逐行遍历文件:方法一
fname=input(“请输入要打开的文件名称:”)
fo=open(fname,”r”)
for line in fo.readlines():
print(line)
fo.close()
特点:一次读入,分行处理
逐行遍历文件:方法二
fname=input(“请输入要打开的文件名称:”)
fo=open(fname,”r”)
for line in fo:
print(line)
fo.close()
特点:分行读入,逐行处理
10. 数据的文件写入
fo=open("output.txt","w+")
ls=["中国","法国","美国"]
fo.writelines(ls) -写入一个字符串列表
for line in fo:
print(line)
fo.close()
结果:无任何输出
修改:
fo=open("output.txt","w+")
ls=["中国","法国","美国"]
fo.writelines(ls)
fo.seek(0)
for line in fo:
print(line)
fo.close()
- 自动轨迹绘制
-需求:根据脚本来绘制图形
-不是写代码而是写数据绘制轨迹
-数据脚本是自动化最重要的第一步 - 实例操作
基本思路
-步骤1:定义数据文件格式(接口)
-步骤2:编写程序,根据文件接口解析参数绘制图形
-步骤3:编制数据文件
代码:
#自动轨迹绘制
import turtle as t
t.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的作用是将第一个参数的功能作用于第二个参数中的每一个元素
f.close()
#自动绘制
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])
举一反三:
理解方法思维
-自动化思维:数据和功能分离,数据驱动的自动运行
-接口化设计:格式化设计接口,清晰明了
-二维数据应用:应用维度组织数据,二维数据最常用
应用问题的扩展
-扩展接口设计,增加更多控制接口
-扩展功能设计,增加弧形等更多功能
-扩展应用需求,发展自动轨迹绘制到动画绘制
13. 一维数据的格式化与处理
从一个数据到一组数据
一个数据表达一个含义,一组数据表达一个或多个含义
一维数据:由对等关系的有序或无序数据构成,采用线性方式组织
-对应列表、数组和集合等概念
二维数据:由多个一维数据构成,是一维数据的组合形式
多维数据:由一维或二维数据在新维度上扩展形成
高维数据:仅利用最基本的二元关系展示数据间的复杂结构
如:字典中键值对
数据的操作周期:
存储<->表示<->操作
14. 一维数据的表示
如果数据间有序:使用列表类型
ls=[3.1398,3.1349,3.1376]
-列表类型可以表达一维有序数据
-for循环可以遍历数据,进而对每个数据进行处理
如果数据间无序:使用集合类型
st={3.1398,3.1349,3.1376}
-集合类型可以表达一维无序数据
-也可使用for循环遍历数据,进而对每个数据进行处理
15. 一维数据的存储
●存储方式一:空格分隔
-使用一个或多个空格 分隔进行存储,不换行
-缺点:数据中不能存在空格
●存储方式二:逗号分隔
-使用英文半角逗号分隔数据进行存储,不换行
–缺点:数据中不能存在英文逗号
●存储方式三:其他方式
-使用其他符号或符号组合分隔,建议采用特殊符号
-缺点:需要根据数据特点定义,通用性较差
16. 一维数据的处理
-从空格分隔的文件中读入数据
-从特殊符号分隔的文件中读入数据
-采用空格分隔方式将数据写入文件
17. 二维数据的格式化和处理
18. CSV数据存储格式
CSV: Comma-Separated Values 指由逗号分隔的值
-国际通用的一二维数据存储格式,一般以.csv为扩展名
-每行一个一维数据,采用逗号分隔,无空行
-Excel和一般编译软件都可以读入或另存为csv文件
-如果某个元素缺失,逗号仍要保留
-二维数据的表头可以作为数据存储,也可以另行存储
-逗号为英文半角逗号,逗号与数据之间无额外空格
-按行存或者按列存都可以,具体由程序决定
-一般索引习惯:ls[row][column],先行后列
-根据一般习惯,外层列表每个元素是一行,按行存
19. 二维数据的读入处理
从CSV格式的文件中读入数据
fo=open(fname)
ls=[]
for line in fo:
line=line.replace(“\n”,””)
ls.append(line.split(","))
fo.close()
将数据写入CSV格式的文件
ls=[[],[],[]] #二维列表
f=open(fname,’w’)
for item in ls:
f.write(‘,’.join(item)+’\n’)
f.close()
- 二维数据的逐一处理
采用二层循环
ls=[[1,2],[3,4],[5,6]] #二维列表
for row in ls:
for column in row:
print(column)
- wordcloud库的使用
wordcloud是优秀的词云展示第三方库,能够将一段文本变成一个词云
词云以词语为基本单位,更加直观和艺术地展示文本
wordcloud库把词云当作一个WordCloud对象
-wordcloud.WordCloud()代表一个文本对应的词云
-可以根据文本中词语出现的频率等参数绘制词云
-绘制词云的形状、尺寸和颜色都可以设定
W=wordcloud.WordCLoud()
-以WordCloud对象为基础
-配置参数、加载文本、输出文件
-步骤1:配置对象参数
-步骤2:加载词云文本
-步骤3:输出词云文件
import wordcloud
c=wordcloud.WordCloud()
c.generate("wordcloud by python")
c.to_file("pywordcloud.png")
*默认输出图片为400×200像素
Wordcloud库做了什么?
① 分隔:以空格分隔单词
② 统计:单词出现的次数并过滤,次数多的显示词云效果的字体会很大,参数少的字体小。还会将一些很短的单词比如只有1到2个字母和字符的单词过滤掉
③ 配置字体:根据统计配置字号
④ 布局:颜色环境尺寸
```python
import jieba
import wordcloud
txt = "程序设计语言是计算机能够理解和\
识别用户操作意图的一种交互体系,它按照\
特定规则组织计算机指令,是计算机能够自\
动进行各种运算处理。"
w=wordcloud.WordCloud(width=1000,\
font_path="msyh.ttc",height=700)
w.generate(" ".join(jieba.lcut(txt)))
w.to_file("pywcloud1.png")
-中文需要先分词并组成空格分隔字符串
- 政府工作报告词云
直观理解政策文件
-需求:对于政府工作报告等政策文件,如何直观理解?
-体会直观的价值:生成词云&优化词云
基本思路:
-步骤1:读取文件、分词整理
-步骤2:设置并输出词云
-步骤3:观察结果,优化迭代(不满意则返回第一步)
import jieba
import wordcloud
f=open("新时代中国特色社会主义.txt","r",encoding="utf-8")
t=f.read()
f.close()
ls=jieba.lcut(t)
txt=" ".join(ls)
w=wordcloud.WordCloud(font_path="msyh.ttc",\
width=1000,height=700,background_color="white",\
)
w.generate(txt)
w.to_file("pywcloud2.png")
结果:
import jieba
import wordcloud
f=open("关于实施乡村振兴战略的意见.txt","r",encoding="utf-8")
t=f.read()
f.close()
ls=jieba.lcut(t)
txt=" ".join(ls)
w=wordcloud.WordCloud(font_path="msyh.ttc",\
width=1000,height=700,background_color="white",\
)
w.generate(txt)
w.to_file("pywcloud3.png")
对单词数进行限制:
import jieba
import wordcloud
f=open("新时代中国特色社会主义.txt","r",encoding="utf-8")
t=f.read()
f.close()
ls=jieba.lcut(t)
txt=" ".join(ls)
w=wordcloud.WordCloud(font_path="msyh.ttc",\
width=1000,height=700,background_color="white",\
max_words=15 #限制单词数目
)
w.generate(txt)
w.to_file("pywcloud2limit.png")
import jieba
import wordcloud
f=open("关于实施乡村振兴战略的意见.txt","r",encoding="utf-8")
t=f.read()
f.close()
ls=jieba.lcut(t)
txt=" ".join(ls)
w=wordcloud.WordCloud(font_path="msyh.ttc",\
width=1000,height=700,background_color="white",\
max_words=15 #限制单词数目
)
w.generate(txt)
w.to_file("pywcloud3limit.png")
作业
(1)单选题
1
1 分
以下选项不是Python文件读操作的是:
A
readlines()
B
readtext()
C
readline()
D
read()
正确答案 B
没有readtext()方法
2
1 分
二维列表ls=[[1,2,3], [4,5,6],[7,8,9]],哪个选项能获取其中元素5?
A
ls[4]
B
ls[-1][-1]
C
ls[1][1]
D
ls[-2][-1]
正确答案 C
这是二维切片的使用方式。
3
1 分
关于文件关闭的close()方法,哪个选项的描述是正确的?
A
如果文件是只读方式打开,仅在这种情况下可以不用close()方法关闭文件
B
文件处理结束之后,一定要用close()方法关闭文件
C
文件处理遵循严格的“打开-操作-关闭”模式
D
文件处理后可以不用close()方法关闭文件,程序退出时会默认关闭
正确答案 D
打开文件后采用close()关闭文件是一个好习惯。如果不调用close(),当前Python程序完全运行退出时,该文件引用被释放,即程序退出时,相当于调用了close()。
4
1 分
给定列表ls = [1, 2, 3, “1”, “2”, “3”],其元素包含2种数据类型,哪个选项是列表ls的数据组织维度?
A
多维数据
B
一维数据
C
二维数据
D
高维数据
正确答案 B
列表元素如果都是列表,其可能表示二维数据,例如:[[1,2], [3,4], [5,6]]。
如果列表元素不都是的将列表,则它表示一维数据。
5
1 分
关于CSV文件的描述,哪个选项的描述是错误的?
A
CSV文件通过多种编码表示字符
B
整个CSV文件是一个二维数据
C
CSV文件格式是一种通用的、相对简单的文件格式,应用于程序之间转移表格数据
D
CSV文件的每一行是一维数据,可以使用Python中的列表类型表示
正确答案 A
一般来说,CSV文件都是文本文件,由相同编码字符组成。
6
1 分
Python对文件操作采用的统一步骤是:
A
打开—读取—写入—关闭
B
操作—读取—写入
C
打开—读写—写入
D
打开—操作—关闭
正确答案 D
打开—操作—关闭 是一个统一步骤,其中,关闭可以省略。
7
1 分
关于数据组织的维度,哪个选项的描述是错误的?
A
二维数据采用表格方式组织,对应于数学中的矩阵
B
数据组织存在维度,字典类型用于表示一维和二维数据
C
高维数据由键值对类型的数据构成,采用对象方式组织
D
一维数据采用线性方式组织,对应于数学中的数组和集合等概念
正确答案 B
字典用于表示高维数据,一般不用来表示一二维数据。
8
1 分
对于Python文件,以下描述正确的是:
A
根据不同类型的文件,打开方式只能是文本或者二进制中的一种
B
当文件以二进制文件方式打开时,读取按照字符串方式
C
同一个文件可以既采用文本方式打开,也可以采用二进制方式打开
D
当文件以文本方式打开时,读取按照字节流方式
正确答案 C
文件就在那里,二进制或文本方式打开只是对其不同的程序理解。
9
1 分
以下选项对文件描述错误的是:
A
文件可以包含任何内容
B
文件是数据的集合和抽象
C
文件是程序的集合和抽象
D
文件是存储在辅助存储器上的数据序列
正确答案 C
函数或类是程序的集合和抽象,文件不是。
10
1 分
关于Python文件的‘+’打开模式,哪个选项的描述是正确的?
A
覆盖写模式
B
与r/w/a/x一同使用,在原功能基础上增加同时读写功能
C
追加写模式
D
只读模式
正确答案 B
'+'打开模式的精髓在于它能够同时赋予文件的读写权限。
(2)程序设计题
1.文本的平均列数
描述
打印输出附件文件的平均列数,计算方法如下:
(1)有效行指包含至少一个字符的行,不计算空行;
(2)每行的列数为其有效字符数;
(3)平均列数为有效行的列数平均值,采用四舍五入方式取整数进位。
#作业第一题
with open('latex.log', 'r', encoding='utf-8') as f:
row=0
column=0
for line in f:
line=line.replace("\n","")
if line=="":
continue
column=column+len(line) #列
row=row+1 #行
print(round(column/row))
#第一题标准答案
f = open("latex.log")
s, c = 0, 0
for line in f:
line = line.strip("\n")
if line == "":
continue
s += len(line)
c += 1
print(round(s/c))
2.CSV格式清洗与转换
描述
附件是一个CSV格式文件,提取数据进行如下格式转换:
(1)按行进行倒序排列;
(2)每行数据倒序排列;
(3)使用分号(;)代替逗号(,)分割数据,无空格;
按照上述要求转换后将数据输出。
#作业第二题
#第二题标准答案
f = open("data.csv")
ls = f.readlines()
ls = ls[::-1]
lt = []
for item in ls:
item = item.strip("\n")
item = item.replace(" ", "")
lt = item.split(",")
lt = lt[::-1]
print(";".join(lt))
练习
练习
1.文件行数
描述
打印输出附件文件的有效行数,注意:空行不计算为有效行数。
#练习第一题
fname="latex.log"
f=open(fname,"r")
t=0
for line in f:
line = line.strip('\n')
if len(line) > 0:
t += 1
else:
continue
print("共{}行".format(t))
2.文件字符分布
描述
统计附件文件的小写字母a-z的字符分布,即出现a-z字符的数量,并输出结果。
同时请输出文件一共包含的字符数量。
注意输出格式,各元素之间用英文逗号(,)分隔。
答案可能包含a-z共26个字符的分布,如果某个字符没有出现,则不显示,输出顺序a-z顺序。
#练习第二题
f=open("latex.log")
t=0
s={}
for i in range(26):
s[chr(ord('a')+i)]=0
for line in f:
for i in line:
s[i]=s.get(i, 0)+1
t=t+1
print("共{}字符".format(t),end="")
for i in range(26):
if s[chr(ord('a')+i)]!=0:
print(",{}:{}".format(chr(ord('a')+i), s[chr(ord('a')+i)]), end="")
3.文件独特行数
描述
统计附件文件中与其他任何其他行都不同的行的数量,即独特行的数量。
#练习第三题
#法一
fname="latex.log"
f=open(fname,"r")
f1=f.readlines() #建立一个列表,文件的每一行就是列表的一个元素,
f.seek(0)
f2=f.readlines() #建立第二个列表,用来作比较
f.close()
h=0
for i in range(len(f1)): #遍历每一行,寻找独特行
for j in range(len(f2)): #对于正在寻找的行,用第二个列表的每一行作对比
if i==j :#自己行不算
continue
elif f1[i]==f2[j]:#如果遇到相同行,跳过
break
else:#如果循环没有被打断,说明没有遇到相同行,则记录
h+=1
print("共{}独特行".format(h))
#法二
f = open("latex.log")
ls = f.readlines()
s = set(ls)
for i in s:
ls.remove(i)
t = set(ls)
print("共{}独特行".format(len(s)-len(t)))
4.CSV格式列变换
描述
附件是一个CSV文件,请将每行按照列逆序排列后输出,不改变各元素格式(如周围空格布局等)。
#练习第四题
f = open("data.csv","r")
for i in f:
t = i.replace("\n", "").split(",")[::-1]
print(",".join(t))
5.CSV格式数据清洗
描述
附件是一个CSV文件,其中每个数据前后存在空格,请对其进行清洗,要求如下:
(1)去掉每个数据前后空格,即数据之间仅用逗号(,)分割;
(2)清洗后打印输出。
#练习第五题
f = open("data.csv")
ls = f.readlines()
for i in ls:
i = i.strip("\n")
i = i.replace(" ", "")
t = i.split(",")
print(",".join(t))