欢迎光临
我们一起进阶

python模块和类库—使用第三方类库

扫码或搜索:沉默王二
发送 290992
即可立即永久解锁本站全部文章

1、geoip2库:MaxMind GeoIP2 Python API

作用:返回给出的ip地址的地理信息,包括所在国家、城市、经纬度等,有在线查询和离线查询(本地导入数据库)两种,具体使用参考上面的链接。

2、python第三方库的使用说明一般在:

https://pypi.python.org/pypi/下上有其官方链接。

3、IPy库的使用:

(1)官方使用说明:https://pypi.python.org/pypi/IPy/

(2)IP(),当make_net设置为True时,会将给出的”IP地址/子网掩码”返回其网段;

即:>>> print(IP(‘127.0.0.1/255.0.0.0’, make_net=True))

127.0.0.0/8

代码中的说明:“If make_net is True, an IP address will be transformed into the network address by applying the specified netmask.”

 

4、kafka的使用:

(1)、创建KafkaProducer实例时,传入的初始化参数ack可选值(0,1,“all”)的含义:

参数ack表示当有producer发送数据时,broker(kafka服务器)收到消息后什么时候给该producer发送确认,

0表示不需要发送确认,1表示在这个topic的follower中,只要有一个consumer收到了,broker就发送确认,all表示这个topic的所有follower都接收到后,broker才发送确认

 

5、MySQLdb:

在MySQL中插入一条记录时,若字段类型为char,当sql语句使用format格式化时,相应字段名应该加单引号(’ ‘),e.g:

insert_tb_sql = “INSERT INTO {table_date}  (iType,sSrcIP,sTacticName,iAction,iNumPC,iNumMobile,iTotal,iDate,sMac,sOS) \
VALUES ({iType},'{ip}’,'{name}’,{act},{pc},{mobile},{total},{date},'{mac}’,'{os}’)”

 

6、MySQLdb安装问题:

在win7 x64下使用pip安装MySQL的Python接口库,即mysql-python(安装后可在Python中导入MySQLdb)时,经常会报以下错误:

解决方法:

(1)、在https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python 下载mysqlclient的whl文件(根据安装的Python解释器为2.x还是3.x, 32位还是64位来下载);

(2)、终端切换到上面下载的文件所在路径,然后使用pip install mysqlclient-1.3.13-cp27-cp27m-win32.whl即可(Python 2.x)。

 
7、user_agents:用于解析user_agent

如果要获取设备的user_agent,可以访问http://www.useragentstring.com/,获取具体当前设备的user_agent信息;

8、Python使用redis的api接口时,当使用StrictRedis实例的pubsub()方法得到一个PubSub类实例ps后,然后调用ps.subscribe()方法监听一个频道,再调用ps.getmessage()方法获取消息时,要注意每次读取消息的最大值默认为65536,如下图所示:

(2)redis的Python API接口使用的是select模型?

9、Python的redis库暂时不支持redis的集群连接方式(即redis客户端可以使用redis-cli -c [-p 端口号]以集群方式连接),如果redis以集群方式部署,且redis.StrictRedis实例连接的redis服务实例负责的槽(slot)不包含所要请求的key,则会抛出以下异常:

解决方法:

可以使用redis-py-cluster库解决,具体使用方法参考官方文档:redis-py-cluster document

9、sqlalchemy库:

简介:ORM工具,提供数据库访问接口(即使得具体使用的数据库对开发者透明,不管是使用sqlite,mysql还是postgresql,都可以使用同一行代码查询数据库),方便写数据库查询代码(即当不想使用mysqldb等数据库接口的cur.execute(sql语句)来访问数据库);

较好的使用总结:SqlAlchemy个人学习笔记完整汇总具体使用参考官方文档:写的不怎么好的官方文档

其他参考:Flask系列教程(21)——SQLAlchemy的ORM(2),Flask-SQLALchemy基本使用

(1)sqlalchemy的commit和flush的区别:

flush会把更改提交到数据库,commit会默认调用flush,然后标志这个事务的提交,也就是事务执行完毕。如果只调用flush,那么更新虽然可以被写入数据库,但是事务是不完整的,没有提交。由于事务隔离型的存在,可能其他的事务是无法看到这次更新操作的。只有调用了commit,才能被看成是事务完整的执行完毕。
具体参考:【mysql】sqlalchemy commit 和 flush

(2)sqlalchemy的相关用法:

a、基本操作:Python操作MySQL之SQLAlchemy

b、字段值自增(类似于sql语句的:update tb set field = field + n;):How to update SQLAlchemy row entry?,How to increase a counter in SQLAlchemy

c、绑定多个数据库:绑定多个数据库

使用orm定义表对应的类时,如果没有使用bind_key指明该表对应的数据库,则改表默认使用的数据库为SQLALCHEMY_DATABASE_URL变量指定的数据库。

d、sqlalchemy返回值:

如果单表查询某几个字段,则返回包含多个tuple的列表,如果查询所有字段,则返回字典类型,如果联表查询,则返回一个列表,列表的元素为包含联结的表的对象的tuple;

>>querys=session.query(MdRecord.project_id, MdRecord.page_id).filter(MdRecord.record_date == record_date). \
filter(~MdRecord.project_id.in_(['', 'null', 'undefined']), 
~MdRecord.page_id.in_(['', 'null', 'undefined']) 
).all() 
>> [('project_id', 'page_id')] # 返回值是一个list,里面是元组 


e、groupby和count:

 from sqlalchemy import func
session.query(Table.column,func.count(Table.column)).group_by(Table.column).all()

相关参考:Group by & count function in sqlalchemy

f、order_by和desc:

from sqlalchemy import desc
someselect.order_by(desc(table1.mycol))

或者:
table1.mycol.desc() 

相关参考:SQLAlchemy ORDER BY DESCENDING? 

g、实现left join:

query = (session.query(Ip, func.count(Client.id)).
outerjoin(ClientIp, ClientIp.ip_id==Ip.id).
outerjoin(Client, Client.id==ClientIp.client_id).
group_by(Ip.id)

)
具体参考:SQLAlchemy force Left Join

10、supervisor库的用法:使用 supervisor 管理进程

11、virtualenv库相关:

在安装了python2和python3环境中,使用virtualenv创建python3的虚拟环境时,使用以下指令:

virtualenv --python=$(which python3) env

具体参考:pip install for Python 3 in virtualenv on Mac OSX?

12、scrapy-redis和scrapy的区别:

具体参考:scrapy-redis 和 scrapy 有什么区别?

13、pillow库的使用:

(1)webp图片转为jpg


from PIL import Image im = Image.open(file_path) if im.mode=="RGBA": im.load() # required for png.split() background = Image.new("RGB", im.size, (255, 255, 255)) background.paste(im, mask=im.split()[3]) # 3 is the alpha channel im = background im.save('test.jpg','JPEG')

14、使用requests库下载音频、视频等大型文件:

def download_file(url):
    local_filename = url.split('/')[-1]
    # NOTE the stream=True parameter below
    with requests.get(url, stream=True) as r:
        r.raise_for_status()
        with open(local_filename, 'wb') as f:
            for chunk in r.iter_content(chunk_size=8192): 
                if chunk: # filter out keep-alive new chunks
                    f.write(chunk)
                    # f.flush()
    return local_filename

赞(1) 打赏
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

小白学堂,学的不止是技术,更是前程

关于我们免责声明

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏