python遇到的模块集合

J

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() ,具备如下优点:

  1. 可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;

  2. 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()

输出结果为:

1574825443441

插入单条数据

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()

输出结果为:

1574826008736

获取最新插入数据

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()

输出结果为:

1574826531931

1574826555820

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()

输出结果为:

1574826989683

更改数据

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()

输出结果为:

1574827228280

查新数据

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")

查询结果为:

1574830700548

1574830690077

数据回滚

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()

运行结果为:

1574844220336

1574844201591

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 指定词云图片的背景颜色,默认为黑色 w=wordcloud.WordCloud(background_color="white")
原文地址:https://www.cnblogs.com/erlchixiha/p/11937793.html