1. python其他库
[TOC]
- argparse
- jinja2
- codecs
- pipreqs
- colorama:命令行输出彩色文字
- curses
- csv相关
- excel相关
- word相关
- mongodb
- mysql/sqlalchemy
- redis
- OCR
- GUI库:PyQt5
- 进度条:tqdm
- kazoo:zookeeper API
- retrying
- inspect
1.1. argparse
链接:link
import argparse
if __name__=='__main__':
parser = argparse.ArgumentParser(description="Demo of argparse") # 参数解析器
parser.add_argument('cmd', type=str, nargs='?', help='help info')
parser.add_argument('-n', '--name', default=' Li ')
parser.add_argument('-y', '--year', default='20')
parser.add_argument('--debug', action="store_true") # 不需要跟值,使用该选项就会使debug属性为True。如果不加该参数,debug值默认False。'store_false'则相反
args = parser.parse_args()
print(args)
name = args.name
year = args.year
print('Hello {} {}'.format(name, year))
nargs
参数来限定输入的位置参数的个数,默认为1。当然nargs参数也可用于普通带标签的参数。
nargs 字符串:
'*'
:之后所有的输入都将作为该位置参数的值'+'
:表示读取至少1个该位置参数。'?'
:表示该位置参数要么没有,要么就只要一个。
参数被多次传递,可能会失真,尤其是带有单引号、双引号时。参考argparse模块。
1.2. jinja2
Jinja2是Python下一个被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能。其中最显著的一个是增加了沙箱执行功能和可选的自动转义功能,这对大多应用的安全性来说是非常重要的。
Flask使用jinja2作为框架的模板系统。使用django等其他Python web框架也可以方便的集成jinja2模板系统
如果将减号(-
)添加到块的开头或结尾(例如For标签),注释或变量表达式,则将删除该块之前或之后的空格。
from jinja2 import Template
template = Template('Hello {{ name }}!')
template.render(name='John Doe')
# Out: 'Hello John Doe!'
jinja2可以操作列表(元组 )、字典、对象。
列表:
li.0
li[0]
{% for i in range(10) %}
{{ i }}
{% endfor %}
jinja2预定义的一些变量:
变量 | 含义 |
---|---|
loop.index |
循环中的迭代计数,从1开始 |
loop.index0 |
循环中的迭代计数,从0开始 |
loop.first |
是否为循环的第一个元素 |
loop.last |
是否为循环的最后一个元素 |
loop.length |
循环序列中元素的个数 |
loop.depth |
当前循环在递归中的层级,从1开始 |
loop.depth0 |
当前循环在递归中的层级,从0开始 |
1.3. codecs
codecs : Python Codec Registry, API and helpers. coder, decoder
python的内部是使用unicode来处理的,但是unicode的使用需要考虑的是它的编码格式有两种,一是UCS-2,它一共有65536个码 位,另一种是UCS-4,它有2147483648g个码位。
可以通过以下代码查看:
import sys
print(sys.maxunicode)
import codecs
fw = codecs.open('test1.txt','a','utf-8')
fw.write(line2)
open(filename, mode='r', encoding=None, errors='strict', buffering=1)
1.4. pipreqs
pipreqs可以找到当前项目使用的所有python包及其版本。
# 1.在项目根目录下执行命令
pipreqs ./ # 报错就执行下面这条
pipreqs ./ --encoding=utf-8
# 2.可以看到在根目录下生成了requirements.txt
# 3.执行下面代码就会把项目用到的所有组件装上
pip3 install -r requirements.txt
1.5. colorama:命令行输出彩色文字
想要输出带有颜色的文字,需要加上前后缀。首先是27的8进制或者16进制的表示,然后a代表显示方式(可省略),x代表前景色(字体颜色),y代表背景色
"\033[a;x;ym【文字】\033[x;ym"
"\x1b[a;x;ym【文字】\x1b[x;ym"
前景色 背景色 颜色
---------------------------------------
30 40 黑色
31 41 红色
32 42 绿色
33 43 黃色
34 44 蓝色
35 45 洋红
36 46 青色
37 47 白色
显示方式 意义
----------------------------------
0 终端默认设置
1 高亮显示
22 非高亮显示
4 使用下划线
24 去下划线
5 闪烁
25 去闪烁
7 反白显示
27 非反显
8 不可见
28 可见
例:
\033[1;32;41m #---1-高亮显示 32-前景色绿色 40-背景色红色---
\033[0m #---采用终端默认设置,即缺省颜色---
colorama是一个python专门用来在控制台、命令行输出彩色文字的模块,可以跨平台使用。
colorama内部模块:Fore是针对字体颜色,Back是针对字体背景颜色,Style是针对字体格式。
Fore: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET.
Back: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, RESET.
Style: DIM, NORMAL, BRIGHT, RESET_ALL
init()接受一些 kwargs覆盖缺省行为,
autoreset是自动恢复到默认颜色。
from colorama import init, Fore, Back
init(autoreset=True)
print(Fore.BLUE + "hgg")
print(Fore.YELLOW + Back.RED + "XXXX")
print("hello world")
1.6. curses
python 中curses封装了c语言的curses。curses是一个在linux/unix下广泛应用的图形函数库,作用是可以在终端内绘制简单的图形用户界面。curses库不支持Windows操作系统,但有一个非正式curses包可以尝试,另外windows平台可以使用Console模块。
curses的名字起源于"cursor optimization",即光标优化。
可以说,curses是Linux终端图形编程的不二选择(比如著名的文字编辑器 vi 就是基于curses编的)。
1.7. csv相关
python标准库自带CSV模块。
import csv
csvfile = open('csv_test.csv', 'r')
# 以列表形式输出
reader = csv.reader(csvfile)
rows = [row for row in reader]
# 以字典形式输出,第一行作为字典的键
reader = csv.DictReader(csvfile)
for row in reader:
# row 是一个 dict
# 写文件
# 若存在文件,打开csv文件,若不存在即新建文件
# 如不设置newline='',每行数据会隔一行空白行
csvfile = open('csv_test.csv', 'w', newline='')
# 将文件加载到csv对象中
writer = csv.writer(csvfile)
# 写入一行数据
writer.writerow(['姓名', '年龄', '电话'])
# 多行数据写入
data = [
('小P', '18', '138001380000'),
('小Y', '22', '138001380000')
]
writer.writerows(data)
# 关闭csv对象
csvfile.close()
1.8. excel相关
python操作excel的有xlrd(xls read),xlwt(xls write)。
pip install xlrd
pip install xlwt
import xlwt
# 新建一个Excel文件
wb = xlwt.Workbook()
# 新建一个Sheet
ws = wb.add_sheet('Python', cell_overwrite_ok=True)
# 定义格式对象
style = xlwt.XFStyle()
# 合并单元格write_merge(开始行, 结束行, 开始列, 结束列, 内容, 格式)
ws.write_merge(0, 0, 0, 5, 'Python', style)
# 写入数据wb.write(行,列,内容)
for i in range(2, 7):
for k in range(5):
ws.write(i, k, i+k)
# Excel公式xlwt.Formula
ws.write(i, 5, xlwt.Formula('SUM(A'+str(i+1)+':E'+str(i+1)+')'))
# 插入图片,insert_bitmap(img, x, y, x1, y1, scale_x=0.8, scale_y=1)
# 图片格式必须为bmp
# x表示行数,y表示列数
# x1表示相对原来位置向下偏移的像素
# y1表示相对原来位置向右偏移的像素
# scale_x,scale_y缩放比例
ws.insert_bitmap('test.bmp', 9, 1, 2, 2, scale_x=0.3, scale_y=0.3)
# 保存文件
wb.save('file.xls')
import xlrd
wb = xlrd.open_workbook('file.xls')
# 获取Sheets总数
ws_count = wb.nsheets
# 通过索引顺序获取Sheets
# ws = wb.sheets()[0]
# ws = wb.sheet_by_index(0)
# 通过Sheets名获取Sheets
ws = wb.sheet_by_name('Python')
# 获取整行的值(以列表返回内容)
row_value = ws.row_values(3)
# 获取整列的值(以列表返回内容)
row_col = ws.col_values(3)
# 获得行列数
nrows = ws.nrows
ncols = ws.ncols
# 获取某个单元格内容cell(行, 列)
cell_F3 = ws.cell(2, 5).value
# 使用行列索引获取某个单元格内容
row_F3 = ws.row(2)[5].value
col_F3 = ws.col(5)[2].value
1.9. word相关
pip install python-docx
import docx
from docx.shared import Inches
doc = docx.Document('test.docx')
# 读取全部内容
paras = doc.paragraphs
# 处理每一个段落(以\n划分段落)
for p in paras:
# xxx
# 创建对象
document = Document()
# 添加正文内容并设置部分内容格式
p = document.add_paragraph('Python 爬虫开发-')
# 设置内容加粗
p.runs[0].bold = True
p.add_run('存储实例。').italic = True
# 添加正文,设置'样式'-'明显引用'
document.add_paragraph('样式-明显引用', style='IntenseQuote')
# 添加图片
document.add_picture('test.png', width=Inches(1.25))
# 添加表格
table = document.add_table(rows=1, cols=3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
# 保存文件
document.add_page_break()
document.save('test.docx')
1.10. mongodb
可视化工具:RoboMongo,MongoBooster。
pip install pymongo
import pymongo
# 创建对象
client = pymongo.MongoClient()
# client = pymongo.MongoClient('localhost', 27017)
# client = pymongo.MongoClient('mongodb://localhost:27017/')
# 进行认证
db_auth = client.admin
db_auth.authenticate(username, password)
# 用户验证方法2
# client = pymongo.MongoClient('mongodb://username:password@localhost:27017/')
# 连接DB数据库
db = client['DB']
# 连接集合user,集合类似关系数据库的数据表。如果集合不存在,会新建集合user
user_collection = db.user
# 插入数据,user_info是一个dict
user_id = user_collection.insert_one(user_info).inserted_id
# 批量添加,user_infos是一个关于dict的列表
user_collection.insert_many(user_infos)
更新文档
$set:指定键值,不存在则创建。
$unset:从文档中移除指定的键。
$inc:进行算术加减操作,只用于整数、长整数、双精度浮点数。
$rename:重命名字段名称
$push:如果指定的键存在,就向已有的数组末尾添加一个元素。否则创建一个新的数组。
$and、$or:后面跟数组。
$lt、$lte、$gt、$gte、$in、$nin:比较操作符。
$regex:正则表达式
1.11. mysql/sqlalchemy
pip install SQLAlchemy
pip install pymysql
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
# 创建数据表方法一
from sqlalchemy import Column, Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class mytable(Base):
# 表名
__tablename__ = 'mytable'
# 字段,属性
id = Column(Integer, primary_key=True)
name = Column(String(50), unique=True)
age = Column(Integer)
birth = Column(DateTime)
class_name = Column(String(50))
Base.metadata.create_all(engine)
# 创建数据表方法二
from sqlalchemy import Column, MetaData, ForeignKey, Table
from sqlalchemy.dialects.mysql import (INTEGER, CHAR)
meta = MetaData()
myclass = Table('myclass', meta,
Column('id', INTEGER, primary_key=True),
Column('name', CHAR(50), ForeignKey(mytable.name)),
Column('class_name', CHAR(50))
)
myclass.create(bind=engine)
engine = create_engine("mysql+pymysql://root:1990@localhost:3306/test?charset=utf8",echo=True)
DBSession = sessionmaker(bind=engine)
session = DBSession()
new_data = mytable(name='Li Lei',age=10,birth='2017-10-01',class_name='一年级一班')
session.add(new_data)
session.commit()
session.query(mytable).filter_by(id=1).update({ mytable.age : 12})
session.commit()
get_data = session.query(myclass.name, myclass.class_name).all()
get_data = session.query(myclass).filter_by(id=1).all()
# 内连接
get_data = session.query(mytable).join(myclass).filter(mytable.class_name == '三年级二班').all()
# 外连接
get_data = session.query(mytable).outerjoin(
myclass).filter(mytable.class_name == '三年级二班').all()
sql = 'select * from mytable '
session.execute(sql)
session.close()
1.11.1. 通过反射获取对象
反射可以得到2种对象,class 'sqlalchemy.ext.declarative.api.DeclarativeMeta' (class 'sqlalchemy.ext.automap.data_sync')
, class 'sqlalchemy.sql.schema.Table'
, Table一点都不好操作,推荐使用前一个。
from sqlalchemy import create_engine, MetaData, Table
from sqlalchemy.ext.automap import automap_base
engine = create_engine('mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(user, pswd, ip, port, dbname),
pool_size=30, pool_recycle=300, pool_pre_ping=True, echo=echo)
# Base.prepare本质是调用Base.metadata的reflect方法
def reflect_all_tables(engine):
Base = automap_base()
Base.prepare(engine, reflect=True)
table = Base.classes['data_sync'] # class 'sqlalchemy.ext.declarative.api.DeclarativeMeta'
table = Base.metadata.tables['data_sync'] # class 'sqlalchemy.sql.schema.Table'
def reflect_single_table(engine, table_name):
metadata = MetaData(engine)
metadata.reflect(engine, only=[table_name])
Base = automap_base(metadata=metadata)
Base.prepare()
table = metadata.tables[table_name]
table = Base.classes[table_name]
1.11.2. 反射没有主键的表
1.12. redis
1.13. OCR
pip install pyocr
pip install Pillow
Pillow处理图像。
from PIL import Image
from pyocr import tesseract
im = Image.open('1.png')
im = im.convert('L') # 图片转换为灰色图像, 转化后识别率更高
# 保存转换后的图片
im.save("temp.png")
code = tesseract.image_to_string(im)
print(code)
1.14. GUI库:PyQt5
pip install PyQt5
pip install PyQt5-tools
安装PyQt5-tools后,在Lib/site-packages/pyqt5-tools中找到designer.exe,用其进行界面设计。
将ui文件转换为py文件。
python -m PyQt5.uic.pyuic xxx.ui -o xxx_v.py
1.15. 进度条:tqdm
tqdm:阿拉伯语中的“process“,对循环或者迭代器,显示进度条。
from tqdm import tqdm import time for i in tqdm(range(19), desc="进度条"): time.sleep(0.5)
1.16. kazoo:zookeeper API
建立连接:
from kazoo.client import KazooClient
host = 'localhost:2181'
zk = KazooClient(host)
zk.start()
# 相关操作
zk.stop()
获得某个节点的信息,返回一个元组:
zk.get('/')
# Out[10]:(b'', ZnodeStat(czxid=0, mzxid=4, ctime=0, mtime=1558407882652, version=1, cversion=4, aversion=1, ephemeralOwner=0, dataLength=0, numChildren=6, pzxid=288))
获取某个节点的所有字节点,返回一个子节点名称的列表:
zk.get_children('/')
# Out[11]: ['default', 'route', 'zookeeper', 'test', 'config']
获取某个节点的acl(access control list),返回一个元组:
zk.get_acls('/')
# Out[12]: ([ACL(perms=31, acl_list=['ALL'], id=Id(scheme='world', id='anyone')), ACL(perms=31, acl_list=['ALL'], id=Id(scheme='digest', id='fsi:NLfFQJbUxUqJLJOtUIyVEQrlNeM='))], ZnodeStat(czxid=0, mzxid=4, ctime=0, mtime=1558407882652, version=1, cversion=4, aversion=1, ephemeralOwner=0, dataLength=0, numChildren=6, pzxid=288))
创建一个节点,返回一个路径字符串:
zk.create('/test/hg_test/test2/test3/node',b'hello world')
1.17. retrying
pip install retrying
from retrying import retry
# 一直重试,直到成功
@retry
def func():
pass
# 最多重试5次, 每次重试间隔时间增加2秒
@retry(stop_max_attempt_number=5, wait_incrementing_increment=2000)
1.18. inspect
inspect模块用于收集python对象的信息,可以获取类或函数的参数的信息,源码,解析堆栈,对对象进行类型检查等等。
from inspect import Signature, signature
# 获取函数参数及其默认值
sig = signature(getattr(A_Class, func_name))
for field, parameter in sig.parameters.items():
if parameter.default is not Signature.empty: # 参数带有默认值
print('参数名: {}, 默认值: {}'.format(field, parameter.default))