这里记录了从学习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 中国 这种格式是 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)<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()
