β

7 个应该了解的 Python 库

马翔 198 阅读

注意:此列表不包含那些明显很优秀的库,比如 sqlalchemyFlask 等等的。

1. pyquery (with lxml)

pip install pyquery

在 Python 中解析Python,Beautiful Soup 通常会被推荐,确实也是不错的选择,具有很好的 pythonic API,而且网络上也有大量的相关资料。可以应用在很多场景下,但是,当你需要高效处理解析大量文档的时候,就会遇到效率问题。它非常非常简单,但是也

有多慢的呢?看看2008年 Ian Bicking 做的 Python Html Parser 对比图就知道了:

速度最快的是 lxml。相比 Beautiful Soup,lxml 是具有高性能特征的库。它天生支持 XPath 1.0、XSLT 1.0、定制元素类,甚至 python 风格的数据绑定接口。它构建在两个 C 库之上:libxml2 和 libxslt。它们为执行解析、序列化和转换等核心任务提供了主要动力。

from pyquery import PyQuery
page = PyQuery(some_html)
 
last_red_anchor = page('#container > a.red:last')
Easy as pie. It's ever-beloved jQuery but in Python!

也可以使用 PyQuery 来获得特定元素的内容:

for paragraph in page('#container > p'):
paragraph = PyQuery(paragraph)
text = paragraph.text()

适合大型 XML 任务的一般策略

本文给出的具体代码示例可能并不适合您的项目,但是对于 GB 级或以上的 XML 数据,请考虑以下的原则(已通过测试和 lxml 文档的验证):

  • 使用迭代解析策略,渐进式地处理大型文档。
  • 如果需要随机地搜索整个文档,那么使用索引式 XML 数据库。
  • 只选择需要的数据。如果只对特定的节点感兴趣,使用按名字选择的方法。如果需要谓词语法,那么尝试可用的 XPath 类和方法。
  • 考虑手头的任务和开发人员的舒适程度。如果不需要考虑速度的话,lxml 的对象化或 Amara 等对象模型对于 Python 开发人员来说可能更自然。cElementTree 在只需要进行解析时才会体现出速度优势。
  • 花些时间做些非常简单的基准测试。在处理数百万条记录时,细微的差别就会累积起来,但是并不能总是很明显地看出哪种方法最有效。

2. dateutil

pip install 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))

3. fuzzywuzzy

pip install fuzzywuzzy

fuzzywuzzy 能够进行字符串的模糊对比,对处理人工生成的数据有很多贴心的用例。

以下使用 Levenshtein distance 对比用户输入和一个可能选择的数组。

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'

结果是正确的,但是可以有更好的选择。Python 的海量第三方库可以帮助我们:

from fuzzywuzzy import process
 
process.extractOne("canaderp", countries)
>>> ("Canada", 97)

4. watchdog

pip install watchdog

watchdog 是一个 Python API 及 shell 应用,能够监视文件系统事件。这意味着可以监控一些目录,实现一个“基于推送”的系统。相比一些其它的库,watchdog 在支持平台以及功能,健壮性上都是不错的。

5. sh

pip install sh

sh 可以调用任何一个程序,作为一个函数使用:

from sh import git, ls, wc
 
# checkout master branch
git(checkout="master")
 
# print(the contents of this directory
print(ls("-l"))
 
# get the longest line of this file
longest_line = wc(__file__, "-L")

6. pattern

pip install pattern

这个 19MB 的庞然大库,简介却写的还很谦逊:

Pattern 是 Python 编程语言的 web mining 模块。… 可以做数据挖掘,自然语言处理,机器学习和网络分析,统一解决方案。

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 的帮助,处理文件路径又会很开心的了:

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')

Best part of it all? path subclasses Python’s str so you can use it completely guilt-free without constantly being forced to cast it to str and worrying about libraries that check isinstance(s, basestring) (or even worse isinstance(s, str)).

更好的是,path 继承了 Python 的 str,因此可以直接使用,不用检查 isinstance(s, basestring),甚至 isinstance(s, str)。

作者:马翔
网站设计, 移动开发, 创业, 管理, 设计, 商业
原文地址:7 个应该了解的 Python 库, 感谢原作者分享。

发表评论