Python学习(六)

文件和数据格式化

字符串格式化:”{}{}{}“.format()方法,对字符串的输出做一个格式化处理
数据格式化 : 将一定的数据进行规范地存储、处理。
从python角度理解文件和数据的表示。
学会编写带有文件输入输出的程序。

文件的使用

文件和文件类型

文件是数据的抽象和集合。
展现形态:文本文件/二进制文件

  1. 文本文件
    由单一特定编码组成的文件:例如,utf-8编码;
    由于存在编码,这样的文件可以看作长字符串
  2. 二进制文件
    直接由0/1组成的文件。在这类文件上不存在统一编码:例如图片、声音等等。

具体使用哪种形式,应该由程序使用的目的决定。

文件的打开和关闭

在处理文件的时候遵循一般的程序:打开、处理、关闭。
在占用状态程序可以排他地、唯一地对文件进行处理。

文件的打开

使用一个open函数完成。
<变量名> = open(<文件的路径和名称>,<打开方式>)

  1. 变量名也叫文件句柄。
  2. 文件路径和名称:文件路径可以使用相对路径也可以使用绝对路径。例如:“D:\python\a”,这是绝对路径,若当前程序在D目录下,可以使用".\python\a"来寻找文件,注意:在字符串中\表示转义符,所以必须要\来表示\。
  3. 打开方式:
文件的打开模式 描述
"r" 只读模式,如果文件不存在返回FileNotFoundError
"w" 只写模式,文件不存在则创建,文件存在则完全覆盖
"x" 创建写模式,创建新文件只写,若文件已存在返回FileExistError
"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个字符
f.readline(size=-1) 默认读出一行,若有输入则读出改行前size个字符
f.readlines(hint=-1) 默认读出全部行,若有输入则读出前size行,将他们作为列表输出
  1. 全文本处理
fname = input("请输入文件名")
fo = open(fname,"r")
txt = fo.read()
#对txt处理
f0.close()

问题:若文件太大,一次性读入非常划不来。甚至可能打不开。
2. 按数量读入逐步处理

fname = input("请输入文件名")
fo = open(fname, "r")
txt = fo.read(2)
while txt !=" "
	#对txt处理
	txt = fo.read(2)
  1. 实际上逐行处理更常见
fname = input("请输入文件名")
fo = open(fname, "r")
for line in fo.readlines():
	#全部读入逐行处理
#同样一次性读入全部会消耗很多内存
for line in fo:
	#分行读入逐行处理

数据文件的写入

操作 描述
f.write(s) 向文件中写入一个字符串
f.writelines(lines) 向文件中写入一个元素全为字符串的列表,不会分为多行
f.seek(offset) 改变文件当前的指针位置,0为文件头,1为当前位置,2为文件结尾
数据的文件写入
fo = open("output.txt","w")
ls = ['中国','美国','法国']
fo.writelines(ls)
fo.seek(0)
#这里如果删除这条语句将不会输出结果,因为遍历默认是从当前指针处开始的
#当前指针就是写入了上面那个列表后的位置了
for line in fo:
	print(line)
>>>'中国美国法国'

实例十一:自动轨迹绘制

指的是根据脚本来绘制图形。
使用数据脚本是自动化是最重要的一步。
数据接口定义:定义相应的数据接口完成自动轨迹绘制。

import turtle
turtle.setup(1200, 600, 0, 0)
turtle.pu()
turtle.goto(-300,0)
turtle.pd()
turtle.pensize(5)
turtle.pencolor("red")
turtle.title("自动文件绘制")
#数据读取
fo = open("data.txt")
datals = []
for line in fo:
    line.replace("\n","")
    datals.append(list(map(eval, line.split(","))))
    #map函数是对后一个参数每个都执行前一个函数的操作。
fo.close()
#自动绘制
for data in datals:
    turtle.pencolor(data[3], data[4], data[5])
    turtle.fd(data[0])
    if data[1]:
        turtle.right(data[2])
    else:
        turtle.left(data[2])

自动化思维:数据功能分离,用数据驱动功能
接口化设计:格式化设计接口,易于理解
二维数据:应用多维数据来组织

一维数据的格式化和处理

数据组织的维度

一维数据:由对等关系的有序或无序数据构成,采用线性方式组织。对应列表、数组、集合的概念。
二维数据:由多个一维数据构成,其中表头可以作为二维数据的一部分。
多维数据:可以由一维二维数据在更高的维度的扩展。
高维数据:仅仅使用基础的二元关系存储复杂的数据。

一位数据的表示

若一维数据是有序的:使用列表类型。
若数据间没有顺序:使用集合类型最合适。

一维数据的存储

  1. 一维数据存储按空格分开,不换行:数据中不能出现空格
  2. 一维数据存储按逗号分开,不换行:数据中不能出现逗号
  3. 采用其他特殊符号。

一维数据的处理

这里的处理:如何将存储的一维数据读入,表达为列表或者集合。

txt = open("f.txt").read()
ls = txt.split()
#文件按空格写入
ls = ['China','America',"France"]
f = open("f.txt","w")
f.write(' '.join(ls))
#join()方法的作用是把前面的字符分别插入后面所有的元素(除了末尾的)之间

二维数据的格式化和处理

二维数据的表示

采用二维列表表示,进一步采用两重for循环进行遍历。
一维数据:采用列表和集合的方式来表达
二维数据:采用二维列表的方式来表达。

CSV格式与二维数据存储

CSV:Comma-Sepearted Values 由逗号分割的值。国际通用的一二维数据存储模式,以.csv作为后缀名。

  1. 每行一个一维数据,逗号分割,没有空行。Excel和一般的软件都能编辑或者转换为csv格式。
  2. 如果某个元素缺失,逗号要保留
  3. 逗号为英文半角符,不能有额外空格。
  4. 对二维数据实际上按行或者列存都可以,但是习惯上按行存储。

二维数据的处理

  1. 读入处理:
fo = open("f.txt")
li =[]
for line in fo:
	line.replace("\n","")
	li.append(line.split(","))
fo.close()
  1. 写入数据
fo = open("f.txt", "w")
for i in li:
	fo.write(",".join(i)+"\n")
fo.close()

模块6:wordcloud词云

用来生成词云的python第三方库。

  1. wordcloud库中把词云当成一个WordCloud对象。
  2. wordcloud.WordCloud()代表一个文本对应的词云
  3. 根据词语的频率来绘制词云
  4. 绘制时字体、颜色、形状都可以设置

wordcloud库中的常规方法

方法 描述
w.generate(txt) 向wordcloud()对象中加载文本txt
w.to_file(filename) 将词云输出为图像,为png或者jpg格式
简单说有三步。
  1. 配置词云对象: w = wordcloud.WordCloud()
  2. 加载词云文本: w.generate(txt)
  3. 输出词云图片: w.to_file("wordcloud.png")

wordcloud做的工作

  1. 分割:以空格分割单词
  2. 统计:统计单词并过虑
  3. 字体:根据统计结果配置字体
  4. 布局:颜色环境尺寸

配置对象参数

wordcloud在生成时可以加入一些参数来配置。

参数 描述
width 指定词云输出像素的宽度,默认为400
height 指定词云输出像素的高度,默认为200
min_font_size 指定词云输出词汇的最小字体大小,默认为4
max_font_size 指定词云输出词汇最大字体的大小
font_step 指定词云词汇字体字号步进间隔,默认为1
max_words 指定词云显示的最大单词量,默认为200
stop_words 指定词云不显示的词汇集合
wordcloud.WordCloud(stop_words = {"777"})
mask 指定词云形状,默认为矩形
from scipy.misc import imread
mk = imread("pic.png")
background_color 指定词云图片的背景颜色,默认为黑色

例子

注意:如果是中文首先需要分词,然后用空格分隔才能生成词云

import wordcloud
w = wordcloud.WordCloud(background_color = "white",\
						width = 1000, height = 700,\
						stop_words={"python"})
w.generate("Life is short, you need python")	
w.to_file("Pywcloud.png")

实例十二:政府工作报告词云

问题分析:直观理解政府工作报告。
基本思路:

  1. 读取文件,分析处理
  2. 设置并输出词云
  3. 观察结果,优化迭代
import jieba
import wordcloud
from imageio import imread

mask = imread("fivestar.png")
fo = open("新时代中国特色社会主义.txt","r", encoding = "utf-8")
t = fo.read()
fo.close()
ls = jieba.lcut(t)
ls1 = []
for word in ls:
    if len(word)!=1:
        
        ls1.append(word)
txt = " ".join(ls1)
w = wordcloud.WordCloud( background_color = "white",\
                         font_path = "msyh.ttc",width = 1000, height = 700,\
                         max_words = 100, mask = mask)
w.generate(txt)
w.to_file("词云.png")

五角星掩膜的执行结果
这里就写了一段,另外的修改文件名即可。
吐槽一句:不知道为什么,我的wordcloud并不能识别单个字并且去除,在自己加了一段去除单字的代码后才成功输出了和嵩天老师一样的结果。原本的结果上全是“的,和,在”,满满的尴尬啊。

课后习题

1.文件行数

fo = open("latex.log")
n = 0
for line in fo.readlines():
    if line!="\n":
        n += 1
print("共{}行".format(n))
fo.close()

我一直纠结空格算不算是空行。
2.文件字符分布

alp = ['a','b','c','d','e','f','g','h',\
    'i','j','k','l','m','n','o','p','q',\
    'r','s','t','u','v','w','x','y','z'
]
f = open("latex.log")
txt = f.read()
count = 0
d = {}
for word in txt:
    count += 1
    if word in alp:
        d[word] = d.get(word, 0) + 1
print("共{}字符".format(count), end="")
for i in range(26):
    if d[alp[i]]!=0:
        print(",{}:{}".format(alp[i],d[alp[i]]),end="")
f.close()

这里大写居然不统计进去???
不太明白为什么。
3.文件独特行数

f = open("latex.log")
d = {}
count = 0
for line in f.readlines():
    d[line] = d.get(line, 0) + 1
for item in d:
    if d[item]==1:
        count += 1
print("共{}独特行".format(count))
f.close()

输出的文件独特行数。即字典中值为1的行数
4.CSV格式列变换

f = open("data.csv")
li1 = []
for line in f.readlines():
    line = line.strip("\n")
    li = line.split(",")
    print(",".join(li[::-1]))

5.CSV格式数据清洗

f = open("data.csv")
li1 = []
for line in f.readlines():
    line = line.strip("\n")
    li = line.split(",")
    for i in range(len(li)):
        li[i] = li[i].strip()
    print(",".join(li))

注意,strip()函数只分割两边,所以必须把每一个数据拆开再strip。这是发源于4的一个思路,也是处理csv数据的基本思路,如果直接用空格分割再join也是可以的,而且代码更简单。


以上内容为学习嵩天老师的python语言程序设计第七周内容的笔记。感谢嵩天老师的团队给我们带来这样优质的课程。

中国大学生MOOC《Python语言程序设计》,嵩天 、黄天羽 、礼欣

posted @ 2021-04-11 18:38  黑衣の甘铃儿  阅读(173)  评论(0)    收藏  举报