生活札记
Python学习笔记 - 进阶(二)
Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。
Python解释器易于扩展,可以使用C语言或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器码。
2021年10月,语言流行指数的编译器Tiobe将Python加冕为最受欢迎的编程语言,20年来首次将其置于Java、C和JavaScript之上。
官网:https://www.python.org/downloads/
教程:https://www.bilibili.com/video/BV1yY4y1w7r8
教程:https://www.bilibili.com/video/BV1EE41187jY
编程语言排行:https://www.tiobe.com/tiobe-index/
1、基础
# Python关键字
import keyword # 关键字
import this # python 作者禅语
# 禅语
print(this)
# 保留关键字
print(keyword.kwlist)
# ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
# 格式化
str = "{0}{1}{0}".format("嗨呀", 666)
print(str)
str2 = "{name}{age}".format(name="飓风呀", age=20)
print(str2)
# map ** 展开
map = {"name":"飓风呀", "age":20}
str3 = "{name}{age}".format(**map)
print(str3)
# f方法格式化
str4 = "飓风呀"
print(f"{str4:*>10}")
print(f"{str4:*<10}")
print(f"{str4:*^10}")
# f方法多个输出
title = "请假条"
name = "张老师"
message = (
f"{title:-^15}\n"
f"To:{name}"
)
print(message)
# 多个输出
print(1,2,3,4)
print(1,2,3,4,end="\n\t")
print(1,2,3,4,sep="#")
# 复数complex
a = complex(3, 4)
# a = 3 + 4j
print(a)
# 运算符号:is、is not 判断是否是引用自同一个对象:id(x) == id(y),内存地址是否一致
a = 100
b = 100
print(a is b)
# for i in range(start,stop,step),不包含stop
for i in range(1, 10, 2):
print(i)
2、字符串
# 字符串
# 多行字符串
str = """
a
b
c
"""
print(str)
# 字符串切片:s[start:stop:step] 不包含stop
str1 = "Hello World!"
print(str1[1:5:3])
# 统计次数
print(str1.count("l"))
3、list列表
# list列表数组
# list 转成list
arr = list(range(1,10))
print(arr)
arr = list("Jufengya 飓风呀")
print(arr)
# list 切片 [start:stop:step] 不包含stop
arr = [10,20,30,40,50]
print(arr[0:2:1])
# max()、min()、sum():可转换的同类型,不同类型则报错
print(max(arr))
print(min(arr))
print(sum(arr))
# list + list 类似extend
arr1 = [1,2,3]
arr2 = [4,5,6]
arr3 = arr1 + arr2
print(arr3)
# list * 重复N次
print(arr3 * 3)
# in、not in
print(1 in arr3)
# 多维列表
arr4 = [[1,2,3], [4,5,6], [7,8,9]]
print(arr4)
# 赋值、浅拷贝copy()、深拷贝 copy.deepcopy()
import copy
num1 = [1,2,3]
num2 = num1 # 赋值,拷贝内存地址
num3 = num1.copy() # 浅拷贝:只能拷贝列表的一级元素,复制了嵌套的可变数据类型的地址
num4 = copy.deepcopy(num1) # 深拷贝:能拷贝所有层级的元素,复制了嵌套的可变数据类型的元素
print(id(num1))
print(id(num2))
print(id(num3))
num1.append(1)
print(id(num4))
4、tuple元组
# tuple元组:不可变,如果是可变元素可改,操作类似于列表
mylist = [1,2] # 可变
tup = (10,20,30, mylist)
# tup[1] = 21 # 报错
print(tup)
mylist[1] = 10
print(tup)
5、函数 def function
# 函数function
# 函数在定义时:* :将多个变量进行打包,变成元组
def testfunction(name, age=20, *args):
print(f"{name}:{age}")
print(args)
# 函数在定义时:** 作用:将多个变量进行打包,变成字典
def testfunction2(name, age=20, **kwargs):
print(f"{name}:{age}")
print(kwargs)
# *args 与 **kwargs 参数,如果在其他参数前面就必须使用键值对方式
def testArgs(*args, name, age=20, **kwargs):
print(f"{name}:{age}")
print(args)
print(kwargs)
# * 可变参数
def testArgs2(name, age=20, * , a, b):
print(f"{name}:{age}")
print(a)
print(b)
# 执行函数
testfunction("飓风呀",1,3,3,4,45,5)
testfunction2("飓风呀", 1, sex="男", colleague="清华北大")
# * 的作用是把参数解构出来
rate = [1,2,3,4]
# rate = (1,2,3,4)
# rate = {1,2,3,45}
testfunction("飓风呀",28, *rate)
# ** 的作用是把字典参数解构出来
rate = {"sex": "男", "colleague": "清华北大"}
testfunction2("飓风呀",28, **rate)
# 如果在其他参数前面就必须使用键值对方式
testArgs(1,2,3,name="飓风啊", age=10, dd=1,xx=2)
# * 做了一个占位符,a、b必须是键值对
testArgs2("飓风呀",10,a=1,b=10)
6、全局变量、局部变量
# 全局变量、局部变量
# 全局变量
a = 10
# 函数
def test1():
global a # global 声明全局
a = 20
b = 30
print(a,b)
print(locals()) # locals() 返回当前作用域的变量
print(globals()) # globals() 返回所有全局变量
# 执行函数
test1()
print(a)
# 不可变参数修改值不变,可变参数传递的是一个地址,改变值则会变
def test2(a, b):
a = 20
b.append("c")
print(a, b, id(b))
# 执行函数
x = 10
y = ["a", "b"]
test2(x,y)
print(x,y,id(y))
6、文件操作
# 文件
# open(文件, 模式, 编码)
# 写入
f = open("test.txt", "w", encoding="utf-8")
f.write("飓风呀\n") # 写入
data = ["飓风呀1\n","飓风呀2\n","飓风呀3\n"]
f.writelines(data) # 多行写入
f.flush() # 刷新缓冲区
f.close()
# 读取
f = open("test.txt", "r+", encoding="utf-8")
data = f.read(5) # read(字符个数)
print(data)
f.seek(0) # seek() 设置光标的位置,指的是字节位置
line = f.readline() # 读取行
print(line)
print(f.tell()) # tell() 光标的位置,指的是字节位置
lines = f.readlines() # 将数据按行读取到list中
print(lines)
f.truncate(6) # 清空光标后的数据
f.close()
# 读取二进制
f1 = open("head.jpg", "rb")
f2 = open("head_copy.jpg", "wb")
while True:
data = f1.read(100) # 每次读取100
if data: # 读取结束 b""
f2.write(data) # 写入
else:
break
f1.close()
f2.close()
7、打印包信息
# 打印包信息
import importtestA
print(help(importtestA))
8、爬虫
安装pip:前提:必须安装了pip,如果没安装,可以下载https://pypi.python.org/pypi/pip#downloads,然后解压,最后进入安装包,执行python setup.py 安装【默认安装在D:\py\Scripts中】
使用pip -help可查看pip的一些常用命令
然后使用:pip install packageName 来安装
BeautifulSoup文档:https://blog.csdn.net/m0_37623485/article/details/88324296
xlwt:https://blog.csdn.net/qq_45464895/article/details/122445117
# 爬虫
from bs4 import BeautifulSoup # 网页解析,获取数据
import re # 正则表达式
import urllib.request, urllib.error, urllib.parse # 制定URL,获取网页数据
import xlwt # excel操作
import sqlite3 # sqlite3数据库操作
import os
# 定义正则
re_sort = re.compile(r'<em class="">(\d+)</em>')
re_link = re.compile(r'<a.*href="(.*?)">')
re_imgsrc = re.compile(r'<img.*src="(.*?)"', re.S) # re.S 匹配包括换行在内的所有字符
re_title = re.compile(r'<span class="title">(.*?)</span>')
re_score = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
re_judge = re.compile(r'<span>(\d*)人评价</span>')
re_inq = re.compile(r'<span class="inq">(.*?)</span>')
re_content = re.compile(r'<p class="">(.*?)</p>', re.S)
# 模拟请求,头部信息
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0 Win64 x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"
}
# 请求网址
def askUrl(url):
# 返回html
html = ""
# 请求
request = urllib.request.Request(url, headers=headers)
# 处理错误
try:
response = urllib.request.urlopen(request)
html = response.read().decode("utf-8")
except urllib.error.URLError as e:
if hasattr(e, "code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
# 返回数据
return html
# 抓取网页
def getData(url):
# 开始抓取
print("开始抓取...")
# Get 请求
# response = urllib.request.urlopen("http://www.baidu.com/")
# response = response.read().decode("utf-8")
# f = open("index.html", "w", encoding="utf-8")
# f.write(response)
# f.close()
# Post 请求
# sendData = bytes(urllib.parse.urlencode({"name":"飓风呀"}), encoding="utf-8")
# response = urllib.request.urlopen("http://httpbin.org/post", data=sendData)
# response = response.read().decode("utf-8")
# print(response)
# 超时处理
# try:
# sendData = bytes(urllib.parse.urlencode(
# {"name": "飓风呀"}), encoding="utf-8")
# response = urllib.request.urlopen("http://httpbin.org/post", data=sendData, timeout=0.01)
# response = response.read().decode("utf-8")
# print(response)
# except Exception as e:
# print("time out!")
# Get 请求
# response = urllib.request.urlopen("http://www.baidu.com/")
# print(response.status) # 状态码
# print(response.getheader("Content-Type")) # 返回信息
# print(response.getheader("Server")) # 返回信息
# 模拟请求
# url = "http://httpbin.org/post" # 请求url
# url = "https://movie.douban.com/" # 请求url,没有模拟header返回爬虫418状态码
# headers = {
# "user-agent": "Mozilla/5.0 (Windows NT 10.0 Win64 x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"
# } # 头部信息
# sendData = bytes(urllib.parse.urlencode({"name": "飓风呀"}), encoding="utf-8") # 发送的数据
# request = urllib.request.Request(url=url, headers=headers, data=sendData, method="POST")
# response = urllib.request.urlopen(request)
# response = response.read().decode("utf-8")
# print(response)
# 返回数据
datalist = []
# 循环处理
for i in range(0, 10):
# 获取网页信息
html = askUrl(url + str(i * 25))
# 处理解析返回的html
bs = BeautifulSoup(html, "html.parser") # BeautifulSoup 返回整个html DOM文档
# 1、文档
# print(bs) # 整个文档
# print(bs.name) # document
# print(bs.title) # 元素标签
# print(bs.title.string) # 元素标签值
# print(bs.a.attrs) # 元素属性
# 2、文档遍历
# print(bs.head.contents)
# 3、文档搜索
# 1)、find_all()
# print(bs.find_all("a")) # 字符串过滤
# print(bs.find_all(re.compile("span"))) # 正则表达式
# print(bs.find_all(name_is_exists)) # 通过函数来过滤
# print(bs.find_all())
# print(bs.find_all(id="dale_movie_top250_bottom_right")) # kwargs 参数
# print(bs.find_all(class_="entrance-qrcode")) # class_ 指定
# print(bs.find_all(class_=True)) # class_ 全部
# print(bs.find_all(text="豆瓣")) # 文本
# print(bs.find_all(text=["豆瓣", "电影"])) # 文本
# print(bs.find_all(text=re.compile("\d"))) # 文本正则
# print(bs.find_all("a", limit=2)) # limit 限制
# 2)、select() css选择器
# print(bs.select("title")) # 属性
# print(bs.select("head title")) # 子标签
# print(bs.select("title ~ meta")) # 兄弟标签
# print(bs.select("p[class='quote']")) # 属性查找
# print(bs.select(".entrance-qrcode")) # css 类
# print(bs.select("#dale_movie_top250_bottom_right")) # css ID标签
# print(bs.select("title")[0].get_text()) # 获取内容
# 4、正则表达式
# 1)、方法:re.search()、re.match()、re.findall()、re.split()、re.finditer()、re.sub()
# 2)、模式:r.l:大小写不敏感、re.L:本地化识别匹配、re.M:多行匹配,影响$ 很 ^、re.S:使 . 匹配包括换行在内的所有字符、re.U:根据Unicode字符集解析字符,这个影响标识 \w \W \b \B、re.X:更灵活的方法将正则表达式写得更容易理解
# 3)、实践:
# print(re.search("AA", "abcdAAbbcc")) # 参数1:规则,参数2:模板
# print(re.findall("[A-Z]", "ABcdEfghIjK")) # 参数1:规则,参数2:模板
# print(re.sub("a", "A", "AbcdEfGAcaaA")) # 替换 a 替换成 A
# 建议在正则表达是中,被比较的字符串加上r,不用担心转义字符的问题
# a = r"\abcd\aa\'"
# print(a)
# 查找到对应的dom
list = bs.find_all('div', class_="item")
for item in list:
# 返回数据
data = []
# print(item)
# 转成字符串
item = str(item)
# 获取排名
sort = re.findall(re_sort, item)
data.append(sort[0])
# 获取链接
link = re.findall(re_link, item)
data.append(link[0])
# 获取图片
imgsrc = re.findall(re_imgsrc, item)
data.append(imgsrc[0])
# 获取标题
title = re.findall(re_title, item)
if len(title) >= 2:
# 中文名
data.append(title[0])
# 其他国家名称
otitle = title[1].replace("/", "")
data.append(otitle)
else:
# 中文名
data.append(title[0])
# 其他国家名称
data.append("")
# 评分
score = re.findall(re_score, item)
data.append(score[0])
# 评价人数
judge = re.findall(re_judge, item)
data.append(judge[0])
# 概述
inq = re.findall(re_inq, item)
if len(inq) != 0:
data.append(inq[0].replace("。", ""))
else:
data.append("")
# 内容
content = re.findall(re_content, item)
content = re.sub("<br(\s+)?/>(\s+)?", "", content[0]) # 去除<br>
content = re.sub("/", "", content) # 去除 /
content = content.strip() # 去除空格
data.append(content)
# 数据压入返回数据
datalist.append(data)
# 打印数据
# print(datalist)
# 返回数据
return datalist
# 根据函数搜索
def name_is_exists(tag):
return tag.has_attr("name")
# 保存数据
def saveData(saveName, datalist):
# # xlwt 操作 excel
# book = xlwt.Workbook(encoding='utf-8', style_compression = 0) # 创建workbook对象
# sheet = book.add_sheet("sheet666", cell_overwrite_ok = True) # 添加sheet
# sheet.write(0, 0, "Hello World!") # 写入数据
# book.save(path) # 保存
# # xlwt 操作 excel
# book = xlwt.Workbook(encoding='utf-8', style_compression = 0) # 创建workbook对象
# sheet = book.add_sheet("99乘法", cell_overwrite_ok = True) # 添加sheet
# for i in range(0, 9):
# for j in range(0, i+1):
# sheet.write(i, j, "%d * %d = %d" % (i+1, j+1, (i+1)*(j+1))) # 写入数据
# book.save("99乘法.xls") # 保存
# 创建保存excel
book = xlwt.Workbook(encoding='utf-8', style_compression = 0) # 创建workbook对象
sheet = book.add_sheet(saveName, cell_overwrite_ok=True) # 添加sheet
# 写入表头
col = ["排名", "详情链接", "图片链接", "中文名", "外国名", "评分", "评价数", "概况", "相关信息"]
for i in range(0, len(col)):
sheet.write(0, i, col[i]) # 写入数据
# 写入内容
for i in range(0, len(datalist)):
data = datalist[i]
for j in range(0, len(data)):
sheet.write(i+1, j, data[j]) # 写入数据
# 保存
book.save(saveName + ".xls")
# 输出
print("抓取完成!")
# 保存数据 Sql
def saveDataSql(name, datalist):
# 初始化数据库
# init_db()
# 3、插入
conn = sqlite3.connect(name + ".db") # 连接数据库
c = conn.cursor() # 获取游标
# 循环处理数据
for data in datalist:
sql = 'insert into ' + name + ' (sort, link, imgsrc, name, ename, score, judge, inq, content) values('+data[0]+', "'+data[1]+'", "'+data[2]+'", "'+data[3]+'", "'+data[4]+'", '+data[5]+', '+data[6]+', "'+data[7]+'", "'+data[8] +'"); '
# print(sql)
print("抓取:"+data[3]+" 成功")
c.execute(sql) # 执行sql
conn.commit() # 提交数据
c.close() # 关闭游标
conn.close() # 关闭数据库
# 输出
print("抓取完成!")
# 初始化数据库
def init_db():
# 连接数据库
conn = sqlite3.connect("movie.db")
c = conn.cursor() # 获取游标
sql = '''
create table movie(
id INTEGER primary key autoincrement,
sort int,
link text,
imgsrc text,
name vachart(50),
ename vachart(100),
score numeric,
judge numeric,
inq text,
content text
);
'''
c.execute(sql) # 执行sql
conn.commit() # 提交数据
conn.close() # 关闭数据库
# 主函数
def main():
# url
url = "https://movie.douban.com/top250?start=" # 请求url,没有模拟header返回爬虫418状态码
# 解析数据、爬取网页
datalist = getData(url)
# 保存数据
# saveName = "豆瓣电影top250"
# saveData(saveName, datalist)
# 保存数据 Sql
saveDataSql("movie", datalist)
# sqlite3 数据库测试
def sqlite():
# 1、连接数据库
# conn = sqlite3.connect("test.db")
# print("链接数据库")
# 2、创建表
# conn = sqlite3.connect("test.db") # 连接数据库
# c = conn.cursor() # 获取游标
# sql = '''
# create table company(
# id int primary key not null,
# name text not null,
# age int not null,
# address varchar(50) not null,
# salary real
# );
# '''
# c.execute(sql) # 执行sql
# conn.commit() # 提交数据
# conn.close() # 关闭数据库
# 3、插入
# conn = sqlite3.connect("test.db") # 连接数据库
# c = conn.cursor() # 获取游标
# sql = '''
# insert into company (id, name, age, address, salary) values(2, "飓风呀2", 22, "福建厦门2", 20.00);
# '''
# c.execute(sql) # 执行sql
# conn.commit() # 提交数据
# conn.close() # 关闭数据库
# 4、查询
conn = sqlite3.connect("test.db") # 连接数据库
c = conn.cursor() # 获取游标
sql = '''
select * from company
'''
data = c.execute(sql) # 执行sql
for row in data:
print(row)
conn.close() # 关闭数据库
# 爬取图片
def saveFiles(savePath):
# 开始抓取
print("开始抓取...")
# 验证目录是否存在,不存在则新建
if os.path.exists(savePath) == False:
# 创建多级目录
os.makedirs(savePath, mode=0o777)
# 查询数据图片url
conn = sqlite3.connect("movie.db") # 连接数据库
c = conn.cursor() # 获取游标
sql = '''
select id,imgsrc from movie order by sort asc
'''
data = c.execute(sql) # 执行sql
# 抓取图片
for row in data:
# 保存路径
row_split = row[1].split(".")
openPath = savePath + "/" + str(row[0]) + "." + row_split[-1]
# 请求
request = urllib.request.Request(row[1], headers=headers)
# 处理错误
try:
# 获取远程数据
response = urllib.request.urlopen(request)
imgdata = response.read()
# 写入文件
f = open(openPath, "ab")
f.write(imgdata)
f.close() # 关闭
print("抓取文件:" + openPath + " 成功")
except urllib.error.URLError as e:
if hasattr(e, "code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
c.close() # 关闭
conn.close() # 关闭数据库
# 抓取图片、保存到对应目录
print("抓取完成!")
# 执行主函数
if __name__ == '__main__':
# main()
# sqlite()
# 保存目录
savePath = "./static/images/poster"
saveFiles(savePath)
# 测试爬取json
# import bs4 # 网页解析,获取数据
import json
import urllib # 制定URL,获取网页数据
import urllib.request
import urllib.error
import urllib.parse # 制定URL,获取网页数据
# 模拟请求,头部信息
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0 Win64 x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"
}
# 请求网址
def askUrl(url):
# 返回html
html = ""
# 请求
request = urllib.request.Request(url, headers=headers)
# 处理错误
try:
response = urllib.request.urlopen(request)
html = response.read().decode("utf-8")
# print(html)
except urllib.error.URLError as e:
if hasattr(e, "code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
# 返回数据
return html
# 主函数
def main():
url = "https://www3.nhk.or.jp/news/json16/link/top/top_link.json?_=1663663507774"
data = askUrl(url)
# print(data)
# 转成json
rdata = json.loads(data)
print(rdata)
# 执行
if __name__ == '__main__':
main()
9、可视化:网页、图表、分词
echarts可视化图表库:https://echarts.apache.org/zh/index.html
词云:wordcloud:https://amueller.github.io/word_cloud/
# 导入 Flask、Jinjia2
from flask import Flask # 网页http处理
from flask import render_template
from flask import request
import sqlite3
# 词云
import jieba # 分词
from matplotlib import pyplot as plt # 绘图,数据可视化
from wordcloud import WordCloud # 词云
from PIL import Image # 图片处理
import numpy as np # 矩阵运算
# 实例化Flask
app = Flask(__name__)
# 定义路由
@app.route('/')
def hello():
return "Hello World"
# 带参数
@app.route('/user/<name>')
def user(name):
return "Hello %s" % name
# 带参数
@app.route('/info/<int:id>')
def info(id):
return "Info %d" % id
# 模板渲染
@app.route('/teplateinfo')
def teplateinfo():
# 定义参数
name = "Python"
lang = ["Python", "Golang", "PHP"]
person = {
"name":"飓风呀",
"sex":"女",
"age":28
}
return render_template("test/index.html", name=name,, person=person)
# 登录
@app.route("/login")
def login():
return render_template("test/login.html")
# 登录结果
@app.route("/login_result", methods=["POST", "GET"])
def login_result():
if request.method == "POST":
print(request.form)
return render_template("test/login_result.html", data=request.form)
# 图表
@app.route("/echarts")
def echarts():
# 分数
score = []
# 分数数量
score_count = []
# 查询统计评分
conn = sqlite3.connect("movie.db") # 连接数据库
c = conn.cursor() # 获取游标
sql = '''
select score,count(id) from movie group by score order by score asc
'''
data = c.execute(sql) # 执行sql
for row in data:
# score.append(str(row[0])) # 转字符串类型,tojson解析
score.append(row[0])
score_count.append(row[1])
c.close() # 关闭
conn.close() # 关闭数据库
# 渲染模板
print(score)
print(score_count)
return render_template("test/echarts.html", score=score, score_count=score_count)
# 词云
@app.route("/cloud")
def cloud():
# 词语
word = ""
# 1、查询
conn = sqlite3.connect("movie.db") # 连接数据库
c = conn.cursor() # 获取游标
sql = '''
select inq from movie where inq != ''
'''
data = c.execute(sql) # 执行sql
for row in data:
word += row[0]
c.close() # 关闭
conn.close() # 关闭数据库
# 2、分词
cut = jieba.cut(word)
words = " ".join(cut)
print(len(words))
# 3、生成图片遮罩
# 打开图片
img = Image.open("./static/assets/images/cloud.png")
# 图片转成数组
img_array = np.array(img)
# 词云
wc = WordCloud(
background_color="white",
mask=img_array,
font_path="msyh.ttc",
width=640,
height=640
)
wc.generate_from_text(words) # 处理分词
# 4、绘制生成图片
plt.switch_backend('agg') # agg模式
plt.figure(1)
plt.imshow(wc) # 使用图片遮罩
plt.axis("off") # 是否显示坐标
# plt.show() # 显示
# 输出保存图片
img = "./static/assets/images/cloud_new.png"
plt.savefig(img,dpi=500)
# 渲染
return render_template("test/cloud.html",img=img)
# 执行
if __name__ == "__main__":
# debug模式
app.run(debug=True)
# html模板输出
{% for key,value in data.items() %}
{{ key }} : {{ value }}<br>
{% endfor %}
<p>Name:{{ name }}</p>
<p>Lang:{% for i in lang %} {{ i }} {% endfor %}</p>
<p>Person:{% for i,v in person.items() %} {{ i }} : {{ v }} {% endfor %}</p>
<form action="{{ url_for('login_result') }}" method="POST">
<div>
姓名:<input name="name" id="name" type="text" placeholder="请输入姓名">
</div>
<div>
<input id="submit" type="submit" value="提交">
</div>
</form>
data: {{ score|tojson }}
文明上网理性发言!
已完结!