在我多年的Python编程生涯中,以及在GitHub上探索漫游,我碰到了一些库,用起来特别愉快,这篇文章,就是来扩散这方面的知识。我决定排除很优秀的几个库,像 requests,SQLAlchemy,Flask,fabric等等。因为我认为它们已经相当流行。你可能正在使用这些库在做你的事情。下面列表中的几个库,我认为应当被大家知道,但还没有。
1、pyquery(with lxml) pip install pyquery 在Python中解析HTML,Beautiful Soup经常被推荐,而且它的确也表现很好。提供良好的 Python 风格的 API,而且很容易在网上找到相关的资料文档,但是当你需要在短时间内解析大量文档时便会碰到性能的问题,简单,但是真的非常慢。 究竟如何慢?查看2008年的一篇文章:http://www.ianbicking.org/blog ... .html 我们发现,lxml的性能是如此快。比起Beautiful Soup来,lxml文档就很少,这是我为什么没有采用它用作解析库。而且它在使用上也是相当的笨拙!是的,你可以学习使用Xpath或者cssselect来选择(DOM)树上的特定元素,还算可以。但一旦你选择了一些元素,你真的需要的,你就必须进入lxml导出的属性迷宫中去,有些确实是你想要的,但很多情况下,只返回None。这问题在很多人使用后,慢慢变得容易,但仍然不直观。 这样看,要么选择一个使用简单但是速度奇慢的库呢,要么选择一个速度飞快但是用起来巨复杂的库了,对吧? 错! 进入PyQuery Oh,PyQuery,你是如此优雅,迷人:
from pyquery import PyQuery
page = PyQuery(some_html)
last_red_anchor = page('#container > a.red:last')
太容易了。这就像在Python中深爱的jQuery! 有一些陷阱,PyQuery就像jQuery一样,暴露内部迭代,需要你重新包装:
for paragraph in page('#container > p'):
paragraph = PyQuery(paragraph)
text = paragraph.text()
这是PyQuery作者从jQuery中移植过来的(如果不影响兼容性,它们会修复此问题),可以理解,但仍然有幸看到这样强大的库。 2、dateutil pip install python=dateutil 处理日期是件头疼的事,多亏有dateutil存在。 先来尝试一下dateutil.parser:
from dateutil.parser import parse
>>> parse('Mon, 11 Jul 2011 10:01:56 +0200 (CEST)')
datetime.datetime(2011, 7, 11, 10, 1, 56, tzinfo=tzlocal())fuzzy ignores unknown tokens>>> s = """Today is 25 of September of 2003, exactly
... at 10:49:41 with timezone -03:00."""
>>> parse(s, fuzzy=True)
datetime.datetime(2003, 9, 25, 10, 49, 41,
tzinfo=tzoffset(None, -10800))
再看一个:
>>> list(rrule(DAILY, count=3, byweekday=(TU,TH),
... dtstart=datetime(2007,1,1)))
[datetime.datetime(2007, 1, 2, 0, 0),
datetime.datetime(2007, 1, 4, 0, 0),
datetime.datetime(2007, 1, 9, 0, 0)]
3、fuzzywuzzy pip install fuzzywuzzy fuzzywuzzy 可以让你对两个字符串进行模糊比较,当你需要处理一些人类产生的数据时,这非常有用。下面代码使用Levenshtein 距离比较方法来匹配用户输入数组和可能的选择。
from Levenshtein import distance
countries = ['Canada', 'Antarctica', 'Togo', ...]
def choose_least_distant(element, choices):
'Return the one element of choices that is most similar to element'
return min(choices, key=lambda s: distance(element, s))
user_input = 'canaderp'
choose_least_distant(user_input, countries)
>>> 'Canada'
这已经不错了,但还可以做的更好:
from fuzzywuzzy import process
process.extractOne("canaderp", countries)
>>> ("Canada", 97)
更多介绍看此链接:http://seatgeek.com/blog/dev/f ... ython 4、watchdog pip insatall watchdog watchdog 是一个用来监控文件系统事件的 Python API和shell实用工具。这意味着你可以关注一些目录,定义一个“基于推”的系统。watchdog能支持很多问题。在经过一些工程后,我发现比以前的库都要好。 5、sh pip install sh sh可以让你调用任意程序,就像调用一段函数。
from sh import git, ls, wccheckout master branchgit(checkout="master")print(the contents of this directoryprint(ls("-l"))get the longest line of this filelongest_line = wc(__file__, "-L")
6、pattern (https://github.com/clips/pattern) pip install pattern Pattern 是 Python 的一个 Web 数据挖掘模块。可用于数据挖掘、自然语言处理、机器学习和网络分析。 7、path.py pip install path.py 当我开始学习 Python 时,os.path 是我最不喜欢的 stdlib 的一部分。尽管在一个目录下创建一组文件很简单。
import os
some_dir = '/some_dir'
files = []
for f in os.listdir(some_dir):
files.append(os.path.joinpath(some_dir, f))
但 listdir 在 os 而不是 os.path 中。而有了 path.py ,处理文件路径变得简单:
from path import path
some_dir = path('/some_dir')
files = some_dir.files()
搞定! 再看几个:
>>> path('/').owner
'root'
>>> path('a/b/c').splitall()
[path(''), 'a', 'b', 'c']overriding __div__>>> path('a') / 'b' / 'c'
path('a/b/c')
>>> path('ab/c').relpathto('ab/d/f')
path('../d/f')
最重要的部分?path是从python str继承过来的,所以,你可以很轻松地使用,不用再强制转化为str和担心检查isinstance(s, basestring)(或更糟糕的isinstance(s, str))。 就这些了,我希望能够介绍你以前都没有用过的库。 PPV课翻译小组作品,未经许可严禁转载