【笔记】《python语言程序设计》——文件和数据格式化
一、前言
学习就是一个不断的自下而上,自上而下的过程。
前段时间,学着用python实现网站的数据爬取,隐约get到python的一些语法和用法,感觉就是语法不难,关键在于解决问题的思维。
这是需求驱动后的学习。接下来,就需要对python进行系统地了解。
很早之前搜知乎的时候,就搜到MOOC上的一门《python语言程序设计》课程,讲得很好,而且,我还下载了课件,溜了一遍,感觉就挺有趣的。
趁着有了实战经验,就把这门入门课刷了一遍。果然是门好课!很适合小白入门,并系统学习,整个教学过程循序渐进,深入浅出,提纲挈领,很有意思!
课程是北京理工大学嵩天老师的《python语言程序设计》课程,现在已经开了11次课了。课程每个小视频短则几分钟,最长也不超过20分钟,不容易劝退。每章讲解有复习回顾及小结,在平台python123上有每章的练习和测试,直接反馈结果,激发继续学下去的兴趣。
个人感觉,老师说话速度慢了些,调成了2倍速播放,然后,花了大约3天的时间,把所有的视频,课件,练习和测试都刷了一遍,感觉对python的了解更系统了!
趁热打铁,把每章的知识点和练习、测试再进行整理回顾一下。
以下内容均来自课程:《python语言程序设计》 及平台python123,感兴趣的看课程视频,亲自练习,效果更好~
二、知识点
1.文件的使用
-
文件的类型
①本质上,所有文件都是二进制形式存储;形式上,所有文件采用文本文件和二进制文件展示;
②文件是数据的抽象和集合;(1)由单一特定编码组成的文件;由于存在编码,也被看成是存储着的长字符串;例如:.txt文件;.py文件等;(2)直接由比特0和1组成,没有统一字符编码,一般存在二进制0和1的组织结构,即文件格式;例如:.png文件;.avi文件等;
-
文件的打开和关闭
①文件处理的步骤:打开-操作-关闭
②打开模式
文件的打开模式 | 描述 |
---|---|
'r' |
只读模式,默认值,如果文件不存在,返回FileNotFoundError
|
'w' |
覆盖写模式,文件不存在则创建,存在则完全覆盖 |
'x' |
创建写模式,文件不存在则创建,存在则返回FileExistsError
|
'a' |
追加写模式,文件不存在则创建,存在则在文件最后追加内容 |
'b' |
二进制文件模式 |
't' |
文本文件模式,默认值 |
'+' |
与r /w /x /a 一同使用,在原功能基础上增加同时读写功能 |
#文本形式、只读模式、默认值
f=open('f.txt')
#文本形式、只读模式、同默认值
f=open('f.txt','rt')
#文本形式、覆盖写模式
f=open('f.txt','w')
#文本形式、追加写模式+读文件
f=open('f.txt','a+')
#文本形式、创建写模式
f=open('f.txt','x')
#二进制形式、只读模式
f=open('f.txt','b')
#二进制形式、覆盖写模式
f=open('f.txt','wb')
③文件的关闭
<变量名>.close()
-
文件内容的读取
①操作方法
操作方法 描述 <f>.read(size=1)
读入全部内容,如果给出参数,读入前size长度<br />例如, s=f.read(2)
结果为中国
<f>.readline(size=-1)
读入一行内容,如果给出参数,读入该行前size长度<br />例如, s=f.readline()
结果为中国是一个伟大的国家!
<f>.readlines(hint=-1)
读入文件所有行,以每行为元素形成列表;如果给出参数,读入前hint行<br />例如, s=f.readlines()
结果为['中国是一个伟大的国家!']
②文件的全文本操作
#方法一:遍历全文本,一次读入,统一处理 fname=input('请输入要打开的文件名称:') fo=open(fname,'r') txt=fo.read() fo.close() #方法二:遍历全文本,按数量读入,逐步处理 fname=input('请输入要打开的文件名称:') fo=open(fname,'r') txt=fo.read(2) while txt!='': txt=fo.read(2) fo.close()
③文件的逐行操作
#方法一:逐行遍历文件,一次读入,分行处理 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()
-
数据的文件写入
①操作方法
操作方法 描述 <f>.write(s)
向文件写入一个字符串或字节流 <f>.writelines(lines)
将一个元素全为字符串的列表写入文件 <f>.seek(offset)
改变当前文件操作指针的位置,offset含义如下: 0
-文件开头;1
-当前位置;2
-文件结尾
2. 实例11:自动轨迹绘制
思路:
步骤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(','))))
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])
t.done()
#data.txt
300,0,144,1,0,0
300,0,144,0,1,0
300,0,144,0,0,1
300,0,144,1,1,0
300,0,108,0,1,1
184,0,72,1,0,1
184,0,72,0,0,0
184,0,72,0,0,0
184,0,72,0,0,0
184,1,72,1,0,1
184,1,72,0,0,0
184,1,72,0,0,0
184,1,72,0,0,0
184,1,72,0,0,0
184,1,720,0,0,0
auto_route.gif
3.一维数据的格式化和处理
-
数据组织的维度
①一维数据:由对等关系的有序或无序数据构成,采用线性方式组织;对应列表、数组和集合等概念;
②二维数据:由多个一维数据构成,是一维数据的组合形式;表格是典型的二维数据;
③多维数据:由一维或二维数据在新维度上扩展形成;
④高维数据:仅利用最基本的二元关系展示数据间的复杂结构;
⑤数据的操作周期:存储<->表示<->操作
-
一维数据的表示
①如果数据间有序:使用列表;
②如果数据间无序:使用集合;
-
一维数据的存储
①方式1:空格分隔,不换行;缺点:数据中不能存在空格;
②方式2:英文半角逗号分隔,不换行;缺点:数据中不能存在英文半角逗号;
③其他方式:其他符号或符号组合分隔,建议采用特殊符号;缺点:需要根据数据特点定义,通用性较差;
-
一维数据的处理
①读入数据
# 从空格分隔的文件中读入数据 # 示例:中国 美国 日本 德国 法国 英国 意大利 txt=open(fname).read() ls=txt.split() f.close() # 从特殊符号分隔的文件中读入数据 # 示例:中国$美国$日本$德国$法国$英国$意大利 txt=open(fname).read() ls=txt.split('$') f.close() #结果:['中国','美国','日本','德国','法国','英国','意大利']
②写入数据
# 采用空格分隔方式将数据写入文件 ls=['中国','美国','日本'] f=open(fname,'w') f.write(' '.join(ls)) f.close() # 采用特殊分隔方式将数据写入文件 ls=['中国','美国','日本'] f=open(fname,'w') f.write('$'.join(ls)) f.close()
4.二维数据的格式化和处理
-
二维数据的表示:列表类型
-
CSV数据存储格式
①CSV:Comma-Separated Values
②国际通用的一二维数据存储格式,一般.csv扩展名
③每行一个一维数据,采用逗号分隔,无空行;
④如果某个元素缺失,逗号仍要保留;
⑤二维数据的表头可以作为数据存储,也可以另行存储;
⑥逗号为英文半角逗号,逗号与数据之间无额外空格;
-
二维数据的存储
①按行存或者按列存都可以,具体由程序决定;
②一般索引习惯:
ls\[row][column]
,先行后列;③根据一般协管,外层列表每个元素是一行,按行存;
-
二维数据的处理
①从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)
5.模块6:wordcloud库的使用
-
基本介绍
①wordcloud是优秀的词云展示第三方库;
②安装:
(cmd命令行)pip install wordcloud
-
使用说明
①常规方法
import wordcloud
#步骤1:以WordCloud对象为基础,配置对象参数
c=wordcloud.WordCloud()
#步骤2:加载词云文本
c.generate('wordcloud by Python')
#步骤3:输出词云文件
c.to_file('pywordcloud.png')
pywordcloud.png
②配置对象参数
w=wordcloud.WordCloud(<参数>)
参数 | 描述 |
---|---|
width | 指定词云对象生成图片的宽度,默认400像素 |
height | 指定词云对象生成图片的高度,默认200像素 |
min_font_size | 指定词云中字体的最小字号,默认4号 |
max_font_size | 指定词云中字体的最大字号,根据高度自动调节 |
font_step | 指定词云中字体字号的步进间隔,默认为1 |
font_path | 指定字体文件的路径,默认None |
max_words | 指定词云显示的最大单词数量,默认200 |
stop_words | 指定词云的排出词列表,即不显示的单词列表 |
mask | 指定词云形状,默认为长方形,需要引用imread() 函数<br />import imageio<br />mk=imageio.imread(‘bgpic.png’)<br />w=wordcloud.WordCloud(mask=mk) |
background_color | 指定词云图片的背景颜色,默认为黑色 |
补充 | |
scale | default=1,按照比例进行放大画布,如设置为1.5,则长和宽都是原来画布的1.5倍;若词云不清晰,该参数值越大越清晰,运行速度也越慢; |
mode | default=”RGB”,当参数为“RGBA”并且background_color不为空时,背景为透明; |
relative_scaling | default=.5,词频和字体大小的关联性 |
color_func | default=None ,生成新颜色的函数,如果为空,则使用 self.color_func |
regexp | 使用正则表达式分隔输入的文本 |
collocations | default=True,是否包括两个词的搭配 |
colormap | default=”viridis” ,给每个单词随机分配颜色,若指定color_func,则忽略该方法 |
random_state | 为每个单词返回一个PIL颜色 |
③英文词云
import wordcloud
txt='life is short, you need python'
w=wordcloud.WordCloud(background_color='white')
w.generate(txt)
w.to_file('pywcloud.png')
pywcloud.png
④中文词云
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('PYwcloud_ch.png')
PYwcloud_ch.png
三、练习
1. 文件行数
描述:打印输出附件文件的有效行数,注意:空行不计算为有效行数。
txt=open('latex.log','r',encoding='utf-8')
count=0
for line in txt:
line=line.replace('\n','')
if line=="":
continue
else:
count+=1
print('共{}行'.format(count))
2.文件字符分布
描述:统计附件文件的小写字母a-z的字符分布,即出现a-z字符的数量,并输出结果。
同时请输出文件一共包含的字符数量。
注意输出格式,各元素之间用英文逗号(,)分隔。
答案可能包含a-z共26个字符的分布,如果某个字符没有出现,则不显示,输出顺序a-z顺序。
f = open("latex.log")
cc = 0
d = {}
for i in range(26):
d[chr(ord('a')+i)] = 0
for line in f:
for c in line:
d[c] = d.get(c, 0) + 1
cc += 1
print("共{}字符".format(cc), end="")
for i in range(26):
if d[chr(ord('a')+i)] != 0:
print(",{}:{}".format(chr(ord('a')+i), d[chr(ord('a')+i)]), end="")
3.文件独特行数
描述:统计附件文件中与其他任何其他行都不同的行的数量,即独特行的数量。
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文件,请将每行按照列逆序排列后输出,不改变各元素格式(如周围空格布局等)。
data=open('data.csv','r')
for l in data:
m=l.replace('\n','').split(',')[::-1]
print(','.join(m))
5. CSV格式数据清洗
描述:附件是一个CSV文件,其中每个数据前后存在空格,请对其进行清洗,要求如下:
(1)去掉每个数据前后空格,即数据之间仅用逗号(,)分割;
(2)清洗后打印输出。
f = open("data.csv")
s = f.read()
s = s.replace(" ","")
print(s)
f.close()
四、测试
1.选择题
-
Python对文件操作采用的统一步骤是:
A 打开—读取—写入—关闭
B 打开—操作—关闭
C 打开—读写—写入
D 操作—读取—写入
打开—操作—关闭 是一个统一步骤,其中,关闭可以省略。
-
关于Python文件的‘+’打开模式,哪个选项的描述是正确的?
A 只读模式
B 追加写模式
C 与r/w/a/x一同使用,在原功能基础上增加同时读写功能
D 覆盖写模式
'+'打开模式的精髓在于它能够同时赋予文件的读写权限。
-
以下选项对文件描述错误的是:
A 文件是存储在辅助存储器上的数据序列
B 文件可以包含任何内容
C 文件是程序的集合和抽象
D 文件是数据的集合和抽象
函数或类是程序的集合和抽象,文件不是。
-
关于CSV文件的描述,哪个选项的描述是错误的?
A CSV文件格式是一种通用的、相对简单的文件格式,应用于程序之间转移表格数据
B CSV文件通过多种编码表示字符
C 整个CSV文件是一个二维数据
D CSV文件的每一行是一维数据,可以使用Python中的列表类型表示
一般来说,CSV文件都是文本文件,由相同编码字符组成。
-
对于Python文件,以下描述正确的是:
A 根据不同类型的文件,打开方式只能是文本或者二进制中的一种
B 当文件以文本方式打开时,读取按照字节流方式
C 同一个文件可以既采用文本方式打开,也可以采用二进制方式打开
D 当文件以二进制文件方式打开时,读取按照字符串方式
文件就在那里,二进制或文本方式打开只是对其不同的程序理解。
-
关于数据组织的维度,哪个选项的描述是错误的?
A 二维数据采用表格方式组织,对应于数学中的矩阵
B 数据组织存在维度,字典类型用于表示一维和二维数据
C 高维数据由键值对类型的数据构成,采用对象方式组织
D 一维数据采用线性方式组织,对应于数学中的数组和集合等概念
字典用于表示高维数据,一般不用来表示一二维数据。
-
关于文件关闭的close()方法,哪个选项的描述是正确的?
A 文件处理结束之后,一定要用close()方法关闭文件
B 文件处理遵循严格的“打开-操作-关闭”模式
C 如果文件是只读方式打开,仅在这种情况下可以不用close()方法关闭文件
D 文件处理后可以不用close()方法关闭文件,程序退出时会默认关闭
打开文件后采用close()关闭文件是一个好习惯。如果不调用close(),当前Python程序完全运行退出时,该文件引用被释放,即程序退出时,相当于调用了close()。
-
二维列表ls=[[1,2,3], [4,5,6],[7,8,9]],哪个选项能获取其中元素5?
A ls[4]
B ls[1][1]
C ls[-2][-1]
D ls[-1][-1]
这是二维切片的使用方式。
-
以下选项不是Python文件读操作的是:
A readlines()
B read()
C readtext()
D readline()
没有readtext()方法
-
给定列表ls = [1, 2, 3, "1", "2", "3"],其元素包含2种数据类型,哪个选项是列表ls的数据组织维度?
A 一维数据
B 二维数据
C 高维数据
D 多维数据
列表元素如果都是列表,其可能表示二维数据,例如:[[1,2], [3,4], [5,6]]。
如果列表元素不都是的将列表,则它表示一维数据。
2.程序设计题
- 文本的平均列数
描述:打印输出附件文件的平均列数,计算方法如下:
(1)有效行指包含至少一个字符的行,不计算空行;
(2)每行的列数为其有效字符数;
(3)平均列数为有效行的列数平均值,采用四舍五入方式取整数进位。
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))
请注意:for line in f获取的line包含每行最后的换行符(\n),所以,去掉该换行符进行统计。
- 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))
f.close()
注意:使用strip()方法去掉每行最后的回车,使用replace()去掉每行元素两侧的空格。
【笔记】《python语言程序设计》—Python基本语法元素