Python语言程序设计(MOOC崇天)第七章文件和数据格式化学习笔记(自动轨迹绘制+政府工作报告词云)

复习:

  • 数字类型及操作:

  • 字符串类型和操作:

  • 程序分支结构

  • 程序的循环结构

  • 函数的定义与使用

  • 代码复用与函数递归

  • 集合类型及操作

  • 序列类型及操作

  • 字典类型及操作

本周内容:

  • 文件和数据格式化

 

  • 文件的使用

统一编码的是文本文件、没有同一编码的是二进制文件,但是无论哪种都可以以二进制打开!

        上图怎么理解?是这杨的,文本文件 print后就是“中国是个伟大的国家!”,二进制形式后就是一串天文数字,如果我们不需要理解文件意思,可直接用其存储的格式打开呀.....比如二进制文件。

文件的打开和关闭、

上图有话说:因为\是转义符,所以在python中用反斜杆/表示路径,或者用\\来表示路径

a+中如果没有+的话,那么就是指可以追加写模式,不能进行读,加了+后可以读啦。。。

我们写程序的时候要注意使用<变量名>.close() 如果忘记写了,文件会在程序执行期间一直打开,当程序正常运行完后python会自动关闭文件。最好写上<变量名>.close()哈哈

大文件来说一次性读入耗时大,不可取。可用下面的办法:

分行存储的文件,可以用回车来处理:

还可以分行读入,逐行处理:

#文件和数据格式化
fo = open(".\\txt\\output.txt", "w+")
ls = ["中国", "法国", "美国"]
fo.writelines(ls)
for line in fo:
    print(line)
fo.close()

          为什么没用打印输出呢?这是因为这个时候在文件的光标是在文件末,所以往下打印是没有内容的,这时我们需要加一句代码:fo.seek(0)使当前文件操作指针的位置是在文件开头。。

#文件和数据格式化
fo = open(".\\txt\\output.txt", "w+")
ls = ["中国", "法国", "美国"]
fo.writelines(ls)
fo.seek(0)
for line in fo:
    print(line)
fo.close()

关于文件使用的总结:

  • 实例:自动轨迹绘制

     从上面看来数据接口定义,就是关于数据所代表的意思。

错误:

Traceback (most recent call last):
  File "F:/PY/MOOCpython/AutoTraceDraw.py", line 11, in <module>
    for line in f:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence

解决:加了encoding=“utf-8”

#数据读取
datals =[]
f = open(".\\txt\\data.txt",encoding="utf-8")
for line in f:
    line = line.replace("\n", "")
    print(line)
    print(line.split(","))
    # datals.append(list(map(eval, line.split(","))))
f.close()

但是:

    datals.append(list(map(eval, line.split(","))))
  File "<string>", line 1
    300
       ^
SyntaxError: invalid character in identifier

这里原因是,用utf-8后发现用line = line.replace("\n", "")后,输出的结果是:

所以,因为用的全是数据,所以就将data.txt另存为ANSI格式,而不是utf-8后就好啦

#自动轨迹绘制
import turtle as t
t.title("自动轨迹绘制")
t.setup(800, 600, 0, 0)
t.pencolor("red")
t.pensize(5)

#数据读取
datals =[]
f = open(".\\txt\\data.txt")
for line in f:
    line = line.replace("\n", "")
    # print(line)
    # print(line.split(","))
    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])

  • 一维数据的格式化和处理

 

#一维数据的读入处理 从空格读入数据
txt = open(".\\txt\\output.txt").read()
ls = txt.split() #ls = txt.split(" ") 等价呀
print(ls)
# txt.close()

#一维数据的写入处理 才用空格分隔方式将数据写入文件
ls = ['china', 'USA', 'riben']
f = open('.\\txt\\采用空格分隔方式存入文件.txt', 'w')
f.write(' '.join(ls))
f.close()

ls = txt.split("$")
#采用特分隔方式将数据写入文件
ls = ['中国', '美国', '日本']
f = open('.\\txt\\采用特殊分隔方式存入文件.txt', 'w')
f.write('$'.join(ls))
f.close()

  • 总结:

  • 二维数据的格式化和处理

大数据和数据处理时会用其他结构去表达二维数据

有话说:上面的.csv是国际通用的一二维数据存储格式,中间没有空行,不同行就构成另一个维度

        如果你的数据里包含了逗号,怎么办呢?一般的csv软件,约定:在逗号加“”,先判断其逗号是否左右有引号

或者是,用转义字符/呀,如果在你逗号数据前面是 /,则可以认为是你的数据而不是分割号逗号

        csv数据存储格式是一种比较成熟的存储体系,能有处理这种的方法。。。。

  • 总结

  • wordcloud库

方法:

其实上面是有点区别:

stopwords={"NOWORD"}

  • wordcloud应用实例(英语和中文)

  • 实例12:政府工作报告词语

#政府报告词云
#引入wordcloud库
import wordcloud
#引入jieba库
import jieba
#引入matplotlib.pyplot库
import matplotlib.pyplot as plt
#打开文件
f = open(".\\txt\\新时代中国特色社会主义.txt", "r", encoding="utf-8")
#全部读取
t = f.read()
#关闭文件
f.close()
#精确模型,返回一个列表类型的分词结果
ls = jieba.lcut(t)
# 因为得到的分词是一个词组来的,是一个列表,我们要用join进行空格分隔成字符串
txt = " ".join(ls)
#配置对象参数(微软雅黑、背景、宽度、长度、不能显示的字、最多显示字数)
w = wordcloud.WordCloud(font_path="msyh.ttc", background_color="white",\
                        width=1000, height=700, stopwords={"NOWORD"},max_words=30)
#生成词云
w.generate(txt)
#保存在对应目录下
w.to_file(".\\picture\\pywordcloudGovernment.png")
#显示生成的次元
plt.imshow(w, interpolation='bilinear')
plt.axis("off")
plt.show()

下一步生成更有型的词云,该如何做呢?

只要上述三步就可以啦,但是问题来了,对于什么图像可以做为mask呢?

我稍微对比了下,只有white底图像才行,何为白底?左边不行,右边行.....

猜你喜欢

转载自blog.csdn.net/qq_37791134/article/details/83240424