找回密码
 立即注册
查看: 601|回复: 5

哪些 Python 库让你相见恨晚?

[复制链接]

1

主题

3

回帖

13

积分

新手上路

积分
13
发表于 2023-6-14 15:47:28 | 显示全部楼层 |阅读模式
哪些 Python 库让你相见恨晚?
回复

使用道具 举报

0

主题

3

回帖

4

积分

新手上路

积分
4
发表于 2023-6-14 15:47:53 | 显示全部楼层
这个库是真的相见恨晚,恨着恨着实在等不到,只好我自己写了一个……
VizTracer,一个可以trace python code的execution并且进行可视化的库。
提到它当然一方面是因为这是我写的,另一方面是我在过去几年写python的时候,都一直在想要这么个工具。这个工具的核心价值就是——告诉我我的程序到底在干什么。
在我们写非常简单的程序的时候,可能会知道程序的所有运行轨迹,在出问题的时候可以迅速定位,然后通过log或者breakpoint来查找问题。但是一旦项目稍有规模,完全理解程序到底在干什么就变得越来越困难。我们自己写的程序可能有非常多分支和循环,可能调用了大量的外来库,可能还会有外界的输入。
每当我的程序出现了一些错误,但是我又不知道从何查起的时候,我就特别希望有个工具能把我整个程序的运行情况给我展开了,让我在不需要重新一遍一遍运行程序的情况下了解我的程序到底是谁调用了谁,谁花了多少时间。
于是VizTracer应运而生。在做VizTracer的时候,我基本是在做我作为一个用户想要的产品。首先这个东西的基础使用要非常非常简单,是个人都能用,而且不改任何源代码,还要给出来很直观的输出。(这几条加起来,调试工具就几乎不剩下几个了)
VizTracer的使用极其简单:
viztracer my_script.py 就这么多。无需修改你的源代码,VizTracer会运行你的程序,然后给你保存一个html文件,里面是所有的function entry exit在时间线上的一个tracing图,大概长这样:


这个图是可以互动的,zoom in/out啊,拖动选择啥的,感兴趣的可以到demo这里看看。
然后你就可以慢慢研究你的程序到底是谁调用了谁,在哪里花了时间,运行了哪些函数了。每一个function call都清晰可见,对于不感兴趣的支路可以直接跳过。
那我们有时候可能觉得,光是调用信息对debug还不足够,还希望保存一些别的数据,比如函数的argument和return value。
VizTracer依然可以在完全不动源代码的情况下完成这件事
viztracer --log_function_args --log_return_value my_script.py然后你的每一个函数的输入和输出就都会被记录下来,当你单击那个函数的时候,就会在左下角显示。
有时候你可能觉得记录的数据太杂了,你只对你自己写的代码感兴趣,对库函数毫无兴趣,你希望只在report上看到自己写的代码。你依然可以在不动源代码的情况下完成
viztracer --include_files ./ --run my_script.py这里加了--run是为了去歧义。
在完全不修改源代码的情况下,VizTracer可以记录大量的有价值的数据去帮助你理解程序到底干了啥(我知道这个问题的答案里出现了很多很优秀的调试库,但是很多是涉及源代码修改的)。
当然,VizTracer还有更强大的功能,是需要修改你的已有代码的。
比如,VizTracer可以帮你track一个variable,让它随时间的变化显示在图上。你只需要建立一个VizCounter就行了。
counter = VizCounter(get_tracer())
counter.a = 10 # 自动记录
# blah blah blah
# ...
counter.a = 20 # 再次自动记录或者类似print debug,你可以随时记录任何一个数据
tracer.add_instant("name", {"value": 22})我本人现在在开发新的python程序的时候,手里都攥着VizTracer随时准备用,大部分时候用的都是不改源代码就能完成的功能。
对我来说,无论是debug还是profile,VizTracer都有很不错的效果。如果你想试试的话,也非常简单,pip安装就好:
pip install viztracer如果你觉得这个项目太酷炫了,欢迎来给我点个star。如果你发现了bug,或者有feature request,也欢迎来提个issue~
https://github.com/gaogaotiantian/viztracer

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

0

主题

3

回帖

11

积分

新手上路

积分
11
发表于 2023-6-14 15:47:58 | 显示全部楼层
数据分析的过程中,总免不了数据的可视化,作为一个颜控,当然是希望画出来的图越好看越好啦。在追求颜值的不归路上,我发现了几个超级好用的绘图库,从此之后便深陷其中,无法自拔……

  • Altair
Altair类似于Seaborn,主要用于统计可视化,是一种声明性统计可视化库,是JavaScript高级可视化库Vega-Lite的包装器。Altair不仅可以绘制常见的一些统计图表(如柱状图、散点图、折线图和热力图等),还能绘制漂亮的地图以及用图像标注的散点图。
简单的代码绘制不同视角下的世界地图
import altair as alt
from vega_datasets import data

source = alt.topo_feature(data.world_110m.url, 'countries')

base = alt.Chart(source).mark_geoshape(
    fill='#666666',
    stroke='white'
).properties(
    width=300,
    height=180
)

projections = ['equirectangular', 'mercator', 'orthographic', 'gnomonic']
charts = [base.project(proj).properties(title=proj)
          for proj in projections]

alt.concat(*charts, columns=2)

伦敦地铁线路图


我比较喜欢的图像标注散点图


其他的案例:




官方文档:
Altair: Declarative Visualization in Python

  • Plotly Express
相信大家都有听说过Plotly这个可视化神器,Seaborn那就更不用说了,那Plotly和Seaborn结合会擦出怎样的火花呢?Plotly Express让你能够调用Seaborn式的接口用Plotly绘图。
就用官方介绍上的几个GIF来看看Plotly Express究竟有多强大吧!






官方文档:
plotly.express: high-level interface for data visualization

  • GeoViews
GeoViews是一个专门用于地理数据可视化的Python库。运用GeoViews,可以很容易地对地理气象海洋数据集进行探索和可视化,其也常被应用于天气、气候和遥感的研究,太适合写论文的学术大佬了。
GeoView既可以结合bokeh生成动态的地理图,也可以结合matplotlib绘制静态图。
绘图呈现地表温度变化
import geoviews as gv
import geoviews.feature as gf
import xarray as xr
from cartopy import crs

gv.extension('matplotlib')

# Define data
ensemble = xr.open_dataset('../../data/ensemble.nc')
dataset = gv.Dataset(ensemble, ['longitude', 'latitude', 'time'], 'surface_temperature', crs=crs.PlateCarree())
images = dataset.to(gv.Image)

# plot
images.opts(cmap='viridis', colorbar=True, fig_size=250) * gf.coastline

英国脱欧公投票数地区分布
geometries = gpd.read_file('../../assets/boundaries/boundaries.shp')
referendum = pd.read_csv('../../assets/referendum.csv')
gdf = gpd.GeoDataFrame(pd.merge(geometries, referendum))

gv.Polygons(gdf, vdims=['name', 'leaveVoteshare'],
            label='Brexit Referendum Vote').opts(
    color='leaveVoteshare', colorbar=True, padding=0.1)

飞机航站及运输网络


纽约各区分布图


最后上一张Geoviews中Gallery的全景图


是不是感觉GeoViews的功能还是挺强大的!!!
官方文档:
http://geoviews.org/index.html

  • Pyecharts
Pyecharts是基于Echarts开发的可视化库,支持的图表种类很多,简单的柱状图、折线图,复杂的树图、桑基图、3D图等等,地图画起来也很方便,整体功能很强大。
由于是国内的团队进行开发和维护,Pyecharts的一个天然优势是官方文档容易看,报错上网也容易搜到,学习成本相对比较低,一起来看些示例吧!
3D地球立体旋转
import pyecharts.options as opts
from pyecharts.charts import MapGlobe
from pyecharts.faker import POPULATION

data = [x for _, x in POPULATION[1:]]
low, high = min(data), max(data)

c = (
    MapGlobe()
    .add_schema()
    .add(
        maptype="world",
        series_name="World Population",
        data_pair=POPULATION[1:],
        is_map_symbol_show=False,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .set_global_opts(
        visualmap_opts=opts.VisualMapOpts(
            min_=low,
            max_=high,
            range_text=["max", "min"],
            is_calculable=True,
            range_color=["lightskyblue", "yellow", "orangered"],
        )
    )
    .render("map_globe_base.html")
)

北京公交线路


地图柱状图变换


人均GDP动态变化


径向树状图


K线图


象形图


官方文档:
A Python Echarts Plotting Library built with love.对于Python可视化的新手同学,入门阶段可以先从Pyecharts学起,比较系统的教程推荐看看夜曲编程的一门课——Python数据可视化。
里面所有可视化的操作都是通过Pyecharts来完成,基本是将绘图步骤一步一步地拆解、教学。


教程里面涵盖了很多实际的可视化案例,覆盖了Pyecharts的各种图表类型,使用的数据贴近真实的使用场景。每个课程中间会穿插代码的实践,PC端有在线的编辑器可以直接练习,边学边练,注重实操,这也是我比较推荐的一种方式。


跟着学下来,大致就可以掌握Pyecharts的基本使用方法,清楚不同的场景下应该绘制哪种图表,帮助我们进一步地分析数据。
想入门Python可视化,但不知道该从哪里入手的小伙伴,可以去体验一下~
除了上面可视化的神器之外,再强推一个超级有用的库tqdm。

  • tqdm
tqdm 是一个快速、可扩展的Python进度条,用来显示程序运行的进度。它显示很漂亮安装上手非常容易,使用起来很直观(在循环体里边加个tqdm),而且基本不影响原程序效率。
在写运行时间很长的程序时,可以实时监控程序运行的进度,是不是非常舒服呢?




官方文档:
tqdm/tqdm其他回答:
欢迎点赞收藏,拜谢各位老铁!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

0

主题

3

回帖

5

积分

新手上路

积分
5
发表于 2023-6-14 15:48:26 | 显示全部楼层
这个综述项目想必都知道吧。
https://github.com/vinta/awesome-python推荐一波爬虫库供玩耍吧,参考

龙鹏-言有三:【杂谈】GitHub上有哪些好用的爬虫(从Google百度,腾讯视频抖音,豆瓣知乎到不可描述)1、awesome-spider

地址:https://github.com/facert/awesome-spider这是ID为facert的一个知乎工程师开源的,star6000+,内容如下:


这一款爬虫,里面搜集了几乎所有可以爬取的中文网址,从知乎豆瓣到知网,抖音微博到QQ,还有很多的不可描述的网站,你懂的。
2、Nyspider

地址:https://github.com/Nyloner/Nyspider这是ID为Nyloner的一个今日头条的工程师弄的,star1000+,风格与上面的项目大有不同。


可以看出,都是各类网址。这很头条,跟这位小哥哥的工作内容估计有关系。
3、awesome-python-login-model

地址:https://github.com/CriseLYJ/awesome-python-login-model这是ID为CriseLYJ(职业不详)的用户,这个项目用于模拟各种网址登陆,也包含一些简单的爬虫,star6000+。


先从这个项目开始分析各大网站的登录方式,非常有用,可谓摸清对手再动手。
4、python-spider

地址:https://github.com/Jack-Cherish/python-spider这是ID为Jack-Cherish的东北大学的一个学生整理的学习python爬虫的资料,star6000+,包含不少的实战项目,非常适合想学习的朋友。


其他还有一些项目,不再一一介绍。
https://github.com/jhao104/proxy_pool
https://github.com/Ehco1996/Python-crawler--------------------------------------此处是分割线--------------------------------------
如果你是做图像的,我再推荐两个功能强大,简单好用的图片和视频爬虫。工具亲测长期有效,省去了很多找爬虫工具的时间,早用早好。
1、Google,Baidu,Bing三大搜素引擎图片爬虫

地址:https://github.com/sczhengyabin/Image-Downloader这个爬虫由ID为sczhengyabin的用户整理,可以按要求爬取百度、Bing、Google上的图片,我已经用了几年了,提供了非常人性化的GUI方便操作,使用方法如下:
使用python image_downloader_gui.py调用GUI界面,配置好参数(关键词,路径,爬取数目等),关键词可以直接在这里输入也可以选择从txt文件中选择。
可以配置需要爬取的样本数目,这里一次爬了2000张,妥妥的3分钟搞定。


这个爬虫足够满足小型项目初始数据集的积累(爬几千张高质量图片妥妥的),结果命名也非常整齐规范,最大的优势就是稳定啊,不会三天两天不能用了。
2、各大视频网站爬虫

地址:https://github.com/iawia002/annie由ID为iawia002的用户整理,Annie是一款以go语言编码的视频下载工具,使用便捷并支持youtube,腾讯视频,抖音等多个网站视频和图像的下载,收录站点如下,可以说是该有的都有的:


虽然这个项目可以下载图片,但是我们还是来用它下载视频吧,使用方法很简单:
annie [可选参数]http://…  (视频网址)

视频会下载到当前目录,至于那些可选参数,赶紧去摸索吧。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

0

主题

4

回帖

1

积分

新手上路

积分
1
发表于 2023-6-14 15:48:31 | 显示全部楼层
又到了年终盘点时间,Tryo Labs 和去年一样推出了2016 年十大 Python 库的榜单。对于这份榜单的筛选条件,Tryo Labs 写道:「我们避开了 Django、Flask 等已经成为今天的标准库的已经成功的项目。另外,这个榜单中有的库是 2016 年之前建立的,但它们在今年的受欢迎度出现了暴增或我们认为它们非常好所以可以进入这个榜单。」下面是榜单详情:

1. Zappa

链接:Serverless Python Web Services

自 AWS Lambda(以及后续的其它项目)发布以来,人们的关注点就全部转移到了无服务器架构上。这些架构让我们可以将微服务(microservice)部署到云端、部署到一个完全可管理的环境中;在这样的环境中,人们不用关心管任何服务器,而只需要分配无状态的、短暂的计算容器(computing container)即可——一个服务提供商即可完全管理。通过这一范式,事件(比如流量尖峰)可以触发更多这些容器的执行,因此有可能能够处理「无限的」水平扩展。

Zappa 是一个用于 Python 的无服务器框架,尽管(至少目前)它仅支持 AWS Lambda 和 AWS API Gateway。它使得开发这样架构的应用变得非常简单,能将你从使用 AWS Console 或 API 的繁琐配置工作中解放出来,而且它还有各种用于简化部署和管理不同环境的命令。

2. Sanic + uvloop

链接:
Sanic: channelcat/sanic
uvloop: uvloop: Blazing fast Python networking

谁说 Python 不能很快?Sanic 不仅有可能是有史以来最好的软件库名字,也可能是有史以来最快的 Python 网页框架,而且似乎也远远超过其它框架。它是一个专为速度而设计的类 Flask 的 Python 3.5+ 网页服务器。另一个库 uvloop 是一个用于 asyncio 的事件循环(event loop,其底层使用了 libuv)的超快速的插件替代。这两个加起来就是一个强大的组合!

根据 Sanic 的作者的基准测试,uvloop 可以驱动 Sanic 每秒处理超过 3.3 万条请求,这实在太强了!(比 node.js 还快)。你的代码可以受益于这种新的 async/await 语法——它们会看起来很整洁;此外我们也喜欢 Flask 风格的 API。你一定要试试 Sanic,而且如果你也在使用 asyncio,你也可以无需太多修改你的代码就能受益于 uvloop。

3. asyncpg

链接:MagicStack/asyncpg

跟进 asyncio 框架的最新进展,来自 MagicStack 的人为我们带来了这个高效的异步(目前只支持 CPython 3.5)数据库接口库,其是专门为 PostgreSQL 设计的。它有零相关性,这意味不需要安装 libpq。相对而言,withpsycopg2(最流行的 Python 的 PostgreSQL 适配器)需要以文本格式与数据库服务器交换数据;而 asyncpg 则实现了 PostgreSQL 二进制 I/O 协议,这让其不仅支持通用类型,而且还有其它许多性能上的好处。

其基准是很清楚的:asyncpg 平均至少比 psycopg2(或 aiopg)快 3 倍,也比 node.js 和 Go 实现更快。

4. boto3

链接:boto/boto3

如果你的基础设施部署在 AWS 上或使用了它们的服务(比如 S3),那么你应该非常乐意看到 boto(用于 AWS API 的 Python 接口)被从头到尾完整重写了。而且你不用一次性就完全迁移你的应用:你可以同时使用 boto3 和 boto(2) ;比如仅在你应用中新的部分使用 boto3。

这个新的实现在不同的服务间会一致的多,而且因为其使用了数据驱动的方法来在运行时间(runtime)从 JSON 描述文件中生成类,所以其总是可以实现快速更新。再也不用滞后于新的 Amazon API 功能了,赶紧使用 bot3 吧!

5.TensorFlow

链接:https://www.tensorflow.org/

大名鼎鼎的 TensorFlow。自从谷歌在 2015 年 11 月发布以来,这个库已经获得了很多改进,它已成为时下最流行的 GitHub Python 库。简而言之,TensorFlow 是一个使用数据流图(data flow graphs)的数值计算库,可以在 GPU 或 CPU 上运行。

在过去一年里,我们目睹了 TensorFlow 在机器学习社区中掀起了一股新风潮(特别是在深度学习领域),它不仅出现在研究领域,而且在应用领域也非常常见。如果你正在做深度学习并想在高级别接口中使用它,你可以尝试以它为后端的 Keras 或新推出的 TensorFlow-Slim。

6.gym+universe

Gym:OpenAI Gym: A toolkit for developing and comparing reinforcement learning algorithms
Universe:Universe


如果你是人工智能圈内的人,肯定听说过非营利人工智能研究公司 OpenAI。他们的研究人员在今年开源了一些 Python 代码。Gym 是一个用于开发并比较强化学习算法的工具包。它包含一个开源库,这个库收集了一些可被用于测试强化学习算法的测试问题(环境)。它还包含一个站点与 API,能让你对比训练出的算法(代理,agent)的表现。因为它不在乎代理的实现方式,你可以选择使用自己的计算库建立代理:numpy、TensorFlow、Theano 等。

他们最近也发布了 Universe,这是一个用于研究通用人工智能在跨游戏、网页和其他应用上的表现的软件平台。Universe 能完美匹配 gym,因此它能让任何真实世界应用调整进 gym 环境中。研究人员希望这一无限的可能性能够加速对智能代理的研究,从而解决通用任务。

7.Bokeh

链接:Welcome to Bokeh

你可能熟知一些提供数据可视化的 Python 库,其中最流行的就是 matplotlib 和 seaborn。然而,Bokeh 被创造用来做交互可视化(interactive visualization),并且面向现代的网页浏览展示。这意味着 Bokeh 能创造出一个可以让你探索来自网页浏览器数据的情节(plot)。比较棒的是它紧密融合了 Juptyer Notebooks,所以你能使用它配合你的专业工具进行研究。它也有一个可选的服务器组件 bokeh-server,其带有许多强大的功能,比如在服务器端对大型数据集进行下采样、流传输数据、变换等。可点击网址 Gallery - Bokeh 0.12.3 documentation 查看案例,看起来很棒。

8.Blaze

链接:Ecosystem - Blaze 0.10.2rc1+5.g87dd886 documentation

有时候,当你对数据集运行分析时,却发现数据集过大,无法一次塞进计算机 RAM 中。如果你无法依赖 numpy 或 Pandas,你通常需要转而使用其他的工具,如 PostgreSQL、MongoDB、Hadoop、Spark 等等。这些工具都有其自身的优缺点,依照任务的特点,总有一种工具是适合你的。但决定转换工具是一项巨大的工程,因为你需要了解这些系统如何工作,以及如何以正确的形式插入数据。

Blaze 提供了一个统一的接口,让用户无需学习所有数据库技术。Blaze 库的核心是一种计算表达方式。Blaze 本身不会进行任何计算:它只是知道如何指定一个特定的后端,决定谁来执行任务。Blaze 还有其它很多功能(它形成了一个生态系统),它作为一个库被开发出来。例如,Dask 实现了一个可用于 NumPy 数组的插件,可以处理大于内存的内容和利用多核处理器,并且还具有动态任务调度能力。

9.Arrow

链接:crsmithdev/arrow

有一个流行的说法,在计算机科学领域只有两个大问题:无效缓存和命名。我认为这句话忽略了另一个大问题:管理数据时间(managing datetimes)。如果你曾经试图在 Python 中管理数据时间,你就会知道标准库里有巨量的模块和类型:datetime、date、 calendar、 tzinfo、 timedelta、 relativedelta、 pytz 等等。更糟糕的是,时区都自然设定为默认值。

Arrow 为开发者提供了「人类的时间(datetime for humans)」,提供了一种清晰的方法来创建、操作、格式化和转换日期、时间和时间戳。它可以用于替换 Python 2 和 3 的 datetime 类型,并提供了一个更友好的界面,同时加入新的功能(如 humanize)弥补了原系统的不足。即使你不需要 Arrow 提供的额外功能,使用它也可以大大减少代码中的引用。

10. Hug

链接:Embrace the APIs of the future

公开你的内部 API,这样可以大大简化 Python API 的开发过程。Hug 是一个仅限于 Python3 的库,提供在 Python 中创建 HTTP REST API 的最简单的方式。它不是一个 web 框架(虽然 Hug 提供这样的功能,而且表现很好),它的主要功能是公开正确的标准内部 Python API。这个想法非常简单:一次定义逻辑和结构,并且可以通过多种方式公开你的 API。目前,它支持公开 REST API 或命令行界面。

你可以使用类型注释(type annotations),让 Hug 不仅为你的 API 生成文件,同时提供验证和明确的错误消息,这可以让你的开发工作(和你的 API 用户的工作)变得轻松很多。Hug 构建在 Falcon 的高性能 HTTP 库之上,这意味着你可以使用任何 wsgi 兼容的服务器(例如 gunicorn)将其部署到生产环境中。

参考文章:Top 10 Python libraries of 2016 - Tryolabs Blog
回复

使用道具 举报

0

主题

5

回帖

1

积分

新手上路

积分
1
发表于 2023-6-14 15:48:52 | 显示全部楼层
轮子哥
@vczh的回答虽然是个玩笑(urllib、urlib2、urllib3),但是,也确实反映出了Python标准库的混乱。就我个人的使用感受来说,Python和Python标准库在数据结构方面非常强大,但是,在网络和邮件这两块,设计得非常糟糕。正是由于标准库的不完美,才有了更多更好的开源项目。对于Python程序员来说,可谓是"失之东隅,收之桑榆"。重要的是我们要善于发现并使用这些项目。
下面就给大家推荐几个我用过的,并且特别好用的项目,而不是简单的贴一下awesome python。相信很多人看完awesome python以后,只是简单的收藏一下,并没有很多帮助。
1. yagmail
Python官网上发邮件的例子(
Examples - Python 2.7.13 documentation),大家感受一下。反正我看到这一堆的import就已经被吓退场了。
#!/usr/bin/env python

"""Send the contents of a directory as a MIME message."""

import os
import sys
import smtplib
# For guessing MIME type based on file name extension
import mimetypes

from optparse import OptionParser

from email import encoders
from email.message import Message
from email.mime.audio import MIMEAudio
from email.mime.base import MIMEBase
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
如果使用yagmail,发送一个带附件的邮件,只需要2行代码:
import yagmail
yag = yagmail.SMTP(user='joy_lmx@163.com', password='nicai?', host='smtp.163.com', port='25')
yag.send(user, subject = "I now can send an attachment", attachments=['a.txt', 'b.jpg'])


2. requests

requests很多人都推荐过了,不过可能一些同学感受不到requests到底好在哪里。我们就以官网的例子为例简单说明,在没有request之前,如果我们要请求
https://api.github.com/user,需要像下面这样:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import urllib2

gh_url = 'https://api.github.com'

req = urllib2.Request(gh_url)

password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_manager.add_password(None, gh_url, 'user', 'pass')

auth_manager = urllib2.HTTPBasicAuthHandler(password_manager)
opener = urllib2.build_opener(auth_manager)

urllib2.install_opener(opener)

handler = urllib2.urlopen(req)

print handler.getcode()
print handler.headers.getheader('content-type')

# ------
# 200
# 'application/json'
用requests以后,做同样的事情,我们可以这样(注意,前3行代码等于上面一整段代码):
>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
>>> r.status_code
200
>>> r.headers['content-type']
'application/json; charset=utf8'
>>> r.encoding
'utf-8'
>>> r.text
u'{"type":"User"...'
>>> r.json()
{u'private_gists': 419, u'total_private_repos': 77, ...}

3. psutil

psutil是用来获取操作系统监控以及进程管理的,如果你正在写一个监控系统(或脚本),赶紧去试试。这么说吧,我曾经使用psutil把网易内部的一个监控模块,从1000+行重构到了100+行。
我这里推荐的几个库,可能yagmail对最多人有用。而psutil,对专业的人士最有用。如果你要写一个监控系统,不使用psutil的话,只能直接去/proc目录下读取想用的文件进行计算,或者执行iostat、vmstat、df等linux命令获取命令输出,不管哪一种方法,都要处理很多繁琐的细节。有了psutil以后,就轻松多了。贴段代码大家感受一下:
def get_network_info(self):
"""
    psutil.net_io_counters()
    snetio(bytes_sent=12541464, bytes_recv=21459989, packets_sent=80164, packets_recv=88134, errin=0, errout=0,
     dropin=0, dropout=0)
    """
return psutil.net_io_counters()

def get_memory_used(self):
"""
    psutil.virtual_memory()
    svmem(total=4159041536, available=3723980800, percent=10.5, used=1599082496,
     free=2559959040, active=587403264, inactive=897105920, buffers=95989760, cached=1068032000)
    """
memory_info = psutil.virtual_memory()
memory_used = ( memory_info.total * memory_info.percent / 100 ) / 1024 / 1024
return memory_used
此外,使用越来越广泛的监控工具glances(如果没用过,要不现在就是试试?),就是用psutil收集相关数据的。
4. BeautifulSoup
如果你写爬虫,还在用XPath解析HTML,那赶紧用用BeautifulSoup,比XPath好用一百倍;如果你还在用正则表达式从HTML中获取内容,BeautifulSoup能让你好用到哭。(补充:评论里大家都说XPath更好用,难道是我思维方式和大家不一样?)
BeautifulSoup是用来解析HTML的,特点就是好用,有人吐槽BeautifulSoup慢?我不在乎BeautifulSoup比XPath慢多少,我只知道,我的时间比机器的更宝贵。
例如,要找到页面中所有的links,如下所示:
from bs4 import BeautifulSoup
soup = BeautifulSoup(open("index.html"))
for link in soup.find_all('a'):
print(link.get('href'))
例如,我在编写知乎的爬虫的时候,对于每一个用户的”关注”页面,对于每一个关注对象,有如下的tag:
<div class="zm-profile-card zm-profile-section-item zg-clear no-hovercard">
    .......
<a title="天雨白" data-hovercard="p$t$tian-yu-bai" class="zm-item-link-avatar" href="/people/tian-yu-bai">
</a>
    .......
</div>
所以,解析单个关注的用户代码如下所示:
soup = BeautifulSoup(text)
#通过属性找到这个div,对于每个用户,对应于这样一个div
items = soup.find_all('div', class_="zm-profile-card zm-profile-section-item zg-clear no-hovercard")
for item in items:
# 获取这个div下的<a>标签的title属性
name = item.a.attrs['title']
# 获取这个div下的<a>标签下的<img>标签里面的src属性
avatar  = item.a.img.attrs['src']
有了BeautifulSoup以后,爬虫操作就变得特别简单了。脏活累活别人都帮忙做好了。

5. utils
除了开源的库以外,还有些开源项目的DataStruct.py helper.py utils.py文件,也值得看一看。里面很多好东西,都是可以直接拿过来用的。


我举几个例子。
# -*- coding: utf-8 -*-

"""
requests.structures
~~~~~~~~~~~~~~~~~~~

Data structures that power Requests.

"""


class CaseInsensitiveDict(dict):
"""Case-insensitive Dictionary

    For example, ``headers['content-encoding']`` will return the
    value of a ``'Content-Encoding'`` response header."""
"""
    1. low_keys是一个字典,key是dict中key的消息形式,大写是dict中的key
    2. 如果对字典进行了修改操作,则清空low_keys
    3. 获取字典时,通过get --> __getitem__ --> __contains__ -->
    通过low_keys字典获取到真实的key,通过真实的key获取dict中的value
    """

@property
def lower_keys(self):
if not hasattr(self, '_lower_keys') or not self._lower_keys:
self._lower_keys = dict((k.lower(), k) for k in self.iterkeys())
return self._lower_keys

def _clear_lower_keys(self):
if hasattr(self, '_lower_keys'):
self._lower_keys.clear()

def __setitem__(self, key, value):
dict.__setitem__(self, key, value)
self._clear_lower_keys()

def __delitem__(self, key):
dict.__delitem__(self, key)
self._lower_keys.clear()

def __contains__(self, key):
return key.lower() in self.lower_keys

def __getitem__(self, key):
# We allow fall-through here, so values default to None
if key in self:
return dict.__getitem__(self, self.lower_keys[key.lower()])

def get(self, key, default=None):
if key in self:
return self[key]
else:
return default

def main():
d = CaseInsensitiveDict()
d['Laimingxing'] = 'Laimingxing'
d['LAimingxing'] = 'LAimingxing'
print d
print d['LAimingxing']

if __name__ == '__main__':
main()


def dictreverse(mapping):
"""
    Returns a new dictionary with keys and values swapped.

        >>> dictreverse({1: 2, 3: 4})
        {2: 1, 4: 3}
    """
return dict([(value, key) for (key, value) in iteritems(mapping)])

def dictfind(dictionary, element):
"""
    Returns a key whose value in `dictionary` is `element`
    or, if none exists, None.

        >>> d = {1:2, 3:4}
        >>> dictfind(d, 4)
        3
        >>> dictfind(d, 5)
    """
for (key, value) in iteritems(dictionary):
if element is value:
return key

class Storage(dict):
"""
    A Storage object is like a dictionary except `obj.foo` can be used
    in addition to `obj['foo']`.

        >>> o = storage(a=1)
        >>> o.a
        1
        >>> o['a']
        1
        >>> o.a = 2
        >>> o['a']
        2
        >>> del o.a
        >>> o.a
        Traceback (most recent call last):
            ...
        AttributeError: 'a'

    """
def __getattr__(self, key):
try:
return self[key]
except KeyError as k:
raise AttributeError(k)

def __setattr__(self, key, value):
self[key] = value

def __delattr__(self, key):
try:
del self[key]
except KeyError as k:
raise AttributeError(k)

def __repr__(self):
return '<Storage ' + dict.__repr__(self) + '>'
ps:web.py的作者是亚伦·斯沃茨(Aaron Swartz),一位年少成名的计算机天才,著名社交网站
Reddit联合创始人。致力于网络信息开放,却因涉嫌非法侵入麻省理工学院(MIT)和JSTOR(全称Journal Storage,存储学术期刊的在线系统)被指控,将受到最高35年监禁和100万美元罚款。该案正在认罪辩诉阶段,而亚伦·斯沃茨却于2013年1月11日在其纽约布鲁克林的寓所内,用一根皮带上吊自杀,尸体随后被女友发现,年仅26岁。
当然,我这还有很多乱七八糟的好东西,如果大家感兴趣的话,我再补充吧。要学Python看这里:
乐岸教育Python公开课-在线播放-优酷网,视频高清在线观看

此外,大家反馈,这个回答也对大家很有帮助:
怎么样才算是精通 Python?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|T9AI - 深度人工智能平台 ( 沪ICP备2023010006号 )

GMT+8, 2024-11-22 01:51 , Processed in 0.058142 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表