python笔记

来源:互联网 发布:金牛版考勤软件 编辑:程序博客网 时间:2024/06/07 09:36

这里记录了从学习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', 'anshengme.com@gmail.com')
# 定义常量
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()   #<dictionary-itemiterator object at 0x00B71A80>


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




&#x4e2d;&#x56fd; 这种格式是 HTML、XML 等 SGML 类语言的转义序列(escape sequence)。它们不是「编码」。需要
from HTMLParser import HTMLParser
print HTMLParser().unescape('&#20013;&#22269;')






比大小时要注意都不为空!
None<5
True
'5'>5 True
所以比较要(不为空,全int) if new_duration and old_duration and int(new_duration)<int(old_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()