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内容。

soup = BeautifulSoup('<p class="body strikeout"></p>'
print soup.p #print p tag object
print soup.p['class'#print p tag中class属性的内容

print soup.attr #print属性值的键值对

 

每一个文档中的结点都是tag类型的Object,可以通过.content和.children来访问子结点或者内容。#通过children来遍历子节点

for child in title_tag.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来实现内部类的调用。

posted on 2012-08-24 23:54  梁霄  阅读(206)  评论(0)    收藏  举报

导航