这里记录了从学习python以来的笔记,包括一些常用的python方法,希望能对初学者有帮助
标准库http://python.usyiyi.cn/python_278/library/index.html
eval 将str当成表达式,不用完整语句
exec 执行
search匹配不到不会异常,但是加了group就会了
.groups()[0]这样才是捕获的第一项
search里写正则实际上最好也用\\来表示\字符,或者加r'xxx'虽然大部分情况也会自动转义,但是
syntax error near unexpected token `newline'这个问题好像不影响结果
|要转义
field = '"'.join([domain + seg_c for seg_c in m3u8seg_list]) "为分隔符
多段设置 res['multi_segment'] = "true"
正则在前!!!
re.search('(.*?)playlist.m3u8',m3u8Url).group(1) 取第一个符合正则的,group(1)是第一个(),0是全部 因为search的结果是一个正则结果
re.findall ('(chunklist_.*)',chunklist_content)[0] findall用于输出数组
'%s%s'% (cdn,keyid)
replace不改变目标本身
base64输出会换行!!!!!!!!!!!!要输出replace('\n','')
缩进规则:一个缩进块的后面的代码缩进必须和第一行缩进方式相同,所以上一层是空格,可以从该层第一行开始用空格加缩进
finally:
if field:
res['field'] = field
res['multi_segment'] = "true"
脚本里的相对路径是相对linux命令的路径!!!
return 后就不执行了
else:
在taisan看信息
python ./share/plugin/metacafe/plugin1.py < "./var/tmp/crawler_tmp/metacafe_input.9725.1458635428.663116.331480"
只有一个<
url()方法返回opener.open
opener相当于一个请求器,可以给opener设置访问参数,这样后面的请求就都能用了, urllib2.install_opener(opener)是把这个opener弄成全局的urlopen方法调用的东西
read才会去读取
request具体请求,设置单次请求的参数
urllib2默认情况下会针对HTTP 3xx返回码自动进行redirect动作
python的包用pip安装更方便
python3要用pip3
升级依赖(如果有东西很可能是没装或者版本太低)
pip install --upgrade selenium
看依赖版本(pycharm也可以看)
>> import selenium
>>> selenium.__version__
post请求
page_buf = ''
cookie = cookielib.CookieJar()
opener2 = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
login_url = r'http://fwiptv.net/fw-check_login.php'
login_data = urllib.urlencode({'username': 'savecyber', 'password': 'fwiptv21'})
opener2.addheaders = [('Host', 'fwiptv.net'),
('User-Agent', 'Mozilla/5.0 (Ubuntu; X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0'),
('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),
('Accept-Language', 'en-us,en;q=0.5'),
('Accept-Encoding', 'gzip, deflate'),
('Connection', 'keep-alive'),]
opener2.open(login_url, login_data)
cookie_str=''
for item in cookie:
cookie_str+=item.name+"="+item.value+"; "
print cookie_str
post请求
print a,b,c 会用空格分割输出
conf写法 名:值或名=值
最简单的配置方法: xx.py 中有变量 sb=100
from xx import sb
ConfigParser其实可以加载多个配置文件
dbconf = ConfigParser.ConfigParser()
dbconf.read([a.conf,b.conf])
路径用linux下路径 ./当前 ../上一级
导入另一个文件夹下的包:
1.如果导入的模块和主程序在同个目录下,直接import就行了
2.如果导入的模块是在主程序(如bin)所在目录的子目录下,可以在子目录中增加一个空白的__init__.py文件,该文件使得python解释器将子目录整个也当成一个模块,然后直接通过“import 子目录.模块”导入即可。
3.如果导入的模块是在主程序所在目录的父目录下,则要通过修改path来解决,有两种方法:
(1)通过”import sys,sys.path.append('父目录的路径')“来改变,这种方法属于一次性的,只对当前的python解释器进程有效,关掉python重启后就失效了。
(2)直接修改环境变量:在windows中是 “ set 变量=‘路径’ ” 例如:set PYTHONPATH=‘C:\test\...’ 查看是否设置成功用echo %PYTHONPATH%,而且进到python解释器中查看sys.path,会发现已经有了新增加的路径了。这 种方式是永久的,一次设置以后一直都有效。在linux中是 "export 变量='路径' “,查看是" echo $变量 "
vobile@pc0055:~/PycharmProjects/clawlerSearch$ python bin/youtubeCrawlerSearch.py
['/home/vobile/PycharmProjects/clawlerSearch/bin'(python所在文件夹是有的), '/usr/lib/python2.7', '/usr/lib/python2.7/plat-i386-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode', 'lib']
python 多线程有问题
文件打开了要关闭,不然后面操作不了
file(xx,'rb')才是文件对象
运行要先切到python的目录下,否则路径可能会有问题
os.popen() 功能强于os.system() , os.popen() 可以返回回显的内容,以文件描述符返回。 注意要完全一样 比如"都不能少
t_f = os.popen ("ping 192.168.1.1")
print t_f.read()
getcwd()获取当前os工作目录
chdir(../crawler)切换工作目录,会切换整个python的工作目录!!!包括相对文件地址
三引号:''' 是三个单引号!! !!!
日志级别 ERROR>WARN>INFO>DEBUG
json.dumps python错误:'utf8' codec can't decode byte 0xe1 in position 5 …… 是编码问题
rst=unicode( rst , errors='ignore')
追踪异常
import traceback
traceback.print_exc()
配置文件读入时是字符串
不能多进程操作文件,如果你是写方式打开的,没有关闭,那你这文件实际上是个空文件。要关闭这个动作才把内容真正写到问价里去。你可以做个测试,在写打开的时候拷贝这个文件,打开备份肯定是个空文件。在多进程以同样方式同时打开同一个文件写的条件下: 1.如果以追加 方式写,会将所有进程所写的内容全部保存进文件,也就是说进程间对彼此已经完成的写入操作是可见的; 2.如果以覆盖 方式写,则只有最后一个执行写入操作的进程会将其内容保存进文件
也就是说,多进程后打开的才能写入
脚本语言包括函数都要先定义再使用!!所以最好在最后写main函数
json输入一定要用双引号
if param_dic.has_key('proxy'):
拿来eval的都要再包一层引号!!
三元表达式
true_part if condition else false_part
range方法
a=range(0,10,1) range(10) 这个写法不容易误会从零开始
虽然我们经常在Python中用圆括号将组元括起来,但是其实组元的语法定义只需要用逗号隔开即可,例如 x,y=y,x 就是用组元交换变量值的一个例子。
import 类或者模块,优先在项目里找
pass 空语句 do nothing 用作占位,保持语句完整如没有return 没有break的效果
字典 {} .get(key,default)没有则返回默认值 .get(key)没取到就是空
大量数据用xrange效率更快,因为产生迭代器
python 多线程无法同时访问cpu。因此用于io密集时用多线程才有意义
多进程在多核运行 调度由操作系统决定
None是啥都没有,是None直接可以当false用
python find不到报-1
只有0是false!!其他都是true!
格式化输出中%转义是双写%
反编码
a='\u559c\u6b22\u4e00\u4e2a\u4eba'
print a.decode('raw_unicode_escape') 这样输出的类型是unicode类型,需要 .encode('utf-8')
配置文件里写"ds"读取到的就是\"ds\"字符串
初始化是个问题,每个变量都要重新初始化,不然很容易用到以前的变量!如循环中前面声明的变量都tmd是能用的
for i in range(5):
if(i==0):
l=5;
当字典中没有该值的时候会报KeyError,最好是给默认值
要在循环的一开始就加初始化!!不能初始化的变量不要有!!没用的代码不要加!!
if a: a=''或None都是false
a=[1,2] a*2=[1,2,1,2]
queue
import Queue
myqueue = Queue.Queue(maxsize = 10)
myqueue.put(10) #放进一个item
myqueue.get() #默认先进先出
多线程
函数式t=threading.Thread(target=calc_sth)
可以按顺序传入参数 t = threading.Thread(target=run,args=(fnpath, dbconfpath,username))
或thread.start_new_thread(timer, (1,1))
对象式 创建threading.Thread的子类来包装一个线程对象
thread_arr[i].join(1):阻塞 进程 直到线程执行完毕。通用的做法是我们启动一批线程,最后join这些线程结束,设置参数则是对于每个线程,阻塞的最大时间
多线程需要把每一个线程独立的变量弄成参数,不能用全局 包括sql链接
threading.Thread(target = doAdd, args = (), name = 'thread-' + str(i)).start()
直接用threading.Thread,指定target 或建一个类继承threading.Thread,重写run()
Thread.isAlive()
Thread.join([timeout])
加锁部分无法多线程
当一个线程调用锁的acquire()方法获得锁时,锁就进入“locked”状态。每次只有一个线程可以获得锁。如果此时另一个线程试图获得这个锁,该线程就会变为“blocked”状态,称为“同步阻塞”。
global---将变量定义为全局变量。可以通过定义为全局变量,实现在函数内部改变变量值
没有global语句,是不可能为定义在函数外的变量赋值的。 但是没有global调用还是可以的
def func():
global x #为外面的x赋值 《定义函数里用的是外面的x!》
print 'x is', x
x = 2
print 'Changed local x to', x
x = 50
func()
print 'Value of x is', x
可重入:当被多个线程调用的时候,不会引用任何共享数据
多线程输入输出最好用队列!!
文件读写http://maincoolbo.iteye.com/blog/626655
写文件必须 fname.flush()或 fname.close()才会真正从内存里写进文件!!!!
str()转成人看的模式
repr(s)转成系统看的模式
"'Hello, world.'"
起名不能乱起,和系统模块不要重命名!
各种空的东西都可以当false
if []:
pass
命令行输入和输出可以用 < > python ./share/plugin/flashx/js_decode.py < "./var/tmp/crawler_tmp/flashx_input.12574.1471847270.795441.650431" >"./var/tmp/crawler_tmp/flashx_field_path.12574.1471847270.784080.548420"
json json.dumps()方法返回了一个str对象encodedjson(如int变number),我们接下来在对encodedjson进行decode,得到原始数据,需要使用的json.loads()函数(部分格式会改变) dumps编码成json格式(int变number) loads解码出来(number变int/long)
None 会变成json中的null
json用于传输 注意单双引号问题!!python超sb,能理解文件中的单引号json,不能理解字符串中的单引号json,所以干脆用字典传吧 或者replace一下
.replace('\\\'','')
str(d)
eval(s)
编码转化 text=download_page(iframe_url).decode('iso-8859-1').encode('utf-8')
pycurl http://bbs.chinaunix.net/thread-4134362-1-1.html pycurl是对curl封装 pycurl.version看
代码终归是依赖系统模块的
python http服务 python也是可以做http服务器的!
最简单的文件共享方式: 目录下 python -m SimpleHTTPServer 然后就可以用8000端口看文件了
如果有index.html就会显示页面
网络底层接口socket http://www.2cto.com/kf/201408/328150.html
python可以根据参数名传参数
def foo(ip,port):
print "%s:%d" % (ip,port)
foo(port=8080,ip="127.0.0.1") #127.0.0.1:8080
用枚举规范类型
student = ('ansheng', 20, 'Schoolboy', '[email protected]')
# 定义常量
NAME, AGE, SEX, EMAIL = range(4)
# 通过常量进行取值
>>> student[NAME]
根据原子编程思想,即每个开发子单元应该只应该完成一件事,就和一个原子一样,作为一个最小单位;
以及简洁设计思想,应该将每个设计划分到最小模块和细节进行设计,然后兼顾和拼凑整体设计;
如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就 不能直接修改原始对象--相当于通过“传值'来传递对象。
a=[2,3]遍历修改还是用range好
for i in a: i直接指向常量
i=i+1; 改变的是i本身的值,不是a 常量是改不了的
for i in range(len(a)):
a[i]=a[i]+1; 改变的是a[i]
for in 最后一次迭代的i后面也能用
os.popen 打开一个管道
终端看到的是标准输出和错误
现在替代:subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
subprocess的目的就是启动一个新的进程并且与之通信。
参数stdin, stdout, stderr分别表示程序的标准输入、输出、错误句柄。他们可以是PIPE,文件描述符或文件对象,也可以设置为None,表示从父进程继承。
可以使用上一个命令执行的输出结果作为下一次执行的输入 stdin=p1.stdout
标准输入和输出
默认是控制台 可以用ls|python meng.py 输进去
标准输出和标准错误(通常缩写为 stdout 和 stderr)是建立在每个UNIX系统内的管道(pipe)。当你 print 某东西时,结果输出到 stdout 管道中;当你的程序崩溃并打印出调试信息时(象Python中的错误跟踪),结果输出到 stderr 管道中。通常这两个管道只与你正在工作的终端窗口相联,所以当一个程序打印输出时,你可以看到输出,并且当一个程序崩溃时,你可以看到调试信息。(如果你在一个基于窗口的Python IDE系统上工作,stdout 和 stderr 缺省为“交互窗口”。)
重定向标准输入stdin 输出stdout 错误信息stderr
print 'Dive in'
saveout = sys.stdout #备份输出
fsock = open('out.log', 'w')
sys.stdout = fsock #改变输出
print 'This message will be logged instead of displayed'
sys.stdout = saveout
fsock.close()
可重定向
文件可以通过文件名自动建,但目录要专门建
(2,3,4)元组 不可变
[2,3,4] 数组
{'a':1,'b',2}字典
if elif
文件开头的#! /usr/bin/python
分成两种情况:(1)如果调用python脚本时,使用:
python script.py
#!/usr/bin/python 被忽略,等同于注释
(2)如果调用python脚本时,使用:
./script.py 需要弄成可执行权限
#!/usr/bin/python指定解释器的路径
dic.iteritems() 返回字典键值对迭代器对象 ((k,v),(k,v),(k,v))
dic = {'a':31, 'bc':5, 'c':3, 'asd':4, '33':56, 'd':0}
print dic.iteritems() #
for obj in dic.iteritems():
print obj,obj[0],obj[1]
#('a', 31) a 31
key = lambda d:d[1]
for i in dic.iteritems():
print key(i),
元组排序
sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})
sorted(student_tuples, key=lambda student: student[2]) 可以增加一个key函数在排序前执行,前面的每一项值放到后面函数里迭代
li = sorted(lis, key=lambda s: s['Big'])
sorted(student_objects, key=attrgetter('age'), reverse=True) reverse=True降序
print sorted(dic.iteritems(), key=lambda d:d[1], reverse = False )
匿名函数 lambda 参数:函数式
bar = lambda:'beginman'
print bar()
#如果没有参数,则lambda冒号前面就没有,如以上例子。
f=lambda x,y:x+y
print f(2,3)
编码声明
#.*coding[:=]\s*[0-9A-Za-z-_.]\+.*$ #coding=/: utf8 =前不能加空格
这个是python编译的编码,用来写中文注释
处理编码要 比如要插入
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
使其工作,使其更好,使其更快
profile.run('add(2,5)') 执行并分析语句用的时间和各函数次数
用python嵌套别的语言 结合python的编写高效和其他语言的运行高效(比如游戏的ai就是用python等语言写的)
简单方式:用jyphon(可以直接用java标准库) ironpython(c#和其他.NET)
c语言扩展 扩展CPython
Psyco Pyrex PyPy(据说很屌) Weave NumPy(速度快) ctypes Subprocess
SWIG 简单包装和接口生成器 用于多种语言协同工作 如把c语言的代码编译成一个.so共享库 就可以在别的语言中直接导入啦!!或者就是打个包安装
程序打包 让不懂的人也可以直接运行
Distutils(制作基于脚本的python安装程序 生成简单的windows安装程序,与py2exe结合成独立的windows可执行程序)
python2时代是py2exe,python3已是cxFreez
py2exe(Distutils扩展,不需要安装解释器)cx_Freeze和PyInstaller。
py2exe(windows用)
用pycharm 想要从主目录而不是从bin目录运行
edit run的配置
编译检查路径,设置project structure
嵌套定义了函数用的变量必须声明成全局变量! 声明变量是定义在函数外
global order_by_colum_num
order_by_colum_num=int(mainconf.get('output','order_by_colum_num'))-1
if 'desc' in order_by_desc_or_asc:
sortLit=sorted(sortLit,key=lambda d: d[order_by_colum_num]
pyquery python中用jquery语法
re.findall('function \w+\(\) {.*?}',codebuf,re.DOTALL)
乘方 2**3=8
wb 以二进制格式读写(二进制比文本小),unix系统没啥用
raw_input("msg") 输入的东西当字符串 input("msg") 输入数字就当数字,要尽量用 raw_input 不然输入必须加''
windows中运行加个raw_input('press eneter')防止秒退
str()将值转化为合理字符串100
repr() 将值表示成python表达式100L
>>> a=100L
>>> print a
100
>>> repr(a)
'100L'
原始字符串 r'xxxx:\sss' 不转义\ 与书写一致
help() 看帮助文档 如再输入math 看math里的方法 再输入modules
help('math')
分片 a[0:-1] 两个边界,第一个包含,第二个不包含(剩余部分第一个) a[:-2]
s=s.strip() 字符串本身是无法改变的,必须重新赋值!
>>> s='sss'
>>> s.replace('ss','a')
'as'
>>> s
'sss'
>>>
不区分大小写时加lower
if self.sendHtml.lower() == 'true':
回调函数 (感觉和适配器模式类似)
设置中间函数,调什么函数(回调函数)是不一定的
def getOddNumber(k, getEvenNumber):
return 1 + getEvenNumber(k)
yield 生成一个迭代器 每一项就是yield的值
def addlist(alist):
for i in alist:
yield i + 1
alist = [1, 2, 3, 4]
for x in addlist(alist):
print x,
终端用ipython有自动补全和缩进
哪一步报错哪一步打印log!!!
要避免直接赋值到新建变量!!因为这样很容易冲突
脚本语言运行的顺序才是变量定义顺序!!!
def a():
...: return b 会在全局变量里找!
...:
b=1
a()
1
ctrl+c exit也是异常的一种!也会被处理。。。。所以一次ctrl+c不一定停的了。。
函数暗含return None 所以不写也行
命令行输入文件直接用 fileinpt.input()获得每一行的迭代 list(fileinpt.input())
模板字符串
In [1]: from string import Template
d=dict(who='meng')
In [6]: s=Template('${who}')
In [7]: s.substitute(d)
Out[7]: 'meng'
用sys.path[0]可以获取脚本目录 meng/../meng也是可以的 ..不一定要开头
python3导入路径要用from 包.xx import xx 路径还是要自己加入,根据运行路径来加!!
sys.path.append('./') 加当前运行路径 编译器会加项目路径 但命令行不会!! 默认只有系统path和当前文件的文件夹path
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))插入上上级目录 os.path.abspath(__file__)文件路径
sys.path.append("..")
sys.path.append("lib")
path = sys.path[0]#获取编译后的pyc文件夹路径
mysql中要把单引号等转义 用 string = pymysql.escape_string(string) python3
string = MySQLdb.escape_string(string) python2
中文需要修改数据库字段编码 utf-8
python中调函数要用self. 但是参数里不能加self!
>>> a=unicode 可以自己用函数名赋值
>>> a('faf')
from __future__ import unicode_literals 所有字符当unicode处理
cookielib处理(文件保存)
self.cj = cookielib.MozillaCookieJar(self.COOKIE_FILE)
self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj))
cj.load()
cj.save()
(自动处理,自动在opener里管理cookie)
cookie=cookielib.CookieJar()
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
a=5+.5
b=.5
b=5.
一个文件里需要在别的文件里调用的写到类里(一个文件可以有多个类),自己文件里调用的写外面就行(类里可以直接用的)
def _make_result(formats, **kwargs):
return res
class TestFormatSelection(unittest.TestCase):
能简单就简单!!!!不要啥都想着建类,配置文件 因为脚本是不需要编译的,所以脚本里可以多写点能改的东西,比如配置
类变量定义在类的定义之后,实例变量则是以为self.开头。类变量可以直接用类名调用
python用makedirs即可建立级联目录 makedirs('/tmp/cc')
os.path.dirname(path) 获取父目录
os.path.split(file_path)[-1] 获取文件名
os.path.dirname(__file__)
os.path.join(basedir,file)
os.path.abspath(file)
文件目录存在
os.path.exists('d:/assist')
os.path.isdir('d:/assist')
os.path.isfile('d:/assist')
当urlopen()不能处理响应时会引起URLError异常。HTTPError异常是URLError的一个子类,只有在访问HTTP类型的URL时才会引起。
访问失败会抛出异常,但是在异常里还是存在响应的信息的!如read、geturl、info,heads等方法。
raise 抛出异常,不继续执行
列表生成式 [x*x for x in range(5)]
输出到文件
python处理文本还是很快的 200MB 81w行只要一分钟
查询mysql中文内容需要reload(sys) 初始化后会删除sys.setdefaultencoding方法,所以需要重新加载
sys.setdefaultencoding('utf8')
我们把变量从内存中变成可存储或传输的过程称之为序列化。 如爬虫的去重内存。在python中提供了两个模块可进行序列化。分别是pickle和json。
遍历时不能改变迭代器长度!!!所以要删除时不要用迭代器遍历
没关闭的文件不能重复迭代!!文件都要记得关闭
加global声明就可以调用全局里的东西了
使用global语句可以清楚地表明变量是在外面的块定义的。但貌似只限一个文件内!!做不到跨类引用变量的,变量只能一个个互相传着修改 可以传字典
函数能改global声明和参数引用地址!!!
但是引用的东西不加global也会被改!!
s=[2,6,5]
def pp(f):
f[0]=1
pp(s)
print s
s = 1,6,5
load和loads都是实现“反序列化”,区别在于(以Python为例):
loads针对内存对象,即将Python内置数据序列化为字串
如使用json.dumps序列化的对象d_json=json.dumps({'a':1, 'b':2}),在这里d_json是一个字串'{"b": 2, "a": 1}'
d=json.loads(d_json) #{ b": 2, "a": 1},使用load重新反序列化为dict
load针对文件句柄
如本地有一个json文件a.json则可以d=json.load(open('a.json'))
相应的,dump就是将内置类型序列化为json对象后写入文件
python sys.argv[0] 是脚本名 如 python run.py
>>> if False and 0/0: 判断把好判断的写前面
... print 'ss'
...
>>>
多用break continue提高效率! 多层循环时用flag
python的强大是可以少写很多东西,脚本就是这样。
定义在外面的就行
************会变的东西才需要传参数!不变的就写在外面全局 函数在变量前面定义也行
*************需要改全局的加global
可以先用再定义 按执行顺序编译 因为脚本语言赋值就是声明
def pp():
print x
x=5
pp()
删除
删除文件:
os.remove()
删除空目录:
os.rmdir()
递归删除空目录:
os.removedirs()
一个线程需要一个mysql链接!! 因为前一个没查完后一个不能查
名字写长一点,用的时候再缩写 from crawlerTool import crawlerTool as ct 文件里导入类
写入文件要速度直接命令行 python xx>/tmp/1
随地建的数据库sqlite(随地建一个文件当数据库) 安装sqlite3 pysqlite2即可使用python来操作
sqlitebrowser界面操作
直接看源代码学习怎么用
for line in reader:
if reader.line_num == 1:
fields = line
获取当前时间
s = datetime.datetime.now()
hour = int(s.hour)
求文件行数需要用readlines一口气读取完
lines = f.readlines()
len(lines)
搜索中文内容,正则要用unicode编码写
ct.getRegex(u"(搜索词条)",detailPage)
日志滚动
#logger
logFilePath = "var/log/youtubeCrawler.log"#日志按日期滚动,保留5天
logger = logging.getLogger()
logger.setLevel(logging.INFO)
handler = logging.handlers.TimedRotatingFileHandler(logFilePath,
when="d",
interval=1,
backupCount=5)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
按大小滚动
handler = logging.handlers.RotatingFileHandler(logname,
maxBytes=2000000,
backupCount=5,
)
logger = logging.getLogger(logname)
logger.setLevel(loglevel)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
error_code = 0
logging.basicConfig默认hander的logging 将其加到根logger
替换所有非中文字符
re.sub(ur"[^\u4e00-\u9fa5]", '',s)
匹配中文
sympton = ct.getRegex(u'(喉咙(.{10}))',rs[1])
pycharm file-setting-code style开启tab字符使用
Python 解决中文编码问题基本可以用以下逻辑:
utf8(输入) ——> unicode(处理) ——> (输出)utf8
看源码猜用法!!!
用%s format时需要用%%转义%
"select diseaseName,diseaseDetailInfo,VisitingDepartment from disease where diseaseDetailInfo like '%%%s%%' limit 100"%(position)
日志模块被设计成线程安全的,不需要客户端做什么特别的动作
日志可能有几百M!!所以要替换掉
包含相对路径import 的Python脚本不能直接运行from ..utils import ;不建议使用
不能在一个包里运行一个脚本文件,顶层的脚本文件不能用相对导入。
如果要将一个包作为一个脚本运行的话,需要将运行的脚本文件更名为__main__.py,然后再该包文件夹外运行该包的命令:
python -m testpackage
或是像
import cyberlock_download
if __name__ == '__main__':
cyberlock_download.main()
还有一种解决办法是在包外创建一个脚本文件,然后将包的内容导入到该脚本中。
python遍历文本文件得到的东西是带换行的!!! 所以csv格式好
系统输入的东西默认当字符串endTime = int(sys.argv[3])
sys.argv[0] 是python文件名
opts, args = getopt.getopt(sys.argv[1:], "pl")#参数p为发布者,l为接受者 写成'i:'则后面还加参数
print opts,args
for op, value in opts:
if op == "-l":
listen()
elif op == "-p":
publish()
package 内部的各个 module 之间使用相对路径导入。这样就只能在文件夹 app 外的 run.py文件中导入:from app.module2 import myClass2
相对路径方便了外部调用。要调用的包都需要有__init__.py
@property广泛应用在类的定义中,即用方法定义属性 http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386820062641f3bcc60a4b164f8d91df476445697b9e000
redis使用
pip install redis
pool=redis.ConnectionPool(host='192.168.1.142',port=6379,db=0)
r = redis.StrictRedis(connection_pool=pool)
format 比%更好用 可以处理重复的参数
'{name},{age}'.format(age=18,name='kzc')
'{},{}'.format('kzc',18)
'{1},{0},{1}'.format('kzc',18)
设置输出到终端的字体颜色
print("\033[1;31;40m您输入的帐号或密码错误!\033[0m")
函数式编程 ";".join([str(color) for color in colors]
三元操作 xxxxx if IS_ANSI_TERMINAL else text
字符串转时间 格式http://python.usyiyi.cn/python_278/library/index.html
d=datetime.datetime.strptime(dtstr, dateformat).date()
year = d.year
中国 这种格式是 HTML、XML 等 SGML 类语言的转义序列(escape sequence)。它们不是「编码」。需要
from HTMLParser import HTMLParser
print HTMLParser().unescape('中国')
比大小时要注意都不为空!
None<5
True
'5'>5 True
所以比较要(不为空,全int) if new_duration and old_duration and int(new_duration)
pyquery库是jQuery的Python实现,可以用于解析HTML网页内容
urllib.urlencode()字典转url编码
urllib.quote()字符串转url编码
urllib.unquote() url编码解码
uuid生成
import uuid
str(uuid.uuid1())
静态方法 加@staticmethod注释,且不用self参数
日期处理
day = time.strftime("%Y%m%d",time.localtime())
或由时间戳转换 x = time.localtime(findDate / 1000)
findDate = time.strftime('%Y-%m-%d %H:%M:%S', x)
遍历文件默认有换行,需要rstrip掉!
for line in f:
print line.rstrip()