[工具]7个应知的Python库

在我多年的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课翻译小组作品,未经许可严禁转载


原文发布于微信公众号 - PPV课数据科学社区(ppvke123)

原文发表时间:2016-05-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏快乐八哥

JavaScript中this关键字使用

在Web开发中,前端掌握JavaScript,后台掌握PHP成为一个趋势。当然后台掌握C#/Java,当然还有Python,Ruby其中的一种,都是可以的。其实...

2339
来自专栏北京马哥教育

据说这篇总结覆盖了一般Python开发面试中可能会问到的大部分问题

通信背景,工作一年多不到两年。之前一直在做C++的MFC软件界面开发工作。公司为某不景气的国企研究所。(喏,我的工作经验很水:1是方向不对;2是行业有偏差)。然...

1332
来自专栏编程

记一次非常愉悦的 Python 使用经历

临近毕业,班群里发了个要核对的信息的表格,要我们检查一下,涉及到毕业证。 于是我就下载来看一看,结果傻了眼:(敏感信息已打码) ? 是的,姓名和身份证号都是明文...

2225
来自专栏上善若水

007尝试使用UML图

尝试使用uml图来帮助自己快速的构建稳健的程序 uml对理清自己的思路,应该是很有帮助的了

1102
来自专栏Crossin的编程教室

【每周一坑】特殊的生日

好吧,我在跳票的道路上又双叒叕前进了一步……今天终于厚着脸皮来更新【每“周”一坑】啦。感谢在后台孜孜不倦催促我的同学们。 在出题前,先插两句: 上次关于 Pyt...

34911
来自专栏ThoughtWorks

都100%代码覆盖了,还会有什么问题?

(图片来自:http://t.cn/R06rQHi) 引言 很多人看到这个标题时,都会想“你都100%代码覆盖了,怎么还会有问题呢?” 让我们看一下代码例子:...

3898
来自专栏牛客网

网易云音乐Java面经(共三面)

【每日一语】很多人都无从得知自己的天赋,因为找不到相信他们的老师。于是他们深信自己很笨。——《心灵捕手》

6411
来自专栏企鹅号快讯

编程语言中间令人无语的规则

我们都知道,软件开发人员每天都在做各种各样的决策:如何更好地实现功能、如何修复bug、如何改进应用程序性能等等。但是他们也在其他人的工作成果中继续自己的决定,例...

3685
来自专栏SDNLAB

【一课专栏】解构ODL引子 - ODL入坑之路·上篇

做为一名无证驾驶ODL这辆SDN战车3年多的老司机,在基于ODL进行商用SDN控制器的研发过程中,总结了一些经验和教训,也有一些心得体会,借这个机会与大家一起交...

4652
来自专栏芋道源码1024

从一次 Snowflake 异常说起

1. 异常概述 2018年1月26日下午,业务方信贷小组的同学反馈服务执行数据库插入操作出现异常,异常信息显示数据库主键出现重复: ? 在仔细分析了用户的重复主...

5.6K7

扫码关注云+社区

领取腾讯云代金券