jieba
jieba库是优秀的中文分词第三方库 ,它可以利用一个中文词库,确定汉字之间的关联概率将汉字间概率大的组成词组,形成分词结果,将中文文本通过分词获得单个的词语。jieba分词的三种模式 :精确模式、全模式、搜索引擎模式
1.精确模式:把文本精确的切分开,不存在冗余单词 2.全模式:把文本中所有可能的词语都扫描出来,有冗余 3.搜索引擎模式:在精确模式基础上,对长词再次切分
pip3 install jieba
主要函数
jieba.cut(s)
被运用于精确模式,将会返回一个可迭代的数据类型
jieba.cut(s,cut_all=True)
被运用于全模式,输出文本s中的所有可能单词
jieba.cut_for_search(s)
搜索引擎模式,适合搜索引擎建立索引的分词结果
jieba.lcut(s)
被运用于精确模式,将会返回一个列表类型
jieba.lcut(s,cut_all=True)
被运用于全模式,返回一个列表类型
jieba.lcut_for_search(s)
搜索引擎模式,返回一个列表类型
jieba.add_word(w)
向分词词典加入新词
L
heapq
排序取最大值,最小值
列表:
import heapq
nums = [15,23,51,65,76,122,257]
result1 = heapq.nlargest(4,nums)
result2 = heapq.nsmallest(5,nums)
print(result1)
print(result2)
结果:
[257, 122, 76, 65]
[15, 23, 51, 65, 76]
字典:
import heapq
students = [{"name":"AA","Score":88,"height":104},
{"name":"BB","Score":66,"height":108},
{"name":"CC","Score":90,"height":59},
{"name":"DD","Score":198,"height":50}]
result = heapq.nlargest(3,students,lambda x:x["Score"])
print(result)
结果:
[{'name': 'DD', 'Score': 198, 'height': 50}, {'name': 'CC', 'Score': 90, 'height': 59}, {'name': 'AA', 'Score': 88, 'height': 104}]
logging
1 模块简介
logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print() ,具备如下优点:
-
可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;
-
print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出;
2 模块使用
2.1 基本使用
控制台输出日志
import logging
logging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
logger.info("Start print log")
logger.debug("Do something")
logger.warning("Something maybe fail.")
logger.info("Finish")
输出结果为:
2019-11-26 14:34:38,024 - __main__ - INFO - Start print log
2019-11-26 14:34:38,025 - __main__ - WARNING - Something maybe fail.
2019-11-26 14:34:38,025 - __main__ - INFO - Finish
logging.basicConfig函数各参数:
参数名称 | 参数描述 |
---|---|
filename | 指定日志文件名 |
filemode | 指定打开方式,r[+],w[+],a[+] |
format | 日志输出的格式(见下表) |
datefmt | 日志附带时间日期的格式 |
level | 设置日志级别 |
stream | 定义输出流,不能和filename参数一起使用 |
handles | 定义处理器,不能和filename,stream参数一起使用 |
format输出格式:
变量 | 格式 | 变量描述 |
---|---|---|
asctime | %(asctime)s | 将日志的时间构造成可读的形式,默认情况下是精确到毫秒,如 2018-10-13 23:24:57,832,可以额外指定 datefmt 参数来指定该变量的格式 |
name | %(name) | 日志对象的名称 |
filename | %(filename)s | 不包含路径的文件名 |
pathname | %(pathname)s | 包含路径的文件名 |
funcName | %(funcName)s | 日志记录所在的函数名 |
levelname | %(levelname)s | 日志的级别名称 |
message | %(message)s | 具体的日志信息 |
lineno | %(lineno)d | 日志记录所在的行号 |
process | %(process)d | 当前进程ID |
processName | %(processName)s | 当前进程名称 |
thread | %(thread)d | 当前线程ID |
threadName | %threadName)s | 当前线程名称 |
将日志写到文件
将日志写到文件
设置logging,创建一个FileHandler,并对输出消息的格式进行设置
列表推导式
s = [1,[2,[3,4]]]
res = []
def fun(s):
for i in s:
if isinstance(i,list):
fun(i)
else:
res.append(i)
fun(s)
print(res)
递归解决,递归一定要有出口
# 一个条件
print([x for x in range(10) if x%2 == 0])
# 多个条件
print([x for x in range(30) if x%2==0 and x%6==0])
# if-else
print([x+1 if x>=5 else x*10 for x in range(10)])
# 嵌套列表推导
list_of_list = [[1,2,3],[4,5,6],[7,8]]
print([y for x in list_of_list for y in x])
结果:
[0, 2, 4, 6, 8]
[0, 6, 12, 18, 24]
[0, 10, 20, 30, 40, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8]
P
pymysql
增删改查操作
添加多条数据
import pymysql
conn = pymysql.connect(
host = "172.18.5.118",
port = 3306,
user = "root",
password = "123456",
database = "pymysqla",
)
# 获取光标
cursor = conn.cursor()
# 定义要执行的sql语句
sql = "insert into userinfo(user,pwd) values (%s,%s);"
data = [
("july","147"),
('june',"258"),
("marin","269")
]
# 拼接并执行sql语句
cursor.executemany(sql,data)
# 涉及写操作要注意提交
conn.commit()
# 关闭连接
cursor.close()
conn.close()
输出结果为:
插入单条数据
import pymysql
conn = pymysql.connect(
host = "172.18.5.118",
port = 3306,
user = "root",
password = "123456",
database = "pymysqla"
)
cursor = conn.cursor()
sql = "insert into userinfo(user,pwd) values (%s,%s);"
name = "wuli"
pwd = "123456789"
cursor.execute(sql,[name,pwd])
conn.commit()
cursor.close()
conn.close()
输出结果为:
获取最新插入数据
import pymysql
conn = pymysql.connect(
host = "172.18.5.118",
port = 3306,
user = "root",
password = "123456",
database = "pymysqla"
)
cursor = conn.cursor()
sql = 'insert into userinfo(user,pwd) values (%s,%s);'
name = "dalei"
pwd = "670544"
cursor.execute(sql,[name,pwd])
conn.commit()
# 获取最新的那一条数据的id
last_id = cursor.lastrowid
print("最后一条数据的id是:",last_id)
cursor.close()
conn.close()
输出结果为:
S
shutil
将一个文件下的文件转移到另一个文件夹
import os
import time
import shutil
src_path = 'C:/Users/lyx/Desktop/test12/'
target_path = 'C:/Users/lyx/Desktop/test13/'
whilr True:
# 返回指定路径下的文件和文件夹列表。
file_list = os.listdir(src_path)
if len(file_list) > 0:
for file in file_list:
shutil.move(src_path+file,target_path+file)
删除操作
import pymysql
conn = pymysql.connect(
host = "172.18.5.118",
port = 3306,
user = "root",
password = "123456",
database = "pymysqla"
)
cursor = conn.cursor()
sql = "delete from userinfo where user=%s;"
name = "june"
# 拼接要执行的sql语句
cursor.execute(sql,[name])
conn.commit()
# 关闭连接
cursor.close()
conn.close()
输出结果为:
更改数据
import pymysql
conn = pymysql.connect(
host = "172.18.5.118",
port = 3306,
user = "root",
password = "123456",
database = "pymysqla"
)
cursor = conn.cursor()
sql = "update userinfo set pwd=%s where user=%s;"
cursor.execute(sql,["july1","july"])
conn.commit()
cursor.close()
conn.close()
输出结果为:
查新数据
import pymysql
conn = pymysql.connect(
host = "172.18.5.118",
port = 3306,
user = "root",
password = "123456",
database = "pymysqla"
)
# 返回字典数据类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = "select user,pwd from userinfo;"
cursor.execute(sql)
ret1 = cursor.fetchone() # 取一条
ret2 = cursor.fetchmany(3) # 取三条
ret3 = cursor.fetchone() # 取一条
cursor.close()
conn.close()
print(ret1)
print(ret2)
print(ret3)
# 可以获取指定数量的数据
cursor.fetchmany(3)
# 光标按绝对位置移动到1
cursor.scroll(1,mode="absolute")
# 光标按照相对位置移动1
cursor.scroll(1,mode="relative")
查询结果为:
数据回滚
import pymysql
conn = pymysql.connect(
host = "172.18.5.118",
port = 3306,
user = "root",
password = "123456",
database = "pymysqla"
)
cursor = conn.cursor()
sql1 = "insert into userinfo(user,pwd) values (%s,%s);"
sql2 = "insert into hobby(id,hobby) values (%s,%s);"
user = "july1"
pwd = "july1"
# id = "我是错误的id"
id = 2
hobby = "打游戏"
try:
# 拼接并执行sql语句
cursor.execute(sql1,[user,pwd])
print(sql1)
cursor.execute(sql2,[id,hobby]) # 操作的sql语句
# 设计写操作注意提交
conn.commit()
except Exception as e:
print(str(e))
# 有异常就回滚
conn.rollback()
#关闭连接
cursor.close()
conn.close()
运行结果为:
U
urllib
原文链接:https://blog.csdn.net/bo_mask/article/details/76067790
在Python2版本中,有urllib和urlib2两个库可以用来实现request的发送。而在Python3中,已经不存在urllib2这个库了,统一为urllib
urllib中包括了四个模块:
urllib.request,urllib.error,urllib.parse,urllib.robotparser
urllib.request可以用来发送request和获取request的结果 urllib.error包含了urllib.request产生的异常 urllib.parse用来解析和处理URL
urllib.robotparse用来解析页面的robots.txt文件
模拟请求使用的最主要的库是urllib.request,异常处理是urllib.error
urllib.request
urllib.request.urlopen()基本使用
urllib.request 模块提供了最基本的构造 HTTP 请求的方法,利用它可以模拟浏览器的一个请求发起过程,同时它还带有处理 authenticaton (授权验证), redirections (重定向), cookies (浏览器Cookies)以及其它内容。
from urllib import request
import urllib
response = urllib.request.urlopen("https://www.baidu.com")
print(response.read().decode("utf-8"))
print(type(response))
<class 'http.client.HTTPResponse'>
通过输出结果可以发现它是一个 HTTPResposne 类型的对象,它主要包含的方法有 read() 、 readinto() 、getheader(name) 、 getheaders() 、 fileno() 等函数和 msg 、 version 、 status 、 reason 、 debuglevel 、 closed 等属性。 得到这个对象之后,赋值为 response ,然后就可以用 response 调用这些方法和属性,得到返回结果的一系列信息。例如 response.read() 就可以得到返回的网页内容, response.status 就可以得到返回结果的状态码,如200代表请求成功,404代表网页未找到等。
from urllib import parse
from urllib import request
import urllib
data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding='utf8')
response = urllib.request.urlopen('http://httpbin.org/post',data=data)
print(response.read().decode("utf-8"))
在这里我们传递了一个参数 word ,值是 hello 。它需要被转码成 bytes (字节流)类型。其中转字节流采用了 bytes() 方法,第一个参数需要是 str (字符串)类型,需要用 urllib.parse.urlencode() 方法来将参数字典转化为字符串。第二个参数指定编码格式,在这里指定为 utf8 。 提交的网址是 httpbin.org ,它可以提供 HTTP 请求测试。 http://httpbin.org/post 这个地址可以用来测试 POST 请求,它可以输出请求和响应信息,其中就包含我们传递的 data 参数。
运行结果如下:
{
"args": {},
"data": "",
"files": {},
"form": {
"word": "hello"
},
"headers": {
"Accept-Encoding": "identity",
"Content-Length": "10",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "Python-urllib/3.5"
},
"json": null,
"origin": "123.124.23.253",
"url": "http://httpbin.org/post"
}
timeout参数
timeout 参数可以设置超时时间,单位为秒,意思就是如果请求超出了设置的这个时间还没有得到响应,就会抛出异常,如果不指定,就会使用全局默认时间。它支持 HTTP 、 HTTPS 、 FTP 请求。
urllib.request.Request
由上我们知道利用 urlopen() 方法可以实现最基本的请求发起,但这几个简单的参数并不足以构建一个完整的请求,如果请求中需要加入 headers 等信息,我们就可以利用更强大的 Request 类来构建一个请求。
from urllib import request
import urllib
request1 = urllib.request.Request("https://www.baidu.com")
response = urllib.request.urlopen(request1)
print(response.read().decode("utf-8"))
可以发现,我们依然是用 urlopen() 方法来发送这个请求,只不过这次 urlopen() 方法的参数不再是一个URL,而是一个 Request ,通过构造这个这个数据结构,一方面我们可以将请求独立成一个对象,另一方面可配置参数更加 丰富和灵活
Request构造方法:
class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
第一个参数是请求链接,这个是必传参数,其他的都是可选参数。
data 参数如果要传必须传 bytes (字节流)类型的,如果是一个字典,可以先用 urllib.parse.urlencode() 编码。
headers 参数是一个字典,你可以在构造 Request 时通过 headers 参数传递,也可以通过调用 Request 对象的 add_header() 方法来添加请求头。请求头最常用的用法就是通过修改 User-Agent 来伪装浏览器,默认的 User- Agent 是 Python-urllib ,你可以通过修改它来伪装浏览器,比如要伪装火狐浏览器,你可以把它设置为 Mozilla/5.0 (X11; U; Linux i686)Gecko/20071127 Firefox/2.0.0.11
origin_req_host 指的是请求方的 host 名称或者 IP 地址。
unverifiable 指的是这个请求是否是无法验证的,默认是 False 。意思就是说用户没有足够权限来选择接收这个请求的结果。例如我们请求一个HTML文档中的图片,但是我们没有自动抓取图像的权限,这时 unverifiable 的值就是 True 。
method 是一个字符串,它用来指示请求使用的方法,比如 GET , POST , PUT 等等。
from urllib import request
import urllib.parse
url = "http://httpbin.org/post"
headers = {
#伪装一个火狐浏览器
"User-Agent":'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
"host":'httpbin.org'
}
dict = {
"name":"Germey"
}
data = bytes(urllib.parse.urlencode(dict),encoding="utf-8")
req = request.Request(url=url,data=data,headers=headers,method="POST")
response = urllib.request.urlopen(req)
print(response.read().decode("utf-8"))
通过四个参数构造了一个 Request , url 即请求链接,在 headers 中指定了 User-Agent 和 Host ,传递的参数 data 用了 urlencode() 和 bytes() 方法来转成字节流,另外指定了请求方式为 POST 。
运行结果如下:
{
"args": {},
"data": "",
"files": {},
"form": {
"name": "Germey"
},
"headers": {
"Accept-Encoding": "identity",
"Connection": "close",
"Content-Length": "11",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"
},
"json": null,
"origin": "1.85.221.5",
"url": "http://httpbin.org/post"
}
另外 headers 也可以用 add_header() 方法来添加。
req = request.Request(url=url, data=data, method='POST') req.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 5.5;Windows NT)')
如此一来,我们就可以更加方便地构造一个 Request ,实现请求的发送。
w
wordcloud
worldcloud是优秀的词云展示第三方库,以词语为展示单位,通过图形可视化的方式,更加直观和艺术的展示文本
pip install wordcloud
使用方法
w = wordcloud.WordCloud()
方法 | 描述 |
---|---|
w.generate | 向WorldCloud对象中加载文本txt w.generate("Python and WorldCloud") |
w.to_file(filename) | 将词云输出为图像文件.png或.jpg格式 w.to_file("outfile.png") |
import wordcloud
w = wordcloud.WordCloud()
w.generate("wordcloud by python")
w.to_file("pyworldcloud.png")
配置对象参数
w = wordcloud.WordCloud(<参数>)
参数 | 描述 |
---|---|
width | 指定词云对象生成图片的宽度,默认400像素 w=wordcloud.WordCloud(width=600) |
height | 指定词云对象生成图片的高度,默认200像素 w=wordcloud.WordCloud(height=400) |
min_font_size | 指定词云中字体的最小字号,默认4号 w=wordcloud.WordCloud(min_font_size=10) |
max_font_size | 指定词云中字体的最大字号,根据高度自动调节 w=wordcloud.WordCloud(max_font_size=20) |
font_step | 指定词云中字体字号的步进间隔,默认为1 w=wordcloud.WordCloud(font_step=2) |
font_path | 指定文体文件的路径,默认None w=wordcloud.WordCloud(font_path="msyh.ttc") |
max_words | 指定词云显示的最大单词数量,默认200 w=wordcloud.WordCloud(max_words=20) |
stop_words | 指定词云的排除词列表,即不显示的单词列表 w=wordcloud.WordCloud(stop_words="Python") |
mask | 指定词云形状,默认为长方形,需要引用imread()函数 from scipy.msc import imread mk=imread("pic.png") w=wordcloud.WordCloud(mask=mk) |
background_color | 指定词云图片的背景颜色,默认为黑色 |