前言
时间多的挺快的,从学习python到现在已经一个月了。
当时写了两篇文章 初步学习Python 和 初步学习Python高级语法, 还有一篇规范文章 Python 风格规范.
然后到现在已经写了大大小小8~9个python程序了,并且已经在正式环境跑了。
现在总结一下遇到的一些常见的问题,或者需求吧。
时间的年月日
localtime = time.localtime(time.time())year = localtime.tm_yearmon = localtime.tm_monday = localtime.tm_mdayhour = localtime.tm_hourmin = localtime.tm_minsec = localtime.tm_sec #0 到 61 (60或61 是闰秒)wday = localtime.tm_wday #0到6 (0是周一)yday = localtime.tm_yday #1 到 366
格式化 字符串
time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
其中格式化规则如下
%y 两位数的年份表示(00-99)%Y 四位数的年份表示(000-9999)%m 月份(01-12)%d 月内中的一天(0-31)%H 24小时制小时数(0-23)%I 12小时制小时数(01-12) %M 分钟数(00=59)%S 秒(00-59)%a 本地简化星期名称%A 本地完整星期名称%b 本地简化的月份名称%B 本地完整的月份名称%c 本地相应的日期表示和时间表示%j 年内的一天(001-366)%p 本地A.M.或P.M.的等价符%U 一年中的星期数(00-53)星期天为星期的开始%w 星期(0-6),星期天为星期的开始%W 一年中的星期数(00-53)星期一为星期的开始%x 本地相应的日期表示%X 本地相应的时间表示%Z 当前时区的名称%% %号本身
指定 日期 是 周几
print datetime.datetime(2012,04,23).strftime("%w")
http 请求
关于 post 请求详见 Python 下发送 post 类型的 http请求
try: req = urllib2.Request(url) page = urllib2.urlopen(req) ret_str = page.read() print ret_strexcept urllib2.HTTPError, e: print('(%s)http request error code - %s.' % (url, e.code))except urllib2.URLError, e: print('(%s)http request error reason - %s.' % (url, e.reason))except Exception: print('(%s)http request generic exception: %s.' % (url, traceback.format_exc()))
对 url 中的val 转义
name = urllib.quote(name)
对 post 数据转义
postdata = {}postdata["key"] = valpostdata = urllib.urlencode(postdata)
注册 指定 代理
def installProxy(): proxy_handler = urllib2.ProxyHandler({"http" : 'tiankonguse.com:8080'}) opener = urllib2.build_opener(proxy_handler) urllib2.install_opener(opener) # end installProxy
临时 使用 代理
proxy_handler = urllib2.ProxyHandler({"http" : 'tiankonguse.com:8080'})opener = urllib2.build_opener(proxy_handler)req = urllib2.Request(url)page = opener.open(req)ret_str = page.read()print ret_str
mysql 操作
test_dbcfg = {'host' : 'tiankonguse.com', 'port' : 3306, 'user' : 'test', 'passwd' : 'test', 'db' : 'test'}try: dbcfg=test_dbcfg conn = MySQLdb.connect(host=dbcfg["host"], user=dbcfg["user"], passwd=dbcfg["passwd"], db=dbcfg["db"], port=dbcfg["port"], charset='utf8') cur = conn.cursor() #查询 sql = "SELECT id,name FROM test.test;" cur.execute(sql) results = cur.fetchall() for x in results: print x[0]," ",x[1] sql = "INSERT INTO test.test(id,name) VALUES('1','tiankonguse');" cur.execute(sql) # 删除,添加,修改需要提交才会生效. # 一次提交代表一个事物 conn.commit() conn.close(); except MySQLdb.Error, e: print("Mysql Error %d: %s" % (e.args[0], e.args[1]))
比如我的这篇文章:python mysql 更新和插入数据无效,数据怎么也没有插件去,后来找到是没有 commit 的原因。
字符串 与 json 转化
详见我的另一篇文章Python 下 json 的基本操作与转换
json_obj = json.loads(str)str = json.dumps(json_obj)
所有类型转化为字符串
参考 stackoverflow
目前 int, long,unicode,datetime.datetime 转化为字符串有效。
对于 NoneType 需要特判。
newStr = str(variable)
整数 与 字符串 转化
num = int("123") # 123str = str(123) # "123"
整数 与 ansci 编码转换
num = ord("1") # 49char = chr(48) # '1'
Non-ASCII character
想输出一些变量时遇到 SyntaxError: Non-ASCII character
这个问题,原来默认按 ASCII 识别了,所以我们需要设置编码格式。
一般前两行是这个样子
#!/usr/bin/python# coding:UTF-8
随机数生成
random.random() # 生成一个0到1的随机浮点数random.uniform(a, b) #生成一个指定范围内的浮点数random.randint(a, b) #生成一个指定范围内的整数random.randrange(a, b, c) #生成一个指定等差数列内的数random.choice(list) # 从list中随机选择一个元素random.shuffle(list) # 将list中的元素顺序打乱random.sample(list, n) # 从list中随机挑n个元素
判断实例类型
从数据库中导出数据,组装后再导出,但是 python 的数据库有点强大,数据库内是什么类型,取出来的数据就是什么类型。这样的话我还要一个一个的转换类型,好麻烦,所以我需要使用循环判断类型,统一转化为字符串然后操作。
type 与 isinstance 的区别就是,type 判断实例与基类为不相等,而 isinstance 判断为相等。
num = 1type(num) # 'int'isinstance(num, int) #True
有时候数据库中取出的数据时 null, 这个时候这个变量就是 <type 'NoneType'>
了。
此时我们不能用 isinstance(num, NoneType)
来判断,也不能用 null 来判断。
只能用下面的方法判断(参考 stackoverflow)
if variable is None:
判断key是否在字典中
下面两个方法都可以,但是推荐第一个.第二个在 python3 中将弃用.
key in dictdict.has_key(key)
mysql 字符串转义
str = conn.escape_string(str)