分类 "Python" 下的文章

问题:使用tornado yield时出错tornado.gen.BadYieldError: yielded unknown object <generator object post at 0x7f1e870d7258>
解决:在方法上加上装饰器@gen.coroutine
方法:
from tornado import gen

class ApiCreateHandler(BaseHandler):
@login_required(7)
@gen.coroutine
def post(self):
... ...

问题:python中如何用代码移动文件?
解决:使用os模块的os.rename
方法:
os模块是没有os.mv()方法的,但有os.rename()方法,可以进行修改名称和修改目录
os.rename(src, dir)  将文件src 重命名为 dir

问题:在python中需要获取两个时间的时间差,判断是否过期
解决:使用datetime.timedelta的seconds和days两属性
方法:
nowTime = datetime.datetime.now()      # python获取当前日期时间
delta = checktime - nowTime    # 获得的是一个datetime.timedelta对象
diffTime = delta.days360024 + delta.seconds
diffTime就是两个时间的时间差

例:

{% if w.start_time > now %}
<button class="zy-button exam_btn before_btn" value="{{ w.id }}">等待考试</button>
{% elif w.start_time < now and ((now - w.start_time).days360024 + (now - w.start_time).seconds) < w.time_limit * 60 %}
<button class="zy-button exam_btn" value="{{ w.id }}">开始考试</button>
{% elif w.start_time < now %}
<button class="zy-button exam_btn finish_btn" value="{{ w.id }}">考试结束</button>
{% end %}
注:直接delta.seconds只能获取两个日期的秒钟差(包括时、分),而且一定是正值,必须加上天数差,才能获得真正的时间差

问题:非规范json格式的字符串,key中不带双引号,如何解析?
解决:使用demjson模块,或execjs模块,或者使用replace方法
方法:
local = '{a:111,b:222,c:33}'
local_str = local.replace('{', '{"').replace(':', '":').replace(',', ',"')

import demjson
local_json = demjson.decode(local)

import execjs
execjs.eval(local)

注:建议第二种,第一种如果数值中有冒号就不好使了

参考:https://segmentfault.com/q/1010000006090535?_ea=1009953

问题:使用python正则如何匹配两字符串中间的字符串
解决:使用re模块的findall,注意,re.match是只能从开头匹配的
方法:
import re
html_str = '</div></div><script>var Locafds fds fds fds fds fds fds ;</script></body></html>'
local = re.findall(r'</div><script>(.*)</script></body>', html_str)
print(local[0])

这样就可以匹配到script标签中的代码了