异想天开

What's the true meaning of light, Could you tell me why

Python工具集

日期:2014-08-17 20:57:36
  
最后更新日期:2019-08-24 10:32:24
【技术文章,非码农误入】
文章适合于不熟悉Python,又想快速写个脚本实现业务需求的人
1.Python脚本里面有汉字时,需要指定编码集,一般utf-8就可以了 [code lang="cpp"]
# encoding: utf-8
#!/usr/bin/python
若程序需要处理utf8的文字,则:
#设置utf8
reload(sys)
sys.setdefaultencoding('utf8')
[/code]
备注:
今天发现老一点的python解释器,源代码指定编码格式时,需要#encoding:utf-8 中间不加空格。

2.Python脚本能包含其他Python脚本,每个Python脚本可以包含一个“main函数”作为测试该单元的逻辑,即桩程序。被其他脚本包含时,该段代码不可见。命令行执行python ./xxx.py时,就会首先执行xxx.py里面main代码块
[code lang="cpp"]
if __name__ == '__main__':
//代码块
[/code]

3.初次写python代码,难免出错,可以打印异常traceback,即代码执行到哪一行出错
[code lang="cpp"]
import traceback
try:
//代码块
except Exception,e:
print traceback.format_exc()
[/code]

4.类似gdb的调试方法,不过还是感觉上面那种方法有效,gdb一行行太麻烦了,导入pdb模块即可
[code lang="cpp"]
import pdb
pdb.set_trace()
[/code]

5.Python命令行参数,跟c类似
[code lang="cpp"]
import sys
print len(sys.argv),sys.argv[0]
[/code]

6.变量的作用域,在某个函数内,引用外面的全局变量,需要加global
[code lang="cpp"]
global xxxx
[/code]

7.python与mysql,安装MySQLdb模块即可,操作mysql接口简单,见首页手册

8.python与http,https方式
[code lang="cpp"]
import httplib,urllib
import pycurl
[/code]
http的方式,ip可以为ip或域名
[code lang="cpp"]
conn = httplib.HTTPConnection(ip,port)
params = urllib.urlencode({"size":10,"type":"long"})
headers = {'User-Agent':'A'*1460}
conn.request('GET','/query?'+must_params+"&"+params,"",headers)
print 'query',conn.getresponse().read()
[/code]
这里的request,第二个参数为路径,第三个参数为body,第四个参数为header。
备注:
这里是以python 2.6/2.7为例。python 3.0的httplib模块,改为了http.client模块。

https方式,需要查看官网的例子。另外一个例子,实现极光推送的例子,curl方式:
[code lang="cpp"]
curl -X POST -v https://api.jpush.cn/v3/push -H "Content-Type: application/json" -u "7d431e42dfa6a6d693ac2d04:5e987ac6d2e04d95a9d8f0d1" -d '{"platform":"all","audience":"all","notification":{"alert":"Hi,JPush!"}}'
报文消息
> POST /v3/push HTTP/1.1
> Authorization: Basic N2Q0MzFlNDJkZmE2YTZkNjkzYWMyZDA0OjVlOTg3YWM2ZDJlMDRkOTVhOWQ4ZjBkMQ==
[/code]
其中,HTTP Header(头)里加一个字段(Key/Value对):
Authorization: Basic base64_auth_string
其中 base64_auth_string 的生成算法为:base64(appKey:masterSecret),也就是curl -u参数
用Python的pycurl方式为:
[code lang="cpp"]
buffer = StringIO()
c = pycurl.Curl()
c.setopt(c.URL, 'https://api.jpush.cn/v3/push')
c.setopt(c.WRITEFUNCTION, buffer.write)
postfields='{"platform":"all","audience":"all","notification":{"alert":"Hi,JPush!"}}'
c.setopt(c.HTTPHEADER,['Content-Type: application/json','Content-Length:'+str(len(postfields))])
c.setopt(c.POSTFIELDS, postfields)
c.setopt(c.HTTPHEADER,['Content-Type: application/json','Content-Length:'+str(len(postfields))])
c.setopt(c.HTTPHEADER,['Authorization: Basic N2Q0MzFlNDJkZmE2YTZkNjkzYWMyZDA0OjVlOTg3YWM2ZDJlMDRkOTVhOWQ4ZjBkMQ=='])
#跟踪302跳转
c.setopt(c.FOLLOWLOCATION, True)
c.perform()
c.close()
body = buffer.getvalue()
print body
[/code]

9.python数据结构。python里的容器-元组,列表,字典,集合。注意可以嵌套
[code lang="cpp"]
a=() //空元组
a=(1,) //一个元素的元组
b={}或b=list()//空列表
c=[]或c=dict()//空字典
d=set([1,1,2,3]) //去重功能
[/code]
不同的数据结构实现不同的功能。元组不可修改,列表可修改。字典为关联类的数组,类似c++里面的map。集合主要用于求集合的集合间的操作,比如交集和并集。

10.python的注释,记得即使是注释也要对齐。python的注释为两个'''。

11.python直接执行语句
[code lang="cpp"]
python -c "print 'A'*100"
[/code]

12.python MySQLdb模块
InnoDB需要查看确认无误后,remote_db.commit()
[code lang="cpp"]
#!/usr/bin/python
import MySQLdb
import traceback

remote_movie_host='*.*.*.*'
remote_movie_port=3306
remote_movie_passwd='*'
remote_movie_dbname='*'
remote_movie_user='*'

def test():
remote_db=MySQLdb.connect(host=remote_movie_host,user=remote_movie_user,passwd=remote_movie_passwd,db=remote_movie_dbname,port=remote_movie_port)
remote_cur=remote_db.cursor()
sql = "SELECT VERSION()"
remote_cur.execute(sql)
results=remote_cur.fetchall()
for row in results:
print row


if __name__=='__main__':
test()

[/code]

13. python日志
[code lang="cpp"]
import logging
import logging.config
#日志
LOG_FILENAME = '/usr/local/foo/bar/conf/logging.conf'
logging.config.fileConfig(LOG_FILENAME)
logger = logging.getLogger("store_svr")
logger.debug("hello world")
[/code]
/usr/local/foo/bar/conf/logging.conf文件:
[code lang="cpp"]
[loggers]
keys=root,applog
[handlers]
keys=rotateFileHandler
[formatters]
keys=applog_format

[formatter_applog_format]
format=[%(asctime)s - %(name)s]%(levelname)s: %(message)s - %(filename)s:%(lineno)d

[logger_root]
level=NOTSET
handlers=rotateFileHandler

[logger_applog]
level=NOTSET
handlers=rotateFileHandler
qualname=simple_example

[handler_rotateFileHandler]
class=handlers.RotatingFileHandler
level=NOTSET
formatter=applog_format
args=('/usr/local/foo/bar/log/tongji.log', 'a', 36*1024*1024, 9)
[/code]

14.beauty print json
[code lang="cpp"]
cat json.file | python -m json.tool
[/code]

15.python的global关键字
global关键字标识该变量为全局的。之前是习惯引用全局变量的地方使用global关键,把它当作一次申明。实际上应该是在开始就申明一次这个变量为全局即可。多次申明可能会出现如下报错:
syntaxwarning: name global_xxxx is assigned to before global declaration

16.python随机排序
aaa=[1,2,3]
import random
bbb=random.sample(aaa,len(aaa))
print bbb

17.python处理时间
[code lang="cpp"]
from datetime import *
t_str = datetime.strptime("09/Jun/2017:14:33:34 +0800","%d/%b/%Y:%H:%M:%S +0800").strftime("%Y-%m-%d %H:%M:%S")
'2017-06-09 14:33:34'
datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
[/code]

18.python re模块
[code lang="cpp"]
import re
re_id = re.compile("\"/p/([0-9]+).html\"$", re.U)
re_id.match(my_str)
一般用compile将某个正则表达式生成re对象。正则匹配的时候,是匹配字符串的一段,默认匹配整行。
findall则找到所有的匹配。search匹配到该行末尾。如下例子:
>>> str_m="aa11bb22cc33dd44"
>>> s_r.split(str_m)
['aa', 'bb', 'cc', 'dd', '']
>>> s_r.findall(str_m)
['11', '22', '33', '44']
>>> s_r.match(str_m).group(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
>>> s_r.search(str_m)
<_sre.SRE_Match object at 0x1d43f38>
>>> s_r.search(str_m).group(0)
'11'
[/code]

19. 安装pandas时问题
安装到依赖numpy时挂了,显示如下:
It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
指定版本安装
pip install -I numpy==1.9.0


20. virtualenv
[code lang="cpp"]
pip3 install virtualenv
virtualenv --no-site-packages venv 创建不依赖系统的环境
source venv/bin/activate
deactivate
[/code]

21.json sort
[code lang="cpp"]
json.dumps(data,
skipkeys=False,
ensure_ascii=False,
check_circular=True,
allow_nan=True,
cls=None,
indent=None,
separators=(',', ':'),
encoding="utf-8",
default=None,
sort_keys=True)
[/code]

22.jupyter
[code ]
jupyter notebook --ip=0.0.0.0 --port=8081 --allow-root
[/code]