Python拾零
经过公司组织的一次hackathon比赛,深切的体会到自己实践性的编码能力不足,搞一个database里的data转到json格式文件的任务都折腾半天, 还要使用高级语言各种类库,实在是非常的丑陋和别扭。之后静下心来看看Hacker大师的文章,觉得学习一门script的language还是很有必要的,于是就考虑入手python,之前就听说google的主流script language是python, 因为设计简洁而且干净,以前内容主要是在读python cookbook和自己跑一些python程序中的拾零。
字符串操作, string类型的reference:
- 单双引号都可以用来引字符串,然后交叉使用可以用来减少转移字符。 三连引号可以引一段字符串。
文件操作:
- file在python中是built-in type,被当作一个单独的对象来使用。 比如 output = open('/tmp/liangs.tmp', 'w') #'r' for readonly, 'w' for writable.
- 结束边界后,需要Call output.close()来关闭文件,写入修改的话需要output.write(s)
- 由于read的操作比write更频繁,所以有更多的method来支持。以下是几种方法读文件的每一行:
#input = open('somefile', 'r')
while True:
line = input.readline()
if not line: break
process(line)
#cleaner solution but not working well for large files
for line in input.readlines()
process(line)
#python support this with excellent performance
for line in input
process(line) - 如果不希望一行行读,或者以binary mode打开的文件,那么就用read()方法,通过控制参数来实现合适的读取。
- 一个简单的操作文件的例子, 查找和替换: input = open('file1', 'r') output = open('newfile', 'w') output.write(input.read().replace(str1, str2)), 前提是文件不要过大,内存中能存放两个文件的copy即可,否则还需是要replace by line.
MySQL操作:
数据库的交互是任何编程过程中不可避免的部分,因为涉及到数据存储和读取。经过一些粗线条的阅读,python原生的_mysql module并不是特别理想的mysql接口。大部分开发者选择一个名为MySQLdb的object oriented的Module进行数据库的操作。安装这个module的过程网上很多,在mac上貌似dynamic linker的引用路经by default是空的,所以需要在shell里设置一下DYLD_LIBRARY_PATH。可以用python -c "import MySQLdb"来检验module是否能成功加载。其他的Module使用方法可以参考这个tutorial.
写了一段时间的sql之后,还是觉得MySQLdb中的syntax过于简单,操作大量sql的时候远不如ORM来的方便,所以考虑选择一个python的ORM框架,SQLAlchemy貌似是个不错的选择,下载0.8版, run "python setup.py install" 顺利安装成功。
HTML操作:
HTML代码的直接读写是非常繁琐的一件事情,尤其是对于页面某些信息的抓取,解析HTML是非常重要的部分。还好python社区有一个名为BeautifulSoup的模块,可以很方便的操作HTML文档模型。尤其是在搜索document tree和遍历document tree的过程中,BeautifulSoup的语法和语义支持非常好。举个例子,传入一个标准的html字符串,就可以建立一个简单的soup object,然后就通过内置方法来遍历其中的子tag内容。
print soup.p #print p tag object
print soup.p['class'] #print p tag中class属性的内容
print soup.attr #print属性值的键值对
每一个文档中的结点都是tag类型的Object,可以通过.content和.children来访问子结点或者内容。#通过children来遍历子节点
print(child)
# The Dormouse's story
#或者通过contents / contents[]来输入内容
head_tag = soup.head
head_tag
# <head><title>The Dormouse's story</title></head>
head_tag.contents
[<title>The Dormouse's story</title>]
title_tag = head_tag.contents[0]
title_tag
# <title>The Dormouse's story</title>
title_tag.contents
# [u'The Dormouse's story']
但是string类型没有.contents, 使用的话解释器会报错。 .children会遍历所有直接的子节点,对于所有(直接的+间接的)子节点,可以使用.descendants来遍历。
对于直接搜索符合条件的tag,可以使用find_all方法,find_all('a') 返回所有<a>的tag,也可以使用正则表达式find_all(re.compile("t")) 返回<html> <table>等标签,甚至可以传入函数来filter。比如 def has_class_not_id(tag): return tag.has_key('class') and not tag.has_key('id') find_all(has_class_not_id)就会返回所有定义了class但没有定义id的tag. 默认的情况下,find_all是recursive的,也可以选择只在直接结点中搜索,使用find_all('XXX', recursive = False)。由于find_all使用的过于频繁,所以存在了一种简化Call的方式: soup.find_all('a') 等价于 soup('a')。
程序输入参数传递:
类似于C program的getopt, python程序同样需要输入参数来执行相应的功能。有两个built-in modules可以实现类似的功能,其中之一是argparse,通过import argparse namespace来实现内部类的调用。
浙公网安备 33010602011771号