pyt

阅读 / 问答 / 标签

python数据分析师需要掌握什么技能?

首先是基础篇1、首先是Excel,貌似这个很简单,其实未必。Excel不仅能够做简单二维表、复杂嵌套表,能画折线图/Column chart/Bar chart/Area chart/饼图/雷达图/Combo char/散点图/Win Loss图等,而且能实现更高级的功能,包括透视表(类似于BI的多维分析模型Cube),以及Vlookup等复杂函数,处理100万条以内的数据没有大问题。最后,很多更高级的工具都有Excel插件,例如一些AI Machine Learning的开发工具。2. SQL(数据库)我们都知道数据分析师每天都会处理海量的数据,这些数据来源于数据库,那么怎么从数据库取数据?如何建立两表、三表之间的关系?怎么取到自己想要的特定的数据?等等这些数据选择问题就是你首要考虑的问题,而这些问题都是通过SQL解决的,所以SQL是数据分析的最基础的技能。3. 统计学基础数据分析的前提要对数据有感知,数据如何收集?数据整体分布是怎样的?如果有时间维度的话随着时间的变化是怎样的?数据的平均值是什么?数据的最大值最小值指什么?数据相关与回归、时间序列分析和预测等等。4、掌握可视化工具,比如BI,如Cognos/Tableau/FineBI等,具体看企业用什么工具,像我之前用的是FineBI。这些工具做可视化非常方便,特别是分析报告能含这些图,一定会吸引高层领导的眼球,一目了然了解,洞察业务的本质。另外,作为专业的分析师,用多维分析模型Cube能够方便地自定义报表,效率大大提升。进阶阶段需要掌握的:1、系统的学好统计学纯粹的机器学习讲究算法预测能力和实现,但是统计一直就强调“可解释性”。比如说,针对今天微博股票发行就上升20%,你把你的两个预测股票上涨还是下跌的model套在新浪的例子上,然后给你的上司看。统计学就是这样的作用。数据挖掘相关的统计方法(多元Logistic回归分析、非线性回归分析、判别分析等)定量方法(时间轴分析、概率模型、优化)决策分析(多目的决策分析、决策树、影响图、敏感性分析)树立竞争优势的分析(通过项目和成功案例学习基本的分析理念)数据库入门(数据模型、数据库设计)预测分析(时间轴分析、主成分分析、非参数回归、统计流程控制)数据管理(ETL(Extract、Transform、Load)、数据治理、管理责任、元数据)优化与启发(整数计划法、非线性计划法、局部探索法、超启发(模拟退火、遗传算法))大数据分析(非结构化数据概念的学习、MapReduce技术、大数据分析方法)数据挖掘(聚类(k-means法、分割法)、关联性规则、因子分析、存活时间分析)其他,以下任选两门(社交网络、文本分析、Web分析、财务分析、服务业中的分析、能源、健康医疗、供应链管理、综合营销沟通中的概率模型)风险分析与运营分析的计算机模拟软件层面的分析学(组织层面的分析课题、IT与业务用户、变革管理、数据课题、结果的展现与传达方法)2、掌握AI Machine Learning算法,会用工具(比如Python/R)进行建模。传统的BI分析能回答过去发生了什么?现在正在发生什么?但对于未来会发生什么?必须靠算法。虽然像Tableau、FineBI等自助式BI已经内置了一部分分析模型,但是分析师想要更全面更深度的探索,需要像Python/R的数据挖掘工具。另外大数据之间隐藏的关系,靠传统工具人工分析是不可能做到的,这时候交由算法去实现,无疑会有更多的惊喜。其中,面向统计分析的开源编程语言及其运行环境“R”备受瞩目。R的强项不仅在于其包含了丰富的统计分析库,而且具备将结果进行可视化的高品质图表生成功能,并可以通过简单的命令来运行。此外,它还具备称为CRAN(The Comprehensive R Archive Network)的包扩展机制,通过导入扩展包就可以使用标准状态下所不支持的函数和数据集。R语言虽然功能强大,但是学习曲线较为陡峭,个人建议从python入手,拥有丰富的statistical libraries,NumPy ,SciPy.org ,Python Data Analysis Library,matplotlib: python plotting。以上我的回答希望对你有所帮助

选股策略回测用 Matlab 好还是用 Python 好

首先十年的日级别数据量的确不大,使用Python来说的话不应该出现memoryerror,应该是在编程方面需要再多留意,我们在Ricequant上使用的分钟数据大概是200-300个GB左右,也是Python和Java共同合作完成的。语言只是一个语言,兴许会有各种语法的不同,但是在谈语言的时候我们需要了解背后的工具箱和社区,以及它为什么处理一些事情比另外的一些语言要好。本身Python初期用来做金融回测等是应该被放弃的,用来开发策略也应该是被放弃的,因为相比matlab的矩阵运算来做开发,实在是太方便了。只不过后来Python推出了series、pandas等一系列的强悍library,pandas的语法基本在“无耻”地模仿matlab和R,而pandas的开发者正是美国大名鼎鼎的对冲基金AQR,因此使data crunching和对数据的一些操作大大便利,此外,又包装了海量的开源社区的数学和科学计算库,也能处理各种的machin learning等等的问题。从科学计算的语言的发展来看,从最初的人们对浮点数计算的需求加入了fortran,再一路进行,让工具更加的让科学计算容易再容易(Python也封装了大量早期的数学家们用fortran写的数学计算基础库,这些经历了几十年的考验、加速等等):我们来看下python目前的科学技术栈:numpy: basic array manipulation - 基础的数组处理scipy: scientific computing in python, including signal processing and optimization - 科学计算,包括信号处理和优化等matplotlib: visualization and plotting - 几行代码就可以做图形化显示了IPython: write and run python code interactively in a shell or a notebook - 互动式编程环境,这是能将来替代掉matlab的一个必备,即在一行一行代码的输入、显示过程中学习、改进pandas: data manipulation - 最重要的矩阵运算等scikit-learn: machine learning - 机器学习但是随着以后的发展Python的开源属性就会体现的越来越强大,可以让更多的人享受到其便利和贡献进来,包括Quantopian也放出了zipline的python回测框架,只需要引入yahoo数据即可进行回测,并且Python的速度由于跟C的很好的结合可以达到非常快的速度,而且可以将来和其他系统很容易整合对接实盘交易接口。由于欧美已经有很多的投行和对冲基金在往Python的技术栈靠拢,因此选择了Python即掌握了一门重要的工具,并且无需跟一家私有化公司进行捆绑。当然,最后的最后,所有的python回测你都可以来Ricequant - Beta上完成,我们支持海量的市场、财务数据,还有不断加入的和大数据公司合作的舆情数据等等,同时策略回测完还可以做实时模拟交易,享受到实时数据的计算。在云平台上已经支持了几乎所有的Python科学计算库,无需花时间安装、测试等等。

如何用python实现piv测速

您好,PIV全名:Particle Image Velocimetry,又称粒子图像测速法,是七十年代末发展起来的一种瞬态、多点、无接触式的激光流体力学测速方法。PIV忙说白了就是测速仪繁忙

为什么python plt.plot 画图起点不是零点

a=[0,1,2,3,4]b=[0,1,2,3,4]plt.plot(a,b,"o")plt.show()

Python 中的可视化工具介绍

几周前,R语言社区经历了一场关于画图工具的讨论。对于我们这种外人来说,具体的细节并不重要,但是我们可以将一些有用的观点运用到 Python 中。讨论的重点是 R 语言自带的绘图工具 base R 和 Hadley Wickham 开发的绘图工具 ggplot2 之间的优劣情况。如果你想了解更多细节内容,请阅读以下几篇文章: 其中最重要的两个内容是: 不是所有人都认同第二个观点,ggplot2确实无法绘制出所有的图表类型,但是我会利用它来做分析。 以下是 2016 年 4 月写的关于绘图工具的概述。出于多方面的原因,绘图工具的选取更多地取决于个人偏好,因此本文介绍的 Python 绘图工具也仅代表我的个人使用偏好。 Matplotlib 是一个强大的工具,它是 Pandas" builtin-plotting 和 Seaborn 的基础。 Matplotlib 能够绘制许多不同的图形,还能调用多个级别的许多 API 。我发现 pyplot api 非常好用,你可能用不上 Transforms 或者 artists ,但是如果你有需求的话可以查阅帮助文档。我将从 pandas 和 seaborn 图开始介绍,然后介绍如何调用 pyplot 的 API 。 DataFrame 和 Series 拥有 .plot 的命名空间,其中有许多图形类别可供选择(line, hist, scatter, 等等)。 Pandas 对象还提供了额外的用于增强图形展现效果的数据,如索引变量。 由于 pandas 具有更少的向后兼容的限制,所以它具有更好的美学特性。从这方面来说,我认为 pandas 中的 DataFrame.plot 是一个非常实用的快速探索性分析的工具。 Michael Waskom 所开发的 Seaborn 提供了一个高层次的界面来绘制更吸引人统计图形。 Seaborn 提供了一个可以快速探索分析数据不同特征的 API 接口,接下来我们将重点介绍它。 Bokeh 是一款针对浏览器开发的可视化工具。 和 matplotlib 一样,**Bokeh ** 拥有一系列 API 接口。比如 glpyhs 接口,该接口和 matplotllib 中的 Artists 接口非常相似,它主要用于绘制环形图、方形图和多边形图等。最近 Bokeh 又开放了一个新的图形接口,该接口主要用于处理词典数据或 DataFrame 数据,并用于绘制罐头图。 以下是一些本文没有提到的可视化工具: 我们将利用 ggplot2 中的 diamonds 数据集,你可以在 Vincent Arelbundock"s RDatasets 中找到它(pd.read_csv(" http://vincentarelbundock.github.io/Rdatasets/csv/ggplot2/diamonds.csv") ),此外我们还需要检测是否已经安装 feather 。 [站外图片上传中……(4)] Bokeh 提供了两个 API,一个是低级的 glyph API,另一个是高级的 Charts API。 [站外图片上传中……(5)] 还不是很清楚我们应该在啥时候利用 Bokeh 来进行探索性分析,不过它的交互式功能可以激发我的兴趣。就个人而言,由于习惯问题我平时仍然一直使用 matplotlib 来绘图,我还无法完全切换到 Bokeh 中。 我非常喜欢 Bokeh 的仪表盘功能和 bokeh server 的 webapps。 [站外图片上传中……(6)] [站外图片上传中……(7)] [站外图片上传中……(8)] matplotlib 并不局限于处理 DataFrame 数据,它支持所有使用 getitem 作为键值的数据类型。 [站外图片上传中……(9)] [站外图片上传中……(10)] 我们从列变量的名字中提取出轴标签,利用 Pandas 可以更加便捷地绘制一系列共享 x 轴数据的图形。 [站外图片上传中……(11)] [站外图片上传中……(12)] 本文中的剩余部分将重点介绍 seaborn和为什么我认为它是探索性分析的强大工具。 我强烈建议你阅读 Seaborn 的 introductory notes,这上面介绍了 seaborn 的设计逻辑和应用领域。 我们可以通过一个稳定的且易懂的 API 接口来调用 Seaborn。 事实上,seaborn 是基于 matplotlib 开发的,这意味着如果你熟悉 pyplot API的话,那么你可以很容易地掌握 seaborn。 大多数 seaborn 绘图函数的参数都由 x, y, hue, 和 data 构成(并不是所有的参数都是必须的)。如果你处理的对象是 DataFrame,那么你可以直接将列变量的名称和数据集的名称一同传递到绘图函数中。 [站外图片上传中……(13)] [站外图片上传中……(14)] [站外图片上传中……(15)] [站外图片上传中……(16)] 我们可以很轻易地探究两个变量之间的关系: [站外图片上传中……(17)] [站外图片上传中……(18)] 或者一次探究多个变量之间的关系: [站外图片上传中……(19)] [站外图片上传中……(20)] pariplot 是 PairGrid 的一个包装函数,它提供了 seaborn 一个重要的抽象功能——Grid。Seaborn 的 Grid 将 matplotlib 中Figure 和数据集中的变量联系起来了。 我们有两种方式可以和 grids 进行交互操作。其一,seaborn 提供了类似于 pairplot 的包装函数,它提前设置了许多常见任务的参数;其二,如果你需要更多的自定义选项,那么你可以直接利用 Grid 方法。 [站外图片上传中……(21)] [站外图片上传中……(22)] [站外图片上传中……(23)] 34312 rows × 7 columns [站外图片上传中……(24)] [站外图片上传中……(25)] FaceGrid 可以通过控制分面变量来生成 Grid图形,其中PairGrid是它的一个特例。接下来的案例中,我们将以数据集中的 cut 变量为分面变量来绘制图像: [站外图片上传中……(26)] [站外图片上传中……(27)] 最后一个案例展示了如何将 seaborn 和 matplotlib 结合起来。g.axes是matplotlib.Axes的一个数组,g.fig是matplotlib.Figure的一个特例。这是使用 seaborn 时常见的一个模式:利用 seaborn 的方法来绘制图像,然后再利用 matplotlib 来调整细节部分。 我认为 seaborn 之所以吸引人是因为它的绘图语法具有很强的灵活性。你不会被作者所设定的图表类型所局限住,你可以根据自己的需要创建新的图表。 [站外图片上传中……(28)] [站外图片上传中……(29)] [站外图片上传中……(30)] [站外图片上传中……(31)] 本来,我打算准备更多的例子来介绍 seaborn,但是我会将相关链接分享给大家。Seaborn 的说明文档写的非常详细。 最后,我们将结合 scikit-learn 来介绍如何利用 GridSearch 来寻找最佳参数。 [站外图片上传中……(32)] [站外图片上传中……(33)] [站外图片上传中……(34)] 原文链接: http://tomaugspurger.github.io/modern-6-visualization.html 译者:Fibears

Python 从键盘输入5个英文单词,输出以元音字母开头的单词?

代码:import reprint(" ".join(re.findall(r"[aeiou]w*",input(),re.I)))截图:

如果Python的源代码无法保密,那不是说所有的算法大伙都可以用?

Python鼓励开源,一定要加密也是可以的,比如做win桌面软件,打包成exe就可以做封装处理的。但现在的软件大都以BS为主,客户看到的只是数据展示,也就是常说的前端。逻辑都在服务上处理,用户一样是看不到的。

实例详解Python+SlackAPI如何实现聊天机器人

聊天机器人(Bot) 是一种像 Slack 一样的实用的互动聊天服务方式。如果你之前从来没有建立过聊天机器人,那么这篇文章提供了一个简单的入门指南,告诉你如何用 Python 结合 Slack API 建立你第一个聊天机器人。我们通过搭建你的开发环境, 获得一个 Slack API 的聊天机器人令牌,并用 Pyhon 开发一个简单聊天机器人。我们所需的工具我们的聊天机器人我们将它称作为“StarterBot”,它需要 Python 和 Slack API。要运行我们的 Python 代码,我们需要:Python 2 或者 Python 3pip 和 virtualenv 来处理 Python 应用程序依赖关系一个可以访问 API 的免费 Slack 账号,或者你可以注册一个 Slack Developer Hangout team。通过 Slack 团队建立的官方 Python Slack 客户端代码库Slack API 测试令牌当你在本教程中进行构建时,Slack API 文档 是很有用的。本教程中所有的代码都放在 slack-starterbot 公共库里,并以 MIT 许可证开源。搭建我们的环境我们现在已经知道我们的项目需要什么样的工具,因此让我们来搭建我们所的开发环境吧。首先到终端上(或者 Windows 上的命令提示符)并且切换到你想要存储这个项目的目录。在那个目录里,创建一个新的 virtualenv 以便和其他的 Python 项目相隔离我们的应用程序依赖关系。激活 virtualenv:你的提示符现在应该看起来如截图:已经激活的starterbot的virtualenv的命令提示符这个官方的 slack 客户端 API 帮助库是由 Slack 建立的,它可以通过 Slack 通道发送和接收消息。通过这个pip 命令安装 slackclient 库:当 pip 命令完成时,你应该看到类似这样的输出,并返回提示符。在已经激活的virtualenv用pip安装slackclient的输出我们也需要为我们的Slack项目获得一个访问令牌,以便我们的聊天机器人可以用它来连接到Slack API。Slack 实时消息传递(RTM)APISlack 允许程序通过一个 Web API 来访问他们的消息传递通道。去这个 Slack Web API 页面 注册建立你自己的 Slack 项目。你也可以登录一个你拥有管理权限的已有账号。使用 Web API页面的右上角登录按钮登录后你会到达 聊天机器人用户页面。定制聊天机器人用户页面给你的聊天机器人起名为“starterbot”然后点击 “Add bot integration” 按钮。添加一个bot integration 并起名为“starterbot”这个页面将重新加载,你将看到一个新生成的访问令牌。你还可以将标志改成你自己设计的。例如我给的这个“Full Stack Python”标志。为你的新 Slack 聊天机器人复制和粘贴访问令牌在页面底部点击“Save Integration”按钮。你的聊天机器人现在已经准备好连接 Slack API。Python 开发人员的一个常见的做法是以环境变量输出秘密令牌。输出的Slack令牌名字为SLACK_BOT_TOKEN:好了,我们现在得到了将这个 Slack API 用作聊天机器人的授权。我们建立聊天机器人还需要更多信息:我们的聊天机器人的 ID。接下来我们将会写一个简短的脚本,从 Slack API 获得该 ID。获得我们聊天机器人的 ID这是最后写一些 Python 代码的时候了! 我们编写一个简短的 Python 脚本获得 StarterBot 的 ID 来热身一下。这个 ID 基于 Slack 项目而不同。我们需要该ID,当解析从Slack RTM上发给StarterBot的消息时,它用于对我们的应用验明正身。我们的脚本也会测试我们SLACK_BOT_TOKEN环境变量是否设置正确。建立一个命名为printbotid.py的新文件,并且填入下面的代码:我们的代码导入SlackClient,并用我们设置的环境变量SLACK_BOT_TOKEN实例化它。 当该脚本通过python命令执行时,我们通过会访问Slack API列出所有的 Slack 用户并且获得匹配一个名字为“satrterbot”的ID。这个获得聊天机器人的ID的脚本我们仅需要运行一次。当它运行为我们提供了聊天机器人的ID时,脚本会打印出简单的一行输出。在你的Slack 项目中用Python脚本打印Slack聊天机器人的ID复制这个脚本打印出的唯一ID。并将该ID作为一个环境变量BOT_ID输出。这个脚本仅仅需要运行一次来获得聊天机器人的ID。 我们现在可以在我们的运行StarterBot的Python应用程序中使用这个ID。编码我们的 StarterBot现在我们拥有了写我们的StarterBot代码所需的一切。 创建一个新文件命名为starterbot.py,它包括以下代码。对os和SlackClient的导入我们看起来很熟悉,因为我们已经在theprintbotid.py中用过它们了。通过我们导入的依赖包,我们可以使用它们获得环境变量值,并实例化Slack客户端。该代码通过我们以输出的环境变量SLACK_BOT_TOKEN 实例化SlackClient`客户端。Slack 客户端会连接到 Slack RTM API WebSocket,然后当解析来自 firehose 的消息时会不断循环。如果有任何发给 StarterBot 的消息,那么一个被称作 handle_command 的函数会决定做什么。接下来添加两个函数来解析 Slack 的输出并处理命令。parse_slack_output 函数从 Slack 接受信息,并且如果它们是发给我们的 StarterBot 时会作出判断。消息以一个给我们的聊天机器人 ID 的直接命令开始,然后交由我们的代码处理。目前只是通过 Slack 管道发布一个消息回去告诉用户去多写一些 Python 代码!这是整个程序组合在一起的样子 (你也可以 在 GitHub 中查看该文件):现在我们的代码已经有了,我们可以通过 python starterbot.py 来运行我们 StarterBot 的代码了。当 StarterBot 开始运行而且连接到 API 的输出通道在 Slack 中创建新通道,并且把 StarterBot 邀请进来,或者把 StarterBot 邀请进一个已经存在的通道中。在Slack界面创建一个新通道并且邀请 StarterBot现在在你的通道中给 StarterBot 发命令。在你的Slack通道里给你的 StarterBot 发命令如果你从聊天机器人得到的响应中遇见问题,你可能需要做一个修改。正如上面所写的这个教程,其中一行AT_BOT = “<@” + BOT_ID + “>:”,在“@starter”(你给你自己的聊天机器人起的名字)后需要一个冒号。从 AT_BOT 字符串后面移除:。Slack 似乎需要在@ 一个人名后加一个冒号,但这好像是有些不协调的。结束好吧,你现在已经获得一个简易的聊天机器人,你可以在代码中很多地方加入你想要创建的任何特性。我们能够使用 Slack RTM API 和 Python 完成很多功能。看看通过这些文章你还可以学习到什么:附加一个持久的关系数据库 或者 NoSQL 后端 比如 PostgreSQL、MySQL 或者 SQLite ,来保存和检索用户数据添加另外一个与聊天机器人互动的通道,比如 短信 或者电话呼叫集成其它的 web API,比如 GitHub、Twilio 或者 api.ai

基于Appium+WDA+Python搭建IOS自动化测试全纪录(三):真机demo运行

前期回顾: 基于Appium+WDA+Python搭建IOS自动化测试全纪录(二):模拟器demo运行 基于Appium+WDA+Python搭建IOS自动化测试全纪录(一):环境搭建 在模拟器将demo跑通之后,就要在真机上测试啦,模拟器总是要为真机服务的。 在真机上主要是涉及到签名及证书的问题,一下blog写的特别好,然而其实我也没有看懂,RSA算法神马的早在密码学课程上还给老师了。 iOS App 签名的原理 主要在此简单记录一下证书的配置吧。 在xcode中找到build Setting配置部分(之所以把这张图放出来是因为我最开始找不到这个配置,萌新啥都找不到): 更改一下三个字段对应的内容: Code Siging identify 证书里面对应的开发者 Product Bundle Identify 对应的bundleID Provisioning Profile 包含了 证书 / Entitlements 等数据,并由苹果后台私钥签名的数据包。 数据包是.mobileprovision文件格式结尾 在终端中输入如下命令即可看到里面的信息 改完之后 我们开发的程度就可以装到真机上啦,这个时候选择在真机上运行,就可以啦。 测试app装到真机上之后,还要考虑如何开启py脚本,在真机上进行测试。 这里需要注意两点: 最后找到的地址大概如下: 放到xcode中进行签名证书配置,注意虽然我们打开的是WebDriverAgent文件夹,但是我们要配置的是WebdDriverAgentRunner 在其Build Settings中进行与证书有关的配置 配置完毕后还需要再WebdDriverAgentRunner中添加一个RoutingHTTPServer.frameork 点击添加之后->add Other 在如下路径可以查找到该framework 找的一定是appium文件路径下的! 上边关于wda并没有做过多说明,因为还不怎么了解 等了解了再补充相关知识 py脚本主要是配置有更改,主体文件请见开头(二)模拟器demod的blog 在真机上配置更改如下: 然后启动appium 发现真机上装上了厕所app 装上了WebDriverAgentRunner 然后用python运行脚本就ok拉! 以上为从搭建环境-》模拟器跑demo-》真机跑demo的简单记录,不涉及到原理方面的讲解,如有错误之处还请提出。 【之后还有跳一跳的安卓环境搭建 wda的inspector相关环境还没记录~】 [Tbc] 个人博客: 进击的程序茗

python的pillow库怎么处理灰度图像

Pillow是Python里的图像处理库(PIL:Python Image Library),提供了了广泛的文件格式支持,强大的图像处理能力,主要包括图像储存、图像显示、格式转换以及基本的图像处理操作等。1)使用 Image 类PIL最重要的类是 Image class, 你可以通过多种方法创建这个类的实例;你可以从文件加载图像,或者处理其他图像, 或者从 scratch 创建。要从文件加载图像,可以使用open( )函数,在Image模块中:>>> from PIL import Image>>> im = Image.open("E:/photoshop/1.jpg")加载成功后,将返回一个Image对象,可以通过使用示例属性查看文件内容:>>> print(im.format, im.size, im.mode)("JPEG", (600, 351), "RGB")>>>format 这个属性标识了图像来源。如果图像不是从文件读取它的值就是None。size属性是一个二元tuple,包含width和height(宽度和高度,单位都是px)。 mode 属性定义了图像bands的数量和名称,以及像素类型和深度。常见的modes 有 “L” (luminance) 表示灰度图像, “RGB” 表示真彩色图像, and “CMYK” 表示出版图像。如果文件打开错误,返回 IOError 错误。只要你有了 Image 类的实例,你就可以通过类的方法处理图像。比如,下列方法可以显示图像:im.show()2)读写图像PIL 模块支持大量图片格式。使用在 Image 模块的 open() 函数从磁盘读取文件。你不需要知道文件格式就能打开它,这个库能够根据文件内容自动确定文件格式。要保存文件,使用 Image 类的 save() 方法。保存文件的时候文件名变得重要了。除非你指定格式,否则这个库将会以文件名的扩展名作为格式保存。加载文件,并转化为png格式:"Python Image Library Test"from PIL import Imageimport osimport sysfor infile in sys.argv[1:]:f,e = os.path.splitext(infile)outfile = f +".png"if infile != outfile:try:Image.open(infile).save(outfile)except IOError:print("Cannot convert", infile)save() 方法的第二个参数可以指定文件格式。3)创建缩略图缩略图是网络开发或图像软件预览常用的一种基本技术,使用Python的Pillow图像库可以很方便的建立缩略图,如下:# create thumbnailsize = (128,128)for infile in glob.glob("E:/photoshop/*.jpg"):f, ext = os.path.splitext(infile)img = Image.open(infile)img.thumbnail(size,Image.ANTIALIAS)img.save(f+".thumbnail","JPEG")上段代码对photoshop下的jpg图像文件全部创建缩略图,并保存,glob模块是一种智能化的文件名匹配技术,在批图像处理中经常会用到。注意:Pillow库不会直接解码或者加载图像栅格数据。当你打开一个文件,只会读取文件头信息用来确定格式,颜色模式,大小等等,文件的剩余部分不会主动处理。这意味着打开一个图像文件的操作十分快速,跟图片大小和压缩方式无关。4)图像的剪切、粘贴与合并操作Image 类包含的方法允许你操作图像部分选区,PIL.Image.Image.crop 方法获取图像的一个子矩形选区,如:# crop, paste and mergeim = Image.open("E:/photoshop/lena.jpg")box = (100,100,300,300)region = im.crop(box)矩形选区有一个4元元组定义,分别表示左、上、右、下的坐标。这个库以左上角为坐标原点,单位是px,所以上诉代码复制了一个 200×200 pixels 的矩形选区。这个选区现在可以被处理并且粘贴到原图。region = region.transpose(Image.ROTATE_180)im.paste(region, box)当你粘贴矩形选区的时候必须保证尺寸一致。此外,矩形选区不能在图像外。然而你不必保证矩形选区和原图的颜色模式一致,因为矩形选区会被自动转换颜色。5)分离和合并颜色通道对于多通道图像,有时候在处理时希望能够分别对每个通道处理,处理完成后重新合成多通道,在Pillow中,很简单,如下:r,g,b = im.split()im = Image.merge("RGB", (r,g,b))对于split( )函数,如果是单通道的,则返回其本身,否则,返回各个通道。6)几何变换对图像进行几何变换是一种基本处理,在Pillow中包括resize( )和rotate( ),如用法如下:out = im.resize((128,128))out = im.rotate(45) # degree conter-clockwise其中,resize( )函数的参数是一个新图像大小的元祖,而rotate( )则需要输入顺时针的旋转角度。在Pillow中,对于一些常见的旋转作了专门的定义:out = im.transpose(Image.FLIP_LEFT_RIGHT)out = im.transpose(Image.FLIP_TOP_BOTTOM)out = im.transpose(Image.ROTATE_90)out = im.transpose(Image.ROTATE_180)out = im.transpose(Image.ROTATE_270)7)颜色空间变换在处理图像时,根据需要进行颜色空间的转换,如将彩色转换为灰度:cmyk = im.convert("CMYK")gray = im.convert("L")8)图像滤波图像滤波在ImageFilter 模块中,在该模块中,预先定义了很多增强滤波器,可以通过filter( )函数使用,预定义滤波器包括:BLUR、CONTOUR、DETAIL、EDGE_ENHANCE、EDGE_ENHANCE_MORE、EMBOSS、FIND_EDGES、SMOOTH、SMOOTH_MORE、SHARPEN。其中BLUR就是均值滤波,CONTOUR找轮廓,FIND_EDGES边缘检测,使用该模块时,需先导入,使用方法如下:from PIL import ImageFilterimgF = Image.open("E:/photoshop/lena.jpg")outF = imgF.filter(ImageFilter.DETAIL)conF = imgF.filter(ImageFilter.CONTOUR)edgeF = imgF.filter(ImageFilter.FIND_EDGES)imgF.show()outF.show()conF.show()edgeF.show()除此以外,ImageFilter模块还包括一些扩展性强的滤波器:class PIL.ImageFilter.GaussianBlur(radius=2)

python pillow import问题

你的pillow都装在了第三方编辑器anocoda上了,或者说在你安装anaconda时,是anaconda安装包附带的模块,换句话只能在anaconda编辑器下使用,也就是python自身并不存在完整的pillow模块。两个方法解决:1.在anaconda下运行使用pillow2.重新安装pillow,把pillow安装在Python自身的模块下,,不要用 py -3 -m pip install 命令了,使用命令pip install pillow(或者pip3 install pillow)

u2764ufe0f【Python从入门到精通】(二十七)更进一步的了解Pillow吧!

本文是接上一篇 u2764ufe0f【Python从入门到精通】(二十六)用Python的PIL库(Pillow)处理图像真的得心应手u2764ufe0f 进一步介绍Pillow库的使用, 本文将重点介绍一些高级特性:比如如何利用Pillow画图形(圆形,正方形),介绍通过Pillow库给图片添加水印;同时对上一篇文章未介绍的常用知识点进行补充说明。希望对读者朋友们有所帮助。 上一篇文章已经介绍了Image模块,但是介绍的还不够全面,例如如何从网页中读取图片没有介绍到,如何裁剪图片都没有介绍到。 读取网页中的图片的基本实现方式是:首先利用requests库读取当前图片链接的内容,接着将内容转成二进制数据,在通过open方法将该二进制数据,最后通过save方法进行保存。 读取结果是: 通过crop方法可以从图片中裁剪出一个指定大小的区域。裁取的区域范围是 (left, upper, right, lower) 比如从某个宽高都是400的图片中裁剪一个是宽高都是100的正方形区域,只需要指定裁剪区域的坐标是: (0, 0, 100, 100) 有裁剪还有一个方法就是重新设置图片大小的方法 resize,比如将前面400 400的图片 修改成 300 200,只需要调用resize方法 通过 convert方法进行图片模式的转换 前面介绍的ImageDraw库,只是介绍了利用它来向图片写入文本,其实ImageDraw模块还有一个更有用的途径,就是可以通过它来画各种图形。 首先创建一个600*600的画布。然后再画布中画出一个正方形,画直线的方法是 line方法。 ImageDraw.line(xy, fill=None, width=0, joint=None) 在xy的坐标之间画一条直线 xy--> 在两个坐标点之间画一条直线,坐标点的传入方式是[(x, y), (x, y), ...]或者[x, y, x, y, ...] fill--> 直线的颜色 width--> 直线的宽度 画一个边框宽度为2px,颜色为蓝色的,面积为400*400的正方形。 ImageDraw.arc(xy, start, end, fill=None, width=0) 在给定的区域范围内,从开始角到结束角之间绘制一条圆弧 xy--> 定义边界框的两个点,传入的格式是[ (x0, y0), (x1, y1)] 或者 [x0, y0, x1, y1] ,其中 x1>=x0,y1>=y0 start --> 起始角度,以度为单位,从3点钟开始顺时针增加 end--> 结束角度,以度为单位 fill--> 弧线的颜色 width-->弧线的宽度 这里就是画了一个半圆,如果结束角度是360度的话则就会画一个完整的圆。 画圆通过ImageDraw.ellipse(xy, fill=None, outline=None, width=1) 方法,该方法可以画出一个给定范围的圆 xy--> 定义边界框的两个点,传入的格式是[ (x0, y0), (x1, y1)] 或者 [x0, y0, x1, y1] ,其中 x1>=x0,y1>=y0 outline--> 轮廓的颜色 fill ---> 填充颜色 width--> 轮廓的宽度 ImageDraw.chord(xy, start, end, fill=None, outline=None, width=1) 方法用来画半圆,跟arc()方法不同的是它会用直线将起始点和结束点连接起来 xy--> 定义边界框的两个点,传入的格式是[ (x0, y0), (x1, y1)] 或者 [x0, y0, x1, y1] ,其中 x1>=x0,y1>=y0 outline--> 轮廓的颜色 fill ---> 填充颜色 width--> 轮廓的宽度 ImageDraw.pieslice(xy, start, end, fill=None, outline=None, width=1) 类似于arc()方法,不过他会在端点和圆点之间画直线 xy--> 定义边界框的两个点,传入的格式是[ (x0, y0), (x1, y1)] 或者 [x0, y0, x1, y1] ,其中 x1>=x0,y1>=y0 start --> 起始角度,以度为单位,从3点钟开始顺时针增加 end--> 结束角度,以度为单位 fill--> 弧线的颜色 width-->弧线的宽度 ImageDraw.rectangle(xy, fill=None, outline=None, width=1) xy--> 在两个坐标点之间画一条直线,坐标点的传入方式是[(x, y), (x, y), ...]或者[x, y, x, y, ...] outline--> 轮廓的颜色 fill--> 填充的颜色 width--> 轮廓线的宽度 ImageDraw.rounded_rectangle(xy, radius=0, fill=None, outline=None, width=1) 该方法可以画一个圆角矩形 xy--> 在两个坐标点之间画一条直线,坐标点的传入方式是[(x, y), (x, y), ...]或者[x, y, x, y, ...] radius--> 角的半径 outline--> 轮廓的颜色 fill--> 填充的颜色 width--> 轮廓线的宽度 这里有个问题,就是画好的图形如何从Image中扣出来呢? ImageEnhance模块主要是用于设置图片的颜色对比度亮度锐度等啥的,增强图像。 原始图像 ImageFilter模块主要用于对图像进行过滤,增强边缘,模糊处理,该模块的使用方式是 im.filter(ImageFilter) 。 其中ImageFilter按照需求传入指定的过滤值。 下面一个个试下效果 4.边缘增强 ImageGrab模块主要用于对屏幕进行截图,通过grab方法进行截取,如果不传入任何参数则表示全屏幕截图,否则是截取指定区域的图像。其中box格式是:(x1,x2,y1,y2) 利用Pillow库可以轻易的对图像增加水印 首先,用PIL的Image函数读取图片 接着,新建一张图(尺寸和原图一样) 然后,在新建的图象上用PIL的ImageDraw把字给画上去,字的颜色从原图处获取。 原图 添加文字后的效果图 本文详细介绍了Pillow库的使用,希望对读者朋友们有所帮助。 Pillow官方文档 需要获取源码的小伙伴可以关注下方的公众号,回复【python】

怎么样在Python编程中使用Pillow来处理图像

安装刚接触Pillow的朋友先来看一下Pillow的安装方法,在这里我们以Mac OS环境为例: (1)、使用 pip 安装 Python 库。pip 是 Python 的包管理工具,安装后就可以直接在命令行一站式地安装/管理各种库了(pip 文档)。$ wget http://pypi.python.org/packages/source/p/pip/pip-0.7.2.tar.gz$ tar xzf pip-0.7.2.tar.gz$ cd pip-0.7.2$ python setup.py install(2)、使用 pip 下载获取 Pillow:$ pip install pillow(3)、安装过程中命令行出现错误提示:”error: command ‘clang" failed with exit status 1”。上网查阅,发现需要通过 Xcode 更新 Command Line Tool。于是打开 Xcode->Preferences->Downloads-Components选项卡。咦?竟然没了 Command Line Tools。再查,发现 Xcode 5 以上现在需要用命令行安装:$ xcode-select —install系统会弹出安装命令行工具的提示,点击安装即可。此时再 pip install pillow,就安装成功了。pip freeze 命令查看已经安装的 Python 包,Pillow 已经乖乖躺那儿了。好了,下面开始进入教程~Image类Pillow中最重要的类就是Image,该类存在于同名的模块中。可以通过以下几种方式实例化:从文件中读取图片,处理其他图片得到,或者直接创建一个图片。使用Image模块中的open函数打开一张图片:>>> from PIL import Image>>> im = Image.open("lena.ppm")如果打开成功,返回一个Image对象,可以通过对象属性检查文件内容>>> from __future__ import print_function>>> print(im.format, im.size, im.mode)PPM (512, 512) RGBformat属性定义了图像的格式,如果图像不是从文件打开的,那么该属性值为None;size属性是一个tuple,表示图像的宽和高(单位为像素);mode属性为表示图像的模式,常用的模式为:L为灰度图,RGB为真彩色,CMYK为pre-press图像。如果文件不能打开,则抛出IOError异常。当有一个Image对象时,可以用Image类的各个方法进行处理和操作图像,例如显示图片:>>> im.show()ps:标准版本的show()方法不是很有效率,因为它先将图像保存为一个临时文件,然后使用xv进行显示。如果没有安装xv,该函数甚至不能工作。但是该方法非常便于debug和test。(windows中应该调用默认图片查看器打开)读写图片Pillow库支持相当多的图片格式。直接使用Image模块中的open()函数读取图片,而不必先处理图片的格式,Pillow库自动根据文件决定格式。Image模块中的save()函数可以保存图片,除非你指定文件格式,那么文件名中的扩展名用来指定文件格式。图片转成jpg格式from __future__ import print_functionimport os, sysfrom PIL import Imagefor infile in sys.argv[1:]: f, e = os.path.splitext(infile) outfile = f + ".jpg" if infile != outfile: try: Image.open(infile).save(outfile) except IOError: print("cannot convert", infile)save函数的第二个参数可以用来指定图片格式,如果文件名中没有给出一个标准的图像格式,那么第二个参数是必须的。创建缩略图from __future__ import print_functionimport os, sysfrom PIL import Imagesize = (128, 128)for infile in sys.argv[1:]: outfile = os.path.splitext(infile)[0] + ".thumbnail" if infile != outfile: try: im = Image.open(infile) im.thumbnail(size) im.save(outfile, "JPEG") except IOError: print("cannot create thumbnail for", infile)必须指出的是除非必须,Pillow不会解码或raster数据。当你打开一个文件,Pillow通过文件头确定文件格式,大小,mode等数据,余下数据直到需要时才处理。这意味着打开文件非常快,与文件大小和压缩格式无关。下面的程序用来快速确定图片属性:确定图片属性from __future__ import print_functionimport sysfrom PIL import Imagefor infile in sys.argv[1:]: try: with Image.open(infile) as im: print(infile, im.format, "%dx%d" % im.size, im.mode) except IOError: pass裁剪、粘贴、与合并图片Image类包含还多操作图片区域的方法。如crop()方法可以从图片中提取一个子矩形从图片中复制子图像box = im.copy() #直接复制图像box = (100, 100, 400, 400)region = im.crop(box)区域由4-tuple决定,该tuple中信息为(left, upper, right, lower)。 Pillow左边系统的原点(0,0)为图片的左上角。坐标中的数字单位为像素点,所以上例中截取的图片大小为300*300像素^2。处理子图,粘贴回原图region = region.transpose(Image.ROTATE_180)im.paste(region, box)将子图paste回原图时,子图的region必须和给定box的region吻合。该region不能超过原图。而原图和region的mode不需要匹配,Pillow会自动处理。另一个例子Rolling an imagedef roll(image, delta): "Roll an image sideways" image = image.copy() #复制图像 xsize, ysize = image.size delta = delta % xsize if delta == 0: return image part1 = image.crop((0, 0, delta, ysize)) part2 = image.crop((delta, 0, xsize, ysize)) image.paste(part2, (0, 0, xsize-delta, ysize)) image.paste(part1, (xsize-delta, 0, xsize, ysize)) return image分离和合并通道r, g, b = im.split()im = Image.merge("RGB", (b, g, r))对于单通道图片,split()返回图像本身。为了处理单通道图片,必须先将图片转成RGB。几何变换Image类有resize()、rotate()和transpose()、transform()方法进行几何变换。简单几何变换out = im.resize((128, 128))out = im.rotate(45) # 顺时针角度表示置换图像out = im.transpose(Image.FLIP_LEFT_RIGHT)out = im.transpose(Image.FLIP_TOP_BOTTOM)out = im.transpose(Image.ROTATE_90)out = im.transpose(Image.ROTATE_180)out = im.transpose(Image.ROTATE_270)transpose()和象的rotate()没有性能差别。更通用的图像变换方法可以使用transform()模式转换convert()方法模式转换im = Image.open("lena.ppm").convert("L")图像增强Filter ImageFilter模块包含很多预定义的增强filters,通过filter()方法使用应用filtersfrom PIL import ImageFilterout = im.filter(ImageFilter.DETAIL) 像素点处理point()方法通过一个函数或者查询表对图像中的像素点进行处理(例如对比度操作)。像素点变换# multiply each pixel by 1.2out = im.point(lambda i: i * 1.2)上述方法可以利用简单的表达式进行图像处理,通过组合point()和paste()还能选择性地处理图片的某一区域。处理单独通道# split the image into individual bandssource = im.split()R, G, B = 0, 1, 2# select regions where red is less than 100mask = source[R].point(lambda i: i < 100 and 255)# process the green bandout = source[G].point(lambda i: i * 0.7)# paste the processed band back, but only where red was < 100source[G].paste(out, None, mask)# build a new multiband imageim = Image.merge(im.mode, source)注意到创建mask的语句:mask = source[R].point(lambda i: i < 100 and 255)该句可以用下句表示imout = im.point(lambda i: expression and 255)如果expression为假则返回expression的值为0(因为and语句已经可以得出结果了),否则返回255。(mask参数用法:当为0时,保留当前值,255为使用paste进来的值,中间则用于transparency效果)高级图片增强对其他高级图片增强,应该使用ImageEnhance模块 。一旦有一个Image对象,应用ImageEnhance对象就能快速地进行设置。 可以使用以下方法调整对比度、亮度、色平衡和锐利度。图像增强from PIL import ImageEnhanceenh = ImageEnhance.Contrast(im)enh.enhance(1.3).show("30% more contrast")动态图Pillow支持一些动态图片的格式如FLI/FLC,GIF和其他一些处于实验阶段的格式。TIFF文件同样可以包含数帧图像。当读取动态图时,PIL自动读取动态图的第一帧,可以使用seek和tell方法读取不同郑from PIL import Imageim = Image.open("animation.gif")im.seek(1) # skip to the second frametry: while 1: im.seek(im.tell()+1) # do something to imexcept EOFError: pass # end of sequence当读取到最后一帧时,Pillow抛出EOFError异常。当前版本只允许seek到下一郑为了倒回之前,必须重新打开文件。或者可以使用下述迭代器类动态图迭代器类class ImageSequence: def __init__(self, im): self.im = im def __getitem__(self, ix): try: if ix: self.im.seek(ix) return self.im except EOFError: raise IndexError # end of sequencefor frame in ImageSequence(im): # ...do something to frame...Postscript PrintingPillow允许通过Postscript Printer在图片上添加images、text、graphics。Drawing Postscriptfrom PIL import Imagefrom PIL import PSDrawim = Image.open("lena.ppm")title = "lena"box = (1*72, 2*72, 7*72, 10*72) # in pointsps = PSDraw.PSDraw() # default is sys.stdoutps.begin_document(title)# draw the image (75 dpi)ps.image(box, im, 75)ps.rectangle(box)# draw centered titleps.setfont("HelveticaNarrow-Bold", 36)w, h, b = ps.textsize(title)ps.text((4*72-w/2, 1*72-h), title)ps.end_document()更多读取图片方法之前说到Image模块的open()函数已经足够日常使用。该函数的参数也可以是一个文件对象。从string中读取import StringIOim = Image.open(StringIO.StringIO(buffer))从tar文件中读取from PIL import TarIOfp = TarIO.TarIO("Imaging.tar", "Imaging/test/lena.ppm")im = Image.open(fp)草稿模式draft()方法允许在不读取文件内容的情况下尽可能(可能不会完全等于给定的参数)地将图片转成给定模式和大小,这在生成缩略图的时候非常有效(速度要求比质量高的场合)。draft模式from __future__ import print_functionim = Image.open(file)print("original =", im.mode, im.size)im.draft("L", (100, 100))print("draft =", im.mode, im.size)

python 怎么安装pillow

1. 安装pip [plain] view plain copy sudo easy_install pip pip 安装成功就可以直接安装pil或者pillow2. 通过命令pip install pil[plain] view plain copy pip install Pil Downloading/unpacking Pil Could not find any downloads that satisfy the requirement Pil Some externally hosted files were ignored (use --allow-external Pil to allow). Cleaning up... No distributions at all found for Pil Storing debug log for failure in /Users/macbook/Library/Logs/pip.log 3. 所以就安装pillow[plain] view plain copy pip install --use-wheel Pillow Downloading/unpacking Pillow Downloading Pillow-2.4.0.zip (6.5MB): 5.0MB downloaded Cleaning up... 弄了会别的回来发现还没有下载完,这叫一个慢呀,于是放弃4. 通过Git下载源码地址https://github.com/python-imaging/Pillow[plain] view plain copy git clone https://github.com/python-imaging/Pillow.git 然后开始编译安装4.1 [plain] view plain copy python setup.py build_ext -i 编译完之后会提示运行测试例子,并且发现JPEG support not available[plain] view plain copy -------------------------------------------------------------------- version Pillow 2.4.0 platform darwin 2.7.5 (default, Aug 25 2013, 00:04:04) [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] -------------------------------------------------------------------- --- TKINTER support available *** JPEG support not available *** OPENJPEG (JPEG2000) support not available --- ZLIB (PNG/ZIP) support available *** LIBTIFF support not available --- FREETYPE2 support available *** LITTLECMS2 support not available *** WEBP support not available *** WEBPMUX support not available -------------------------------------------------------------------- To add a missing option, make sure you have the required library, and set the corresponding ROOT variable in the setup.py script. To check the build, run the selftest.py script. 4.2 因为JPEG support not available,运行python selftest.py报告错误[plain] view plain copy 1 tests of 57 failed. 于是只好卸载pillow可以通过pip命令来卸载[plain] view plain copy pip uninstall pillow sudo pip uninstall pillow Password: Uninstalling Pillow: /Library/Python/2.7/site-packages/Pillow-2.4.0-py2.7-macosx-10.9-intel.egg /usr/local/bin/pilconvert.py /usr/local/bin/pildriver.py /usr/local/bin/pilfile.py /usr/local/bin/pilfont.py /usr/local/bin/pilprint.py Proceed (y/n)? y Successfully uninstalled Pillow 成功之后需要安装libjpeg的支持[plain] view plain copy brew install libjpeg 安装成功之后重新编译pillow[plain] view plain copy -------------------------------------------------------------------- version Pillow 2.4.0 platform darwin 2.7.5 (default, Aug 25 2013, 00:04:04) [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] -------------------------------------------------------------------- --- TKINTER support available --- JPEG support available *** OPENJPEG (JPEG2000) support not available --- ZLIB (PNG/ZIP) support available *** LIBTIFF support not available --- FREETYPE2 support available *** LITTLECMS2 support not available *** WEBP support not available *** WEBPMUX support not available -------------------------------------------------------------------- [plain] view plain copy python selftest.py [plain] view plain copy -------------------------------------------------------------------- Pillow 2.4.0 TEST SUMMARY -------------------------------------------------------------------- Python modules loaded from /Users/macbook/yyang/app-devel-source/python/Pillow/PIL Binary modules loaded from /Users/macbook/yyang/app-devel-source/python/Pillow/PIL -------------------------------------------------------------------- --- PIL CORE support ok --- TKINTER support ok --- JPEG support ok *** JPEG 2000 support not installed --- ZLIB (PNG/ZIP) support ok *** LIBTIFF support not installed --- FREETYPE2 support ok *** LITTLECMS2 support not installed *** WEBP support not installed -------------------------------------------------------------------- Running selftest: --- 57 tests passed. 最后执行安装[plain] view plain copy sudo python setup.py install

如何用python调用spike

1、Neuroexplorer里的Interval variable就是spike train的time stamp所构成的一个变量,实际就是你需要分析的spike串; 2、滤波可以用MATLAB来,有现成的数字滤波器设计函数,需要你调用。Neuroexploer有没有滤波功能我不太清楚

利用python中的xlwings模块操作excel中发生的报错???

xlwings是通过安装Pywin32这个windows系统API和EXCEL建立连接的,你是不是只安装了xlwings,没有安装Pywin32这个程序吧?

python grpc如何给proto文件中map类型的变量赋值?

改完之后,你可以选择project->clean,clean后你项目的R.java文件就会重新生成,所有的资源ID会重新分配,这样子你所修改的资源才能被Android真正识别,有时这个操作不是必要的,但是如果出现你修改了资源后,你的项目中出现了一些问题,那么执行Clean是一个必须的选择,这些资源包括drawable下的图片,布局里id的修改,values下资源的修改,你可以着手试一下 Good luck

python或matlab中jet是什么颜色模型?

等scope显示出来图像以后,在MATLAB上运行 set(0,"ShowHiddenHandles","On") set(gcf,"menubar","figure") 这时候你会发现scope的工具栏的上面多了一行,点击insert-axes,鼠标会变成十字形状,然后再图像的任意一处双击左键出现一个对话框PropertyEditor,选中style在窗口的右便会出现color,这时你就可以任意修改背景颜色了。 建议你最好保存数据在workspace里面,用plot的方法打印图形。不要直接复制示波器的波形。

python如何通过protobuf实现rpc

由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc。rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行google,这里只是做个简单的介绍。rpc的主要功能是让分布式系统的实现更为简单,为提供强大的远程调用而不损失本地调用语义的简洁性。为了实现这个目标,rpc框架需要提供一种透明调用机制让使用者不必显示区分本地调用还是远程调用。rpc架构涉及的组件如下:客户方像调用本地方法一样去调用远程接口方法,RPC 框架提供接口的代理实现,实际的调用将委托给代理RpcProxy 。代理封装调用信息并将调用转交给RpcInvoker 去实际执行。在客户端的RpcInvoker 通过连接器RpcConnector 去维持与服务端的通道RpcChannel,并使用RpcProtocol 执行协议编码(encode)并将编码后的请求消息通过通道发送给服务方。RPC 服务端接收器 RpcAcceptor 接收客户端的调用请求,同样使用RpcProtocol 执行协议解码(decode)。解码后的调用信息传递给RpcProcessor 去控制处理调用过程,最后再委托调用给RpcInvoker 去实际执行并返回调用结果。protobuf rpc在上面组件中主要扮演RpcProtocol的角色,使得我们省去了协议的设计,并且protobuf协议在编码和空间效率都是上非常高效的,这也是很多公司采用protobuf作为数据序列化和通信协议的原因。同时protobuf rpc定义了一个抽象的rpc框架,如下图所示:RpcServiceStub和RpcService类是protobuf编译器根据proto定义生成的类,RpcService定义了服务端暴露给客户端的函数接口,具体实现需要用户自己继承这个类来实现。RpcServiceStub定义了服务端暴露函数的描述,并将客户端对RpcServiceStub中函数的调用统一转换到调用RpcChannel中的CallMethod方法,CallMethod通过RpcServiceStub传过来的函数描述符和函数参数对该次rpc调用进行encode,最终通过RpcConnecor发送给服务方。对方以客户端相反的过程最终调用RpcSerivice中定义的函数。事实上,protobuf rpc的框架只是RpcChannel中定义了空的CallMethod,所以具体怎样进行encode和调用RpcConnector都要自己实现。RpcConnector在protobuf中没有定义,所以这个完成由用户自己实现,它的作用就是收发rpc消息包。在服务端,RpcChannel通过调用RpcService中的CallMethod来具体调用RpcService中暴露给客户端的函数。介绍了这么多,对于怎么样用protobuf rpc来实现一个rpc肯定还是一头雾水吧,下面就用protobuf rpc来实现一个简单的python版rpc demo吧。下面直接给出demo描述PRC的proto文件,至于proto文件的编写规则可以参考protobuf官网。common.proto文件:package game;message RequestMessage{ required string message = 1;}message ResponseMessage{ required string message = 1;}game_service.proto文件:package game;import "common.proto";option py_generic_services = true;service GameService{ rpc connect_server(RequestMessage) returns(RequestMessage);}common.proto文件描述了RPC中收发的消息;game_service.proto描述了服务器导出的connect_server函数,该函数接受RequestMessage对象作为参数,并返回RequestMessage对象。在使用PRC协议时,必须加上option py_generic_services = true;可选项,要不然编译器不会生成包含connect_server函数的GameService描述。使用编译器protoc编译proto文件,具体命令为:protoc.exe --python_out=. game_service.proto编译后生成的文件为game_service_pb2.py,该文件主要是实现了GameService和GameService_Stub类。GameService_Stub类用于客户端调用者来调用GameService的服务。前面已经说了,在客户端,RpcChannel只实现了一个空的CallMethod,所以需要继承RpcChannel重新这个函数来encode消息和发送消息。在服务端RpcChannel需要调用CallMethod来调用Service中的函数。具体实现如下:class MyRpcChannel(service.RpcChannel): def __init__(self, rpc_service, conn): super(MyRpcChannel, self).__init__() self.logger = LogManager.get_logger("MyRpcChannel") def CallMethod(self, method_descriptor, rpc_controller, request, response_class, done): """"protol buffer rpc 需要的函数,用来发送rpc调用""" self.logger.info("CallMethod") cmd_index = method_descriptor.index assert(cmd_index < 65535) data = request.SerializeToString() total_len = len(data) + 2 self.conn.send_data("".join([pack("最后就是继承GameService,并实现connect_server函数了。class GameService(game_service_pb2.GameService): def __init__(self): self.logger = LogManager.get_logger("GameService") def connect_server(self, rpc_controller, request, callback): self.logger.info("%s", request.message) 至于用于网络收发消息的RpcConnector,可以使用python的asyncore库实现,具体实现在这就不讨论了。从上面的实现来看,protobuf rpc的实现主要包括编写proto文件并编译生成对应的service_pb2文件,继承RpcChannel并实现CallMethod和调用Service的CallMethod,继承Service来实现暴露给客户端的函数。

proto 转json 值类型错误 python

解决方法如下:1,protobuf下载安装。2,新建目录example。3,上面步骤做好之后,下面我们需要用python实现基于protobuf协议将json转化为pbstring,将pbstring转成json。

python 无法显示汉字

库不对 3.X就没这个问题了

如何用Python读取.gz数据

gz的数据是这样读的没错,但是pickle不是这样的用的啊,pickle是JSON标准库中的序列化封装类,只能序列化和反序列化python中的类、对象,而不能你随便指定一段数据让它load,它不认识的。

python中的try...except的用法?

这里的Pickle和cPickle是模块名称不能用小写;cPickle 和 Pickle 是python的两个模块,提供了数据持久化的方法,其中cPickle是Pickle的C语言实现。try: import cPickle as p # 若能导入cPickle模块则导入,并以p命名except: import Pickle as p # 若导入cPickle模块导入错误,则导入Pickle,并以p命名

python中pickle模块的作用是什么?为什么不直接把数据存到文件中?

pickle 的默认格式是二进制格式可以使用 pickle 模块把 Python 对象直接保存到文件里,而不需要先把它们转化为字符串再保存,也不需要用底层的文件访问操作把它们写入到一个二进制文件里。pickle 模块会创建一个 Python 语言专用的二进制格式,不需要使用者考虑任何文件细节,它会帮你干净利索地完成读写对象操作,唯一需要的只是一个合法的文件句柄。用pickle比你打开文件、转换数据格式并写入这样的操作要节省不少代码行。

python中pickle模块的作用是什么?为什么不直接把数据存到文件中?

Pickle模块中最常用的函数为:(1)pickle.dump(obj, file, [,protocol])函数的功能:将obj对象序列化存入已经打开的file中。参数讲解:obj:想要序列化的obj对象。file:文件名称。protocol:序列化使用的协议。如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL,则使用最高的协议版本。(2)pickle.load(file)函数的功能:将file中的对象序列化读出。参数讲解:file:文件名称。(3)pickle.dumps(obj[, protocol])函数的功能:将obj对象序列化为string形式,而不是存入文件中。参数讲解:obj:想要序列化的obj对象。protocal:如果该项省略,则默认为0。如果为负值或HIGHEST_PROTOCOL,则使用最高的协议版本。(4)pickle.loads(string)函数的功能:从string中读出序列化前的obj对象。

为什么我的 python 不能 pickle 一个 dict

用的python3吧 用python3 读取 默认返回的是bytes 而不是 str (貌似如果全是英文,返回的就是str,而且是utf-8编码,python3.3 for Windows 64位) 返回的是bytes就需要解码为str bytes.decode("编码格式")就行了

Win7下用python编写脚本,引入cPickle 出现错误:No module named cPickle,请问怎么解决啊?????

python3的吧,就import pickle就行。如果能用c的版本它就用了,如果不能用,它自己用python版本的pickle

python 一个菜鸟问题,不知道怎么回事就报错了。

你是要把list保存到文件中?如果是直接用pickle.dump()。如果不是,当我没说

将python2中的cPickle修改成python3中的pickle的正确用法

因为pickle可以把字典、列表等结构化数据存到本地文件,读取后返回的还是字典、列表等结构化数据。而file.write、file.read存取的对象是字符串。 读取得到的字符串需要再次加工处理才能转换为字典、列表等,所以pickle的存在是为了方便特殊类型数据的保存。 报错:ModuleNotFoundError: No module named "cPickle" 原因:python2有cPickle,但是在python3下,是没有cPickle的; 解决办法:将cPickle改为pickle即可,但是这样还是出现编码的问题 报错:UnicodeDecodeError: "ascii" codec can"t decode byte 0xe7 in position 0: ordinal not in range(128)错误解 原因:python3中的pickle需要指定一下编码 解决办法:见下图 参考文章: 【1】 pickle 在python 2和python 3中兼容性问 【2】 Pickle incompatibility of numpy arrays between Python 2 and 3

为什么python3 pickleshare

加工数据的,可以用来存取结构化数据。举个例子: 一个字典a = {"name":"Tom","age":22},用pickle.dump存到本地文件,所存数据的结构就是字典,而普通的file.write写入文件的是字符串。读取时,pickle.load返回的是一个字典

python pickle.dump ()不知道dump多少次,如何才能从文件中完整的pickle.load()到所有数据?

乱回答,不懂别人的问题 乱作答,人家问的是多次dump()后,想一次load()出所有对象。我也是遇到这个问题,好像可以循环load然后直至发生异常

python中pickle.load有问题

pickle.load()方法返回的结果就是数据,不需要再在返回结果上调用read方法了。

为什么我的 python 不能 pickle 一个 dict

that"s not impossible

学习python中,pickle.load()的使用问题

import picklemylist = [1,2,3,"abc"]f = open("mylist.txt","wb")#以二进制写入pickle.dump(mylist,f)f.close()#文件操作完成后关闭,否则造成无法读写报错EOFError: Ran out of input

python的pickle.dump出现问题

把st的定义也贴上来看看。

python 怎样添加模块加载路径

放到C:Python33Lib目录就行了。不需要再添加路径了。或者放到你程序的根目录。

pytorch模型文件pth详解

如上打印输出所示,pth文件通过有序字典来保持模型参数。有序字典与常规字典一样,但是在排序操作方面有一些额外的功能。常规的dict是无序的,OrderedDict能够比dict更好地处理频繁的重新排序操作。 OrderedDict有一个方法 popitem(last=True) 用于有序字典的popitem()方法返回并删除一个(键,值)对。如果last为真,则按LIFO顺序返回对;如果为假,则按FIFO顺序返回对。 OrderedDict还有一个方法 move_to_end(key,last=True) ,将现有的键移动到有序字典的两端。如果last为真,则将项目移动到右端(默认);如果last为假,则移动到开头。 如上打印所示,有序字典state_dict中每个元素都是Parameter参数,该参数是一种特殊的张量,包含data和requires_grad两个方法。其中data字段保存的是模型参数,requires_grad字段表示当前参数是否需要进行反向传播。 先建立一个字典,保存三个参数:调用torch.save(),即可保存对应的pth文件。需要注意的是若模型是由nn.Moudle类继承的模型,保存pth文件时,state_dict参数需要由 model.state_dict 指定。 当你想恢复某一阶段的训练(或者进行测试)时,那么就可以读取之前保存的网络模型参数等。

如何向IPython Notebook中导入.py文件

IPython Notebook使用起来简洁方便,但是有时候如果需要导入一个现有的.py文件,则需要注意选择导入的方法以达到不同的效果。目前遇到3种方法。(1) 将文件保存为.ipynb格式,直接拖拽到Notebook界面中的列表里:然后点击 Upload。这种方法需要定义好的文件格式,效果比较差。自己写的.ipynb往往无法上传。(2) 利用 %load:这种方法可以将自己编写的.py文件原封不动地搬到一个cell里面,自然也往往不是我们想要达到的效果。(3) 利用 IPython.nbformat.current :import IPython.nbformat.current as nbfnb = nbf.read(open("test.py", "r"), "py")nbf.write(nb, open("test.ipynb", "w"), "ipynb")这样会生成一个名为 test.ipynb 的文件

关于Python的Selenium框架全解,一篇完整的说明书

目录 安装 selenium 第三方库 下载浏览器驱动: 需要把这些浏览器驱动放入 Python 应用目录里面的 Script 文件夹里面 ① 200 多本 Python 电子书(和经典的书籍)应该有 ② Python标准库资料(最全中文版) ③ 项目源码(四五十个有趣且可靠的练手项目及源码) ④ Python基础入门、爬虫、网络开发、大数据分析方面的视频(适合小白学习) ⑤ Python学习路线图(告别不入流的学习) 私信我01即可获取大量Python学习资源 每次当selenium启动chrome浏览器的时候,chrome浏览器很干净,没有插件、没有收藏、没有 历史 记录,这是因为selenium在启动chrome时为了保证最快的运行效率,启动了一个裸浏览器,这就是为什么需要配置参数的原因,但是有些时候我们需要的不仅是一个裸浏览器 selenium启动配置参数接收是ChromeOptions类,创建方式如下 : 创建了ChromeOptions类之后就是添加参数,添加参数有几个特定的方法,分别对应添加不同类型的配置项目 常用配置参数: 其他配置项目参数 制作无头浏览器 规避检测 门户网站检测如果是selenium请求的,有可能会拒绝访问。这也是一种反爬机制 实现规避检测 注意:这里只能使用 options 添加 如果有其他的模块要添加,注意要分开添加 元素定位语法 常用语法: 在 element 变成 elements 时,返回符合条件的所有元素组成的数组 控制浏览器大小 浏览器后退,前进 刷新 在搜索框模拟回车操作 在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供 ActionChains 类提供了鼠标操作的常用方法: 语法: 想使用selenium中的键盘事件,首先我们必须导入Keys包,需要注意的是包名称Keys首字母需要大写。Keys类中提供了几乎所有的键盘事件包括组合按键如 Ctrl+A、 Ctrl+C 等 使用语法: 其他事件可以通过查看源码获取 显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常 实例: WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常 语法: 参数: 如果某些元素不是立即可用的,隐式等待是告诉WebDriver去等待一定的时间后去查找元素。 默认等待时间是0秒,一旦设置该值,隐式等待是设置该WebDriver的实例的生命周期 案例 语法: alert 里面的方法 WebDriver操作cookie的方法: 参考链接: https://www.jianshu.com/p/773c58406bdb 与普通的在headers里添加 {"Cookies":" "} 不一样的是,此方法需要按照cookie的name,value,path,domain格式逐个cookie添加 通过execute_script()方法执行JavaScripts代码来移动滚动条的位置

python菜鸡使用selenium出问题请指教

1.打开默认的chrome在python版的Webdriver中要打开chrome浏览器,需要安装chromedriver.exe。。将这个chromedriver.exe放置在chrome的安装目录下 相对路径为 …GoogleChromeApplication,然后设置path环境变量,把chrome的安装目录地址放入path变量中。我的安装目录是C:Program FilesGoogleChromeApplication,也即是在path变量的最后,加上此目录即可,然后尝试在python中运行from selenium import webdriverdriver = webdriver.Chrome()若不报错,即代表安装成功。2.打开本地的Chromeimport osfrom selenium import webdriverfrom selenium.webdriver.chrome.options import Optionsfrom time import sleepexecutable_path = "C:Program Files (x86)GoogleChromeApplicationchromedriver.exe" //指定chromediver的位置,如果在默认路径,这两行可以省略。os.environ["webdriver.chrome.driver"] = executable_pathoptions = webdriver.ChromeOptions() //定义配置对象options.add_argument("--user-data-dir="+r"C:/Users/cui/AppData/Local/Google/Chrome/User Data/")//指定用户的配置地址,并加载至配置对象中。browser = webdriver.Chrome(executable_path,chrome_options=options)//此处注意,有两个参数,后面那个参数,一定要写成 chrome_options=XX的形式,否则运行报错。备注:chrome的用户配置数据,在c盘的user用户下,可能有些人不能找到此目录,这是因为AppDate文件夹是默认隐藏的,需要进入文件夹选项去设置一下即可。

selenium3 python环境搭建

随着Python3的普及,Selenium3也跟上了行程。而Selenium3最大的变化是去掉了Selenium RC,另外就是Webdriver从各自浏览器中脱离,必须单独下载。1、windows下多个python版本共存(本机已经安装有python2.7.8)可以通过 python 、pip 下载python跟pip本机安装的版本python 2.7.8 与python 3.5下载python后安装,添加环境变量 pathD:PythonPython35-32Scripts;D:PythonPython35-32;D:Python27;D:Python27Scripts;进入D:Python27,将python.exe修改为python2.exe进入D:PythonPython35-32,将python.exe修改为python3.exe将下载的pip 解压,进入解压目录 执行python2 setup.py install/python3 setup.py install通过 pip list 查看pip是否安装成功。python3-pip list2、在python3中安装selenium进入D:PythonPython35-32Scripts 执行pip.exe install seleniumsuccessfully install selenium3、安装selenium服务器在selenium下载地址中下载selenium-server-standalone-x.x.x.jar在执行 java -jar selenium-server-standalone-3.3.1.jar 安装selenium 服务器4、安装Firefox geckodriver安装firefox最新版本,添加Firefox可执行程序到系统环境变量。记得关闭firefox的自动更新安装geckodriver geckodrive 下载地址 将下载的geckodriver.exe 放到path路径下 D:PythonPython35-325、简单例子官网的一个实例,python_org_search.py。from selenium import webdriverfrom selenium.webdriver.common.keys import Keysdriver = webdriver.Firefox()driver.get("http://www.python.org")assert "Python" in driver.titleelem = driver.find_element_by_name("q")elem.clear()elem.send_keys("pycon")elem.send_keys(Keys.RETURN)assert "No results found." not in driver.page_sourcedriver.close()通过 python3 python_org_search.py 执行执行界面firefox6、踩过的坑1、需要安装 geckodrivererror 12、升级firefox error 23、火狐浏览器如果没有安装至默认目录,webdriver.py和firefox_binary.py的配置需要更改error4、插件间版本的匹配搞不懂。庆幸的是可以跑了~~~

selenium+python如何爬取简书网站

jianshu首页打开chrome的开发者模式,发现文章的标题,href都在a标签里,似乎也没有什么不一样的a.png接下来就是寻找页面上所有的a标签,但是且慢如果你仔细观察就会发现滑轮滚到一半的时候页面就会加载更多,这样的步骤会重复三次知道底部出现阅读更多的按钮滑轮不仅如此底部的阅读更多的href并没有告诉我们加载剩下的页面信息,唯一的办法是不断点击阅读更多这个按钮load_more.png什么,将滑轮重复三次滑倒页面的中央并且不断点击按钮这种操作http请求可做不到,这更像是js操作?没错,简书的文章并不是常规的http请求,我们不能根据不同url不断重定向,而是页面的一些动作来加载页面信息。selenium介绍selenium是一个web自动化测试工具,支持很多种语言,我们在这里可以使用python的selenium做爬虫使用,爬取简书的过程中,它的工作原理是不断注入js代码,让页面源源不断的加载,最后再提取所有的a标签。首先你得在python中下载selenium包>>> pip3 install seleniumchromedriverselenium必须搭载浏览器使用,这里我使用的是chromedriver,Chrome的开源测试版,它可以使用headless模式不需要显示前段来访问网页,算是最大特性了。python中操作在写代码之前一定要把chromedriver同一文件夹内,因为我们需要引用PATH,这样方便点。首先我们的第一个任务是刷出加载更多的按钮,需要做3次将滑轮重复三次滑倒页面的中央,这里方便起见我滑到了底部from selenium import webdriverimport timebrowser = webdriver.Chrome("./chromedriver")browser.get("https://www.jianshu.com/")for i in range(3): browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") // execute_script是插入js代码的 time.sleep(2) //加载需要时间,2秒比较合理看看效果刷出了按钮接下来就是不断点击按钮加载页面,继续加入刚才的py文件之中for j in range(10): //这里我模拟10次点击 try: button = browser.execute_script("var a = document.getElementsByClassName("load-more"); a[0].click();") time.sleep(2) except: pass""" 上面的js代码说明一下 var a = document.getElementsByClassName("load-more");选择load-more这个元素 a[0].click(); 因为a是一个集合,索引0然后执行click()函数"""这个我就不贴图了,成功之后就是不断地加载页面 ,知道循环完了为止,接下来的工作就简单很多了,就是寻找a标签,get其中的text和href属性,这里我直接把它们写在了txt文件之中.titles = browser.find_elements_by_class_name("title")with open("article_jianshu.txt", "w", encoding="utf-8") as f: for t in titles: try: f.write(t.text + " " + t.get_attribute("href")) f.write("") except TypeError: pass最终结果简书文章headless模式不断加载页面肯定也很烦人,所以我们测试成功之后并不想把浏览器显示出来,这需要加上headless模式options = webdriver.ChromeOptions()options.add_argument("headless")browser = webdriver.Chrome("./chromedriver", chrome_options=options) //把上面的browser加入chrome_options参数总结当我们没办法使用正常的http请求爬取时,可以使用selenium操纵浏览器来抓取我们想要的内容,这样有利有弊,比如优点可以暴力爬虫简书并不需要cookie才能查看文章,不需要费劲心思找代理,或者说我们可以无限抓取并且不会被ban首页应该为ajax传输,不需要额外的http请求缺点爬取速度太满,想象我们的程序,点击一次需要等待2秒那么点击600次需要1200秒, 20分钟...附加这是所有完整的代码from selenium import webdriverimport timeoptions = webdriver.ChromeOptions()options.add_argument("headless")browser = webdriver.Chrome("./chromedriver", chrome_options=options)browser.get("https://www.jianshu.com/")for i in range(3): browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(2)# print(browser)for j in range(10): try: button = browser.execute_script("var a = document.getElementsByClassName("load-more"); a[0].click();") time.sleep(2) except: pass#titles = browser.find_elements_by_class_name("title")with open("article_jianshu.txt", "w", encoding="utf-8") as f: for t in titles: try: f.write(t.text + " " + t.get_attribute("href")) f.write("") except TypeError: pass相关推荐:

python selenium如何点击页面table列表中的元素

1.通过selenium定位方式(id、name、xpath等方式)定位table标签#html源码<table border="5" id="table1" width="80%">#selenium操作代码table1=driver.find_element_by_id("table1")2.获取总行数(也就是获取tr标签的个数)#html源码<tr><th>姓名</th><th>性别</th></tr>#selenium操作源码table_rows = table1.find_elements_by_tag_name("tr")3.获取总列数(也就是tr标签下面的th标签个数)#html源码<tr><th>姓名</th><th>性别</th></tr>#selenium操作源码:第一个tr标签下有多少个thtable_rows = table_rows[0].find_elements_by_tag_name("th")4.获取单个cell值#selenium操作源码:第一行第二列的text值row1_col2 = table_rows[1].find_elements_by_tag_name("td")[1].text5.取值比对~

使用python简单封装selenium常用函数

年前走查脚本代码时,发现大家对selenium功能都在重复造轮子,而且容易出现一些常见低级bug。于是在闲暇之余,封装一些常用的selenium功能。 在某些网页中,存在多个frame嵌套。而selenium提供的find_element函数只能在当前frame中查找,不能切换到其他frame中,需要从最上级frame中逐步切换(当然也可以指定xpath的绝对路径,但是一般没人这么做)。在我们写代码过程中,需要明确知道当前frame位置和需要寻找元素的frame位置。在frame切换过程中,容易因为疏忽导致frame切换错误导致元素无法找到的bug。 页面中分布的frame,可以理解为树状结构。因此我们可以采用递归的方式, 沿着某条搜索路线frame节点,依次对树中每个节点均做一次访问。 我们以163网址上的登录框为例:点击登录按钮,弹出登录iframe页面。输入框位置在iframe中,因此我们不能使用xpath获取元素位置,需要进入iframe中,然后获取元素。 手动切换ifame可能会产生bug,因此需要一套自动切换和检索frame的机制。具体代码如下: 需要注意的是:如果页面中多个frame中,存在相同的xpath元素。还是需要指定frame的路径,否则会返回搜索到的第一个元素。 强制等待 直接调用系统time.sleep函数,不管页面加载情况一定会等待指定的时间, 即使元素已被加载 。 1.如果设置的时间较长,会浪费时间 2.如果设置的时间较短,元素可能没有加载。 页面中某元素如果未能立即加载,隐式等待告诉WebDriver需等待一定的时间,然后去查找元素。默认不等待,隐式等待作用于整个WebDriver周期,只需设置一次即可。 1.在上文的find_element函数中,采用递归方式在所有frame寻找元素。若采用隐式等待,则在每个frame中都需要等待设定的时间,耗时非常长。 2.某些页面我们想要的元素已经加载完毕,但是部分其他资源未加载。隐式等待必须等待所有元素加载完毕,增加额外等待时间。 显示等待一般作用于某一个元素,在设定的时间范围内,默认每间隔0.5秒查找元素。返回被加载的元素,若超过设定的时间范围未能查找则报错。显示等待作为selenium常用的等待机制,我们来看下他的源码和机制。 driver 注释中解释为WebDriver实例,但是代码中并未有相关检测,因此可以传入任何对象 但是__repr__函数中使用到session_id属性,如果需要显示属性或者转为str对象,最好在driver对象中添加session_id属性 在until函数中,我们可以看到driver对象传入method函数。在计时结束前,在不断循环执行method函数,如果method函数有正常返回值则退出循环,否则报TimeoutException错误。 可以采用装饰器对隐式等待进行封装,这样代码更加精简 同样的,采用装饰器对其他常用的函数进行封装,例如强制等待、点击、输入文本等。 装饰器虽然很方便,但也会产生一些麻烦。例如在find_element函数递归调用过程中,理应只要执行一次装饰器函数。但因为装饰器已经装饰完毕,导致每次递归都会执行。例如强制等待的sleep函数,如果递归次数越多等待时间越长。 解除装饰器一般有两种做法:一是约定参数,当递归第二次调用时则不生效。例如 这种方式实现简单,容易理解。但是增加了参数限制,在fun函数中就不能使用first_sleep参数。 二是采用装饰器采用wrapped实现,通过访问wrapped属性获得原始函数。例如 但是某一个函数被多个装饰器装饰时,需要递归解除装饰器。例如 最后整体代码如下 这次的封装其实还存在很多问题 1.find_element函数不仅仅只是提供查找元素功能,还提供一些其他功能,因此叫element_operation更为合适。 2.find_element函数的参数过多,并且很多参数的使用并不在函数本身中,对代码阅读很不友好。 3.得小心避免参数重复问题,假设装饰器sleep和装饰器wait_time都使用time这个参数,将无法区分具体是哪个函数使用。 4.不利于扩展和维护,当功能过多时find_element的参数过于庞大。 如果只是简单地封装和使用,上面这种方式也能达到较好的效果。如果想进一步封装,建议采用链式调用方式,装饰器辅助封装。例如 这样函数的扩展性和可阅读性有较大的提升

如何在python中使用selenium

selenium简介selenium提供了一个通用的接口,可模拟用户来操作浏览器,比如用于自动化测试等.selenium的核心是WebDriver,它提供了一组接口,这些接口能够操作各种跨平台的浏览器.各大浏览器厂商.各大浏览器厂商也支持Selenium,将其作为浏览器的一部分.selenium工具集提供了WebDriver,Selenium IDE,Selenium-Grid等Selenium 1.0 + WebDriver = Selenium 2.0Selenium WebDriver是Selenium Remote Control(Selenium-RC)的继承者.WebDriver提供了更简单和简洁的接口,克服了Selenium-RC API一些限制.相比Selenium 1.0,WebDriver是面向对象式的服务.WebDriver驱动浏览器更有效率,提供了比Selenium 1.0更多的功能Selenium RC只能在单机上运行,WebDriver则提供了远程操作的功能selenium基本使用selenium运行需要什么主要包括三部分:selenium selenium,浏览器driver,浏览器selenium selenium是一组通用的接口,而不同的浏览器提供其自身的driver(大部分是官方的),浏览器则被模拟控制操作的终端.安装pip install selenium --upgradeapt-get install chromium-browserwget http://chromedriver.storage.googleapis.com/2.10/chromedriver_linux`getconf LONG_BIT`.zipunzip chromedriver_linux32.zipcp chromedriver /usr/local/sharechmod +x /usr/local/share/chromedriverln -s /usr/local/share/chromedriver /usr/local/bin/chromedriverln -s /usr/bin/chromedriver /usr/local/share/chromedriver简单的使用from selenium import webdriverdriver = webdriver.Chrome("/usr/local/bin/chromedriver")driver.get("http://mail.sina.net");print(driver.title)API使用可参考/usr/local/lib/python2.7/dist-packages/seleniumChrome WebDriverselenium.webdriver.chrome.webdriver.WebDriver(executable_path="chromedriver", port=0, chrome_options=None, service_args=None, desired_capabilities=None, service_log_path=None)ChromeOptions可以通过ChromeDriver session配置ChromeDriver sessionChromeDriverconvenient methods for setting ChromeDriver-specific capabilitiesfrom selenium.webdriver.chrome.options import Optionschrome_options = Options()chrome_options.add_argument("--disable-extensions")chrome_options.add_argument("--disable-logging")chrome_options.add_experimental_option("prefs", {"download.default_directory":"/tmp"})chrome_options.binary_location="/usr/bin/chromium-browser"driver = webdriver.Chrome(chrome_options=chrome_options)直接使用DesiredCapabilitiesChromeOptions是构建在DesiredCapabilities之上的,为了使用DesiredCapabilities,必须知道capability的Key/value对.chrome_options = Options()capabilities={}capabilities["platform"] = "WINDOWS"capabilities["version"] = "10"capabilities.update(chrome_options.to_capabilities())driver = webdriver.Chrome(desired_capabilities=capabilities)chromedriver运行方式The ChromeDriver class不断的创建实例,会浪费很多的时间,可以通过两个方式解决.使用ChromeDriverServiceimport selenium.webdriver.chrome.service as serviceservice = service.Service("/usr/bin/chromedrive")service.start()capabilities = { }driver = webdriver.Remote(service.service_url, capabilities)driver.get("http://mail.sina.net");print(driver.title)开启单独的ChromeDriver服务./chromedriverdriver = webdriver.Remote("http://127.0.0.1:9515", DesiredCapabilities.CHROME)driver.get("http://mail.sina.net");RemoteWebDriverServerThe RemoteWebDriver is composed of two pieces: a client and a server. The client is your WebDriver test and the server is simply a Java servlet, which can be hosted in any modern JEE app server. The server will always run on the machine with the browser you want to test.wget http://selenium-release.storage.googleapis.com/2.53/selenium-server-standalone-2.53.0.jarjava -jar selenium-server-standalone-2.53.0.jarfrom selenium import webdriverfrom selenium.webdriver.common.desired_capabilities import DesiredCapabilitiesdriver = webdriver.Remote( command_executor="http://127.0.0.1:4444/wd/hub",desdesired_capabilities=DesiredCapabilities.CHROME)driver.get("http://mail.sina.net");

从零开始学python爬虫(八):selenium提取数据和其他使用方法

知识点: 知识点:了解 driver对象的常用属性和方法 注意:最新版本的selenium已经取消了这种格式,取而代之的是: 你要先导入: 然后再: 知识点:掌握 driver对象定位标签元素获取标签对象的方法 代码实现,如下,获取腾讯新闻首页的新闻标签的内容。 知识点:掌握 元素对象的操作方法 参考代码示例: 知识点:掌握 selenium控制标签页的切换 知识点:掌握 selenium控制frame标签的切换 知识点:掌握 利用selenium获取cookie的方法 知识点:掌握 selenium控制浏览器执行js代码的方法 知识点:掌握 手动实现页面等待 知识点:掌握 selenium开启无界面模式 知识点:了解 selenium使用代理ip 知识点:了解 selenium替换user-agent

如何在Python环境下安装Selenium+HeadlessChrome

这篇文章主要介绍了如何在Python环境下安装Selenium+Headless Chrome,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧最近在学习爬虫,蓦然发现:Python 3.6.4 (default, Jan 5 2018, 02:35:40) [GCC 7.2.1 20171224] on linuxType "help", "copyright", "credits" or "license" for more information.>>> from selenium import webdriver>>> driver=webdriver.PhantomJS()/usr/lib/python3.6/site-packages/selenium/webdriver/phantomjs/webdriver.py:49: UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead warnings.warn("Selenium support for PhantomJS has been deprecated, please use headless "简单地说,意思就是新版本的Selenium不再支持PhantomJS了,请使用Chrome或Firefox的无头版本来替代。懵逼??现在的好多教程都是基于PhantomJS的啊,没办法,由于我用的是chrome浏览器,就分享一下关于Headless Chrome的安装方法吧。1.运行cmd或Ctrl + R进入命令行2.进入python3.输入代码块代码块语法遵循标准markdown代码,例如:from selenium import webdriverfrom selenium.webdriver.chrome.options import Optionschrome_options = Options()chrome_options.add_argument("--headless")chrome_options.add_argument("--disable-gpu")driver = webdriver.Chrome(chrome_options=chrome_options)driver.get("http://www.baidu.com")好的,现在就将Headless Chrome安装好了。

python selenium设置浏览器参数

设置浏览器参数 为了避免每次运行程序都打开一个窗口,我们也可以设置无窗口访问,只需添加浏览器参数即可: from selenium import webdriver from selenium.webdriver.chrome.options import Options url = " https://www.baidu.com/" chrome_options = Options() chrome_options.add_argument("--headless") chrome_options.add_argument("lang=zh_CN.utf-8") UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36" chrome_options.add_argument("User-Agent=" + UserAgent) driver = webdriver.Chrome(chrome_options=chrome_options) driver.maximize_window() driver.minimize_window() driver.get(url) print(driver.title) 常用参数 启动就最大化--start-maximized 指定用户文件夹 User Data 路径,可以把书签这样的用户数据保存在系统分区以外的分区–-user-data-dir=”[PATH]” 指定缓存Cache路径–-disk-cache-dir=“[PATH]” 指定Cache大小,单位Byte–-disk-cache-size=100 隐身模式启动–-incognito 禁用Javascript–-disable-javascript# 禁止加载所有插件,可以增加速度--disable-plugins 禁用JavaScript--disable-javascript 禁用弹出拦截--disable-popup-blocking 禁用插件--disable-plugins 禁用图像--disable-images 设置代理chrome_options.add_argument("--proxy-server=http://{ip}:{port}") #http://127.1.1.10:8080

Python selenium 三种等待方式

很多人在群里问,这个下拉框定位不到、那个弹出框定位不到各种定位不到,其实大多数情况下就是两种问题:1 有frame,2 没有加等待。殊不知,你的代码运行速度是什么量级的,而浏览器加载渲染速度又是什么量级的,就好比闪电侠和凹凸曼约好去打怪兽,然后闪电侠打完回来之后问凹凸曼你为啥还在穿鞋没出门?凹凸曼分分中内心一万只羊驼飞过,欺负哥速度慢,哥不跟你玩了,抛个异常撂挑子了。那么怎么才能照顾到凹凸曼缓慢的加载速度呢?只有一个办法,那就是等喽。说到等,又有三种等法,且听博主一一道来:1. 强制等待第一种也是最简单粗暴的一种办法就是强制等待sleep(xx),强制让闪电侠等xx时间,不管凹凸曼能不能跟上速度,还是已经提前到了,都必须等xx时间。看代码:?12345678# -*- coding: utf-8 -*-fromseleniumimportwebdriverfromtimeimportsleepdriver=webdriver.Firefox()driver.get(sleep(3)# 强制等待3秒再执行下一步printdriver.current_urldriver.quit()这种叫强制等待,不管你浏览器是否加载完了,程序都得等待3秒,3秒一到,继续执行下面的代码,作为调试很有用,有时候也可以在代码里这样等待,不过不建议总用这种等待方式,太死板,严重影响程序执行速度。2. 隐性等待第二种办法叫隐性等待,implicitly_wait(xx),隐性等待的意义是:闪电侠和凹凸曼约定好,不论闪电侠去哪儿,都要等凹凸曼xx秒,如果凹凸曼在这段时间内来了,则俩人立即出发去打怪兽,如果凹凸曼在规定时间内没到,则闪电侠自己去,那自然就等着凹凸曼给你抛异常吧。看代码:?1234567# -*- coding: utf-8 -*-fromseleniumimportwebdriverdriver=webdriver.Firefox()

python34怎么离线安装selenium

selenium 为UI自动化测试工具,主要用来进行UI自动化测试,缩减测试员工的测试时间,其主要安装方式有两种,第一种为在线安装;第二种为离线安装(内网缺网环境的安装,并进行比对)第一种,在线安装从我的网盘中下载python 2.7.9的版本,下一步到底即可,可以在c盘中生成一个C:Python27的文件夹。此时python版本已经安装好,我们需要在线安装selenium的版本,我们进入到C:Python27目录下,可以看到Scripts的文件夹,点开后进去我们可以看到pip.exe的文件,如果没有,则需要网上下载安装,如果有,则直接的在dos命令下执行命令,如下图所示,则为执行成功了。此时,我们打开eclipse,在其中输入from selnium import webdriver,安装ctrl,鼠标左击则打开了webdriver的代码,如下图所示可以看到eclipse已经加载到webdriver的功能,已经安装完毕进行下面的离线之旅。第二种,离线安装首先,我们安装python的目录,还是默认的C:Python27,下载我的网盘中的tar包,解压文件,我们可以看到里面的分支结构,如下,把该内容复制到C:Python27内,setup.py 和python.exe在同一个目录下进入到C:Python下运行 python setup.py install,则可以看到运行成功,我们再次打开eclipse执行上述的验证操作,可以听到“叮”的一声,可以肯定的是没有安装成功,调用的时候失败了其实并没有失败,我们没有将selenium的环境变量配置到eclipse中,我们打开eclipse,windows-Preferences-PyDev-Interpreters-Python Interpreters-Python Interpreters.在其中添加selenium的egg文件,如下图所示然后我们在eclipse中就可以打开from selenium import webdriver 了

python中selenium控制浏览器尺寸

之前在自己电脑上写的代码测试运行非常完美,于是特别转移到了单独的一台笔记本上运行。 运行了几天之后发现有问题。selenium在抓取数据的时候莫名其妙的有一部分数据抓取不到。 分析代码呀什么的都没问题呀,奇了怪了。 三个td 前两个td里面的内容抓取的一点问题都没有,但是抓取第三个的时候就总是出错,用我自己的电脑测试就是好的。 我一度怀疑是不是我的笔记本电脑有什么驱动或者硬件导致的问题。 前两个能抓取到,shuliang抓取不到。如果我把shuliang里面的td[5]换成td[4]就是抓取他前面那一个元素,也是没问题的。但是我换成td[6]抓取他后面的元素就不行。 最后我发现有可能是selenium打开的chrome浏览器大小的问题,因为浏览器里面打开的页面正好只能显示到td[4],第5列显示不出来。 于是加一行代码 控制一下打开浏览器的大小,测试成功。shuliang成功抓取到了数据。 看来selenium真的是不是所见即所得的抓取模式,浏览器里面遮住的部分,他就抓不到了。 这可能也是很多selenium写好的代码换到别的电脑上执行就会出错的一个原因之一吧。 今天的分享记录就到这了。

从零开始学Python-使用Selenium抓取动态网页数据

您可以按照以下步骤来配置八爪鱼采集器进行数据采集:1. 打开八爪鱼采集器,并创建一个新的采集任务。2. 在任务设置中,输入要采集的网址作为采集的起始网址。3. 配置采集规则。可以使用智能识别功能,让八爪鱼自动识别页面的数据结构,或者手动设置采集规则。4. 如果手动设置采集规则,可以通过鼠标选择页面上的数据元素,并设置相应的采集规则,以确保正确获取所需的数据。5. 设置翻页规则。如果需要采集多页数据,可以设置八爪鱼采集器自动翻页,以获取更多的数据。6. 运行采集任务。确认设置无误后,可以启动采集任务,让八爪鱼开始采集数据。7. 等待采集完成。八爪鱼将根据设置的规则自动抓取页面上的数据,并将其保存到本地或导出到指定的数据库等。八爪鱼采集器是一款功能全面、操作简单、适用范围广泛的互联网数据采集器,可以帮助您轻松解决数据采集问题。了解更多八爪鱼采集器的功能和使用方法,请前往官网教程与帮助了解更多详情。

如何在python中使用selenium

1、下载Python2.7版本,默认运行安装即可; 2、安装完成之后,设置Python环境变量C:Python27(操作步骤: 电脑->属性->高级->环境变量->系统变量中的PATH为:变量值: ;C:Python27 ) 3、在python的官方网站上可以找到SetupTools的下载,解压安装安装即可; 4、当安装SetupTools之后,就可以在python安装目录下看到Script目录, 5、同样在变量中加入 path:C:Python27Scripts, 6、打开cmd命令行,将目录切换到C:Python27Scripts下,输入命令“easy_install pip“安装pip; 7、安装成功pip之后,执行pip install -U selenium 进行下载安装最新selenium的版本。

如何搭建python+selenium开发环境教程讲解

这篇文章主要为大家详细介绍了python+selenium开发环境搭建的图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下web 调试工具介绍和开发环境搭建python与selenium开发环境搭建:一、下载python软件:https://www.python.org/下载完后,进行安装,安装成功后,打开IDLE(Python 3.6.2),如下图:如上图在里面输入print("Hello Wrod!")按回车,出现Hello Wrod!,说明已经把IDLE装好了,下面打开dos命令窗口输入Python按回车。如下图:出现python版本号等信息说明python已经安装成功。如果出现错误信息,则需要配置环境变量:在环境系统变量Path中添加python的安装目录,比如:C:Python35Scripts;C:Python35,这个是安装在C盘的目录。二、安装pip:https://pypi.python.org/pypi/pip下载完成后解压,打开dos命令窗口进入刚才解压后的文件夹里面(如:D:pip-9.0.1,这个是解压后的pip文件夹)输入如下信息:输入如下信息后按回车键,进行安装,安装完后显示安装目录为:C:Python35Libsite-packagespip-9.0.1-py3.5.egg再dos命令窗口输入:pip.exe按回车,如下图:然后配置环境变量,在环境系统变量Path中添加C:Python35Libsite-packagespip-9.0.1-py3.5.egg(这个是安装在C盘的目录)。再次打开打开IDLE(Python 3.6.2)输入import selenium按回车键,如下图:如果没有找到selenium可以使用pip install -U selenium命令安装下面使用selenium打开firefox浏览器:首先到https://github.com/mozilla/geckodriver/releases下载geckodriver.exe,下载完后将该exe放入python安装根目录下(与python.exe同一目录)在IDLE(Python 3.6.2)中输入import selenium按回车,再入from selenium import webdriver按回车,最后输入browser=webdriver.Firefox()按回车键就能成功调用firefox浏览器。如图:firefox前端工具介绍:1.fireBug:FireFox浏览器下的一套开发类插件2.作用:查看页面上的元素,从而根据其属性进行定位如何安装fireBug,打开FireFox浏览器照以下图片上的操作进行安装即可:前端技术介绍:1.html:网页的基础,是一种标记语言,显示数据;2.JS:前端脚本语言,解释型语言,在页面中添加交互行为;3.xml:扩展标记语言,用来传输和存储数据4.css:层叠样式表,用来表现HTML或XML等文件样式下面使用selenium打开chrome浏览器(安装Chrome浏览器webdriver):1.安装chrome浏览器;2.下载chromedriver.exe;3.将下载的chromedriver.exe文件放到安装Chrome浏览器目录下面(如:C:UsersAdministratorAppDataLocalGoogleChromeApplication)4.配置环境变量,将C:UsersAdministratorAppDataLocalGoogleChromeApplication添加到环境系统变量Path中。在IDLE(Python 3.6.2)中输入import selenium按回车,再入from selenium import webdriver按回车,最后输入b=webdriver.Chrome()按回车键就能成功调用chrome浏览器。如图:

如何在python中使用selenium

下载python版本的python包,放入到python的lib下面,然后下载selenium的jar。启动使用Java -jar selenium-server-standalone-2.0b3.jar测试例子:from selenium import webdriverfrom selenium.common.exceptions import NoSuchElementExceptionfrom selenium.webdriver.common.keys import Keysimport timebrowser = webdriver.Firefox() # Get local session of firefoxbrowser.get("") # Load pageassert "Yahoo!" in browser.titleelem = browser.find_element_by_name("p") # Find the query boxelem.send_keys("seleniumhq" + Keys.RETURN)time.sleep(0.2) # Let the page load, will be added to the APItry:browser.find_element_by_xpath("//a[contains(@href,"")]")except NoSuchElementException:assert 0, "can"t find seleniumhq"browser.close()运行的结果是打开雅虎浏览器搜素seleniuhq,然后查找Selenium (SeleniumHQ) 是 thoughtworks公司的一个集成测试的强大工具。一、Selenium 的版本Selenium 现在存在2个版本,一个叫 selenium-core, 一个叫selenium-rc 。selenium-core 是使用HTML的方式来编写测试脚本,你也可以使用 Selenium-IDE来录制脚本,但是目前Selenium-IDE只有 FireFox 版本。Selenium-RC 是 selenium-remote control 缩写,是使用具体的语言来编写测试类。selenium-rc 支持的语言非常多,这里我们着重关注java的方式。这里讲的也主要是 selenium-rc,因为个人还是喜欢这种方式.下图是Selenium IDE的运行界面截图:

python selenium 怎么定位form里边的元素

xpath定位,你用chrome浏览器,在页面上右键-》审查元素,然后会弹出开发者工具,里面会显示你选中部分的页面源码并高亮你选择的地方,在源码里右键,选择copy xpath 用这个定位

python selenium模块使用出错,这个怎么改

1. selenium 3.x开始,webdriver/firefox/webdriver.py的__init__中,executable_path="geckodriver";而2.x是executable_path="wires"2. firefox 47以上版本,需要下载第三方driver,即geckodriver;在http://docs.seleniumhq.org/download/的Third Party Drivers, Bindings, and Plugins下面找到Mozilla GeckoDriver,下载到任意电脑任意目录,解压后将该路径加入到PC的path(针对windows)即可。

如何用python和selenium写自动化脚本语言

一开始,基本上很多人都是用selenium IDE录制脚本开始的,我也是!有一本书写得很不错:selenium初学者指南!So,从录制回放开始我的selenium,而在这个过程中,不断地去补充我的html css知识,熟悉selenium的api!慢慢地,发现录制的脚本在回放的时候经常报错,通过检查发现,是定位上的错误,导致这种定位的错误的最大原因是系统前端采用了某种框架,如tigerUI,exj....所以HTML里面的标签很多都是动态的,比如id,class,name!这对selenium操作定位的元素而进行自动化来说是致命伤!所以,开始自己写定位信息,这已经是必须的了!从而学习了xpth和css选择器,掌握了更加有效,快速和稳定地定位页面上的元素(定位的时候难免会碰到有iframe,这就得先切换到iframe中再进行定位了)!也就是,在selenium IDE上写脚本!信心满满地在selenium IDE上写了长长地一段脚本,并且反复跑都能成功!总算尝到了一点点幸福的滋味!然后呢,问题来了,当我要修改和扩展这段的脚本的时候,才发现这效率是相当地低!一句句查!一句句改!多么痛的领悟!另外,selenium IDE 默认启动的是火狐,在使用selenium RC 启动 IE 进行跑脚本时浏览器总是会报错!各种搞不定,各种不淡定!决定放弃使用IDE!selenium有一个强大之处就是支持多种语方:java,C#,python等等,并且可以把录制的脚本转换成代码!我用的是java,果断走起!不用说,当然是把脚本转为java代码了,在E www.hbbz08.com clipse中重新开始搞!选择一个测试框架:有Junit和TestNg两个选择,公司用的是junit,所以,不用多说,我就用junit验证selenium脚本的运行结果!并且,Junit和TestNG都可以生成比较直观的测试报告!写好一些代码,会看到整段代码中密密麻麻充斥着基本相同的代码:开始封装代码!把常用到API封装起来!封装好之后代码看着就舒服多了!接下来,是不是也应该把代码中的定位信息用一个专门的文件放起来,再去读取里面的定位信息,这样,维护代码和维护定位信息就放在了两个地方,不用老是扎在代码和定位路径中,简单地分一下层!果断尝试!

Python selenium 如何循环点击标签

解决办法:使用selenium.webdriver.remote.webelement.WebElement提供的get_attribute方法。通过get_attribute拿到该a标签的各种属性,通过判断找到符合要求的元素进行点击。get_attribute("href") 得到a标签对应的目标页面的URL,对URL进行判断就可以了解到该页面是否站内页面。我们可以知道,如果是站内页面的话这个属性一般会是一个相对路径,或者包含了本站域名,但如果是站外页面的话,那它一定是包含了“http”的一个url。get_attribute("target")如果target不是"_blank"的话,可以判断该页面是在本窗口跳转的。

pythonwatchdog打包后失效

1、首先在打包应用程序之前,请确保Watchdog库已正确安装并可以在您的开发环境中正常工作。2、其次手动包含Watchdog库文件,检查依赖项。3、最后禁用优化选项即可打包成功。

Python正则表示式的几种匹配用法

Python正则表示式的几种匹配用法 下面列出: 1.测试正则表示式是否匹配字串的全部或部分regex=ur"" #正则表示式 if re.search(regex, subject): do_something()else: do_anotherthing() 2.测试正则表示式是否匹配整个字串 regex=ur"/Z" #正则表示式末尾以/Z结束 if re.match(regex, subject): do_something()else: do_anotherthing() 3.建立一个匹配物件,然后通过该物件获得匹配细节(Create an object with details about how the regex matches (part of) a string) regex=ur"" #正则表示式 match = re.search(regex, subject)if match: # match start: match.start() # match end (exclusive): atch.end() # matched text: match.group() do_something()else: do_anotherthing() 4.获取正则表示式所匹配的子串(Get the part of a string matched by the regex) regex=ur"" #正则表示式 match = re.search(regex, subject)if match: result = match.group()else: result ="" 5. 获取捕获组所匹配的子串(Get the part of a string matched by a capturing group) regex=ur"" #正则表示式 match = re.search(regex, subject)if match: result = match.group(1)else: result ="" 6. 获取有名组所匹配的子串(Get the part of a string matched by a named group) regex=ur"" #正则表示式 match = re.search(regex, subject)if match:result = match.group"groupname")else:result = "" 7. 将字串中所有匹配的子串放入阵列中(Get an array of all regex matches in a string) result = re.findall(regex, subject) 8.遍历所有匹配的子串(Iterate over all matches in a string) for match in re.finditer(r"<(.*?)/s*.*?1>", subject) # match start: match.start() # match end (exclusive): atch.end() # matched text: match.group() 9.通过正则表示式字串建立一个正则表示式物件(Create an object to use the same regex for many operations) reobj = re.pile(regex) 10.用法1的正则表示式物件版本(use regex object for if/else branch whether (part of) a string can be matched) reobj = re.pile(regex)if reobj.search(subject): do_something()else: do_anotherthing() 11.用法2的正则表示式物件版本(use regex object for if/else branch whether a string can be matched entirely) reobj = re.pile(r"/Z") #正则表示式末尾以/Z 结束 if reobj.match(subject): do_something()else: do_anotherthing() 12.建立一个正则表示式物件,然后通过该物件获得匹配细节(Create an object with details about how the regex object matches (part of) a string) reobj = re.pile(regex) match = reobj.search(subject)if match: # match start: match.start() # match end (exclusive): atch.end() # matched text: match.group() do_something()else: do_anotherthing() 13.用正则表示式物件获取匹配子串(Use regex object to get the part of a string matched by the regex) reobj = re.pile(regex) match = reobj.search(subject)if match: result = match.group()else: result ="" 14.用正则表示式物件获取捕获组所匹配的子串(Use regex object to get the part of a string matched by a capturing group) reobj = re.pile(regex) match = reobj.search(subject)if match: result = match.group(1)else: result ="" 15.用正则表示式物件获取有名组所匹配的子串(Use regex object to get the part of a string matched by a named group) reobj = re.pile(regex) match = reobj.search(subject)if match: result = match.group("groupname")else: result ="" 16.用正则表示式物件获取所有匹配子串并放入阵列(Use regex object to get an array of all regex matches in a string) reobj = re.pile(regex) result = reobj.findall(subject) 17.通过正则表示式物件遍历所有匹配子串(Use regex object to iterate over all matches in a string) reobj = re.pile(regex)for match in reobj.finditer(subject): # match start: match.start() # match end (exclusive): match.end() # matched text: match.group()字串替换 1.替换所有匹配的子串 #用newstring替换subject中所有与正则表示式regex匹配的子串 result = re.sub(regex, newstring, subject) 2.替换所有匹配的子串(使用正则表示式物件) reobj = re.pile(regex) result = reobj.sub(newstring, subject) 字串拆分 1.字串拆分 result = re.split(regex, subject) 2.字串拆分(使用正则表示式物件) reobj = re.pile(regex) result = reobj.split(subject) 两种: 1. m = re.match(r"匹配条件", "待匹配内容") 2. pattern = re.pile(r"匹配条件")m = pattern.match("待匹配内容") 正则表示式 简单的匹配 (=([0-9.]+[,]*)+) 正则表示式的具体用法 这个吧最好找本书看看,一两句话也说不明白,做验证啊什么的用它就行 正则表示式 匹配问好星号 在什么语言中用的? 一般都是前面加个“”反斜杠即 ? 在java中用字串是特殊字元所以String reg="\?"这样可以匹配一个 “?”问号. java 正则表示式 abcded 匹配b出来 public class FillUtil { public static void main(String[] args){ String item = "a:b: c:d:e"; Pattern pattern = Pattern.pile("\w:\w?"); Matcher matcher = pattern.matcher(item); while(matcher.find()){ String find = matcher.group(); String[] finds = find.split(":"); for(String each:finds){ System.out.println(each); } System.out.println("_"); } } } 以下正则表示式有匹配吗? 应该没有吧,把sS都排出了,那不就没东西了吗? 注意,[]中的^表示反义。 能匹配以下正则表示式的内容? 什么都不能匹配。 用python正则表示式匹配java方法定义怎么写 1 2 3 4 5 6 7 8 9 10 >>> str_ = "a100b30 :aa./aaaa. " # "str"是内建方法,不宜做变数名 >>> import re >>> re_str = ".* (.*) " >>> re_pat = re.pile(re_str) >>> search_ret = re_pat.search(str_) >>> if search_ret: search_ret.groups()

用python发邮件给gmail用户,被gmail当成spam退回

一般需要的你邮箱域名真实存在,如果你是假的域名,或者域名指向的不是你发邮件的服务器,就可能被认为是垃圾邮件。如果解决了您的问题请采纳!如果未解决请继续追问

python中的import指的是什么

Python中的import语句是用来调用模块的。一、module通常模块为一个文件,直接使用import来导入就好了。可以作为module的文件类型有".py"、".pyo"、".pyc"、".pyd"、".so"、".dll"。二、package通常包总是一个目录,可以使用import导入包,或者from + import来导入包中的部分模块。包目录下为首的一个文件便是 __init__.py。然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。模块可以使用import语句将一个源代码文件作为模块导入.例如:# file : spam.pya = 37 # 一个变量def foo: # 一个函数 print "I"m foo"class bar: # 一个类 def grok(self): print "I"m bar.grok"b = bar() # 创建一个实例使用import spam 语句就可以将这个文件作为模块导入。系统在导入模块时,要做以下三件事: 1.为源代码文件中定义的对象创建一个名字空间,通过这个名字空间可以访问到模块中定义的函数及变量。2.在新创建的名字空间里执行源代码文件.3.创建一个名为源代码文件的对象,该对象引用模块的名字空间,这样就可以通过这个对象访问模块中的函数及变量,如: import spam # 导入并运行模块 spam print spam.a # 访问模块 spam 的属性 spam.foo() c = spam.bar() ...用逗号分割模块名称就可以同时导入多个模块: import socket, os, regex模块导入时可以使用 as 关键字来改变模块的引用对象名字:import os as systemimport socket as net, thread as threadssystem.chdir("..")net.gethostname()使用from语句可以将模块中的对象直接导入到当前的名字空间. from语句不创建一个到模块名字空间的引用对象,而是把被导入模块的一个或多个对象直接放入当前的名字空间:from socket import gethostname # 将gethostname放如当前名字空间print gethostname() # 直接调用socket.gethostname() # 引发异常NameError: socketfrom语句支持逗号分割的对象,也可以使用星号(*)代表模块中除下划线开头的所有对象: from socket import gethostname, socketfrom socket import * # 载入所有对象到当前名字空间

c:python25> python spam.py为什么冒号处标红 并且提示SyntaxError: invalid syntax

spam.py 是特殊的模块名,用来搜索其他模块路径的,可以参考官方文档 https://docs.python.org/3/tutorial/modules.html 和 https://stackoverflow.com/questions/21273017/beginner-python-spam-py

Python 运行报错NameError出现原因,怎么解决

  python新手常见的报错提示  在运行或编写一个程序时常会遇到错误异常,这时Python会给你一个错误提示类名,告诉出现了什么样的问题(Python是面向对象语言,所以程序抛出的异常也是类)。能很好的理解这些错误提示类名所代表的意思,可以帮助你在最快的时间内找到问题所在,从而解决程序上的问题是非常有帮助的。  搜集了一些python最重要的内建异常类名,并做了简单的介绍:  AttributeError:属性错误,特性引用和赋值失败时会引发属性错误  NameError:试图访问的变量名不存在  SyntaxError:语法错误,代码形式错误  Exception:所有异常的基类,因为所有python异常类都是基类Exception的其中一员,异常都是从基类Exception继承的,并且都在exceptions模块中定义。  IOError:一般常见于打开不存在文件时会引发IOError错误,也可以解理为输出输入错误  KeyError:使用了映射中不存在的关键字(键)时引发的关键字错误  IndexError:索引错误,使用的索引不存在,常索引超出序列范围,什么是索引  TypeError:类型错误,内建操作或是函数应于在了错误类型的对象时会引发类型错误  ZeroDivisonError:除数为0,在用除法操作时,第二个参数为0时引发了该错误  ValueError:值错误,传给对象的参数类型不正确,像是给int()函数传入了字符串数据类型的参数。  1)忘记在 if , elif, else , for , while , class ,def 声明末尾添加:(导致 “SyntaxError :invalid syntax”)  该错误将发生在类似如下代码中:  if spam == 42  print("Hello!")  2)使用 = 而不是 ==(导致“SyntaxError: invalid syntax”)  = 是赋值操作符而 == 是等于比较操作。该错误发生在如下代码中:  if spam = 42:  print("Hello!")  3)错误的使用缩进量。(导致“IndentationError:unexpected indent”、“IndentationError:unindent does not match any outer indetation level”以及“IndentationError:expected an indented block”)  记住缩进增加只用在以:结束的语句之后,而之后必须恢复到之前的缩进格式。该错误发生在如下代码中:  print("Hello!")  print("Howdy!")  或者:  if spam == 42:  print("Hello!")  print("Howdy!")  或者:  if spam == 42:  print("Hello!")  4)在 for 循环语句中忘记调用 len() (导致“TypeError: "list" object cannot be interpreted as aninteger”)  通常你想要通过索引来迭代一个list或者string的元素,这需要调用 range() 函数。要记得返回len 值而不是返回这个列表。  该错误发生在如下代码中:  spam = ["cat","dog", "mouse"]  for i inrange(spam):  print(spam[i])  5)尝试修改string的值(导致“TypeError: "str" object does not support itemassignment”)  string是一种不可变的数据类型,该错误发生在如下代码中:  spam = "I have apet cat."  spam[13] = "r"  print(spam)  而你实际想要这样做:  spam = "I have apet cat."  spam = spam[:13] +"r" + spam[14:]  print(spam)  6)尝试连接非字符串值与字符串(导致 “TypeError: Can"t convert "int" object to strimplicitly”)  该错误发生在如下代码中:  numEggs = 12  print("I have " +numEggs + " eggs.")  而你实际想要这样做:  numEggs = 12  print("I have " +str(numEggs) + " eggs.")  或者:  numEggs = 12  print("I have %seggs." % (numEggs))  7)在字符串首尾忘记加引号(导致“SyntaxError: EOL while scanning string literal”)  该错误发生在如下代码中:  print(Hello!")  或者:  print("Hello!)  或者:  myName = "Al"  print("My name is "+ myName + . How are you?")  8)变量或者函数名拼写错误(导致“NameError: name "fooba" is not defined”)  该错误发生在如下代码中:  foobar = "Al"  print("My name is "+ fooba)  或者:  spam = ruond(4.2)  或者:  spam = Round(4.2)  9)方法名拼写错误(导致 “AttributeError: "str" object has no attribute"lowerr"”)  该错误发生在如下代码中:  spam = "THIS IS INLOWERCASE."  spam =spam.lowerr()  10)引用超过list最大索引(导致“IndexError: list index out of range”)  该错误发生在如下代码中:  spam = ["cat","dog", "mouse"]  print(spam[6])  11)使用不存在的字典键值(导致“KeyError:‘spam"”)  该错误发生在如下代码中:  spam = {"cat":"Zophie", "dog": "Basil", "mouse": "Whiskers"}  print("The name ofmy pet zebra is " + spam["zebra"])  12)尝试使用Python关键字作为变量名(导致“SyntaxError:invalid syntax”)  Python关键不能用作变量名,该错误发生在如下代码中:  class = "algebra"  Python3的关键字有:and, as, assert, break, class, continue, def, del, elif,else, except, False, finally, for, from, global, if, import, in, is, lambda,None, nonlocal, not, or, pass, raise, return, True, try, while, with, yield  13)在一个定义新变量中使用增值操作符(导致“NameError: name "foobar" is not defined”)  不要在声明变量时使用0或者空字符串作为初始值,这样使用自增操作符的一句spam += 1等于spam = spam + 1,这意味着spam需要指定一个有效的初始值。  该错误发生在如下代码中:  spam = 0  spam += 42  eggs += 42  14)在定义局部变量前在函数中使用局部变量(此时有与局部变量同名的全局变量存在)(导致“UnboundLocalError: local variable "foobar" referencedbefore assignment”)  在函数中使用局部变来那个而同时又存在同名全局变量时是很复杂的,使用规则是:如果在函数中定义了任何东西,如果它只是在函数中使用那它就是局部的,反之就是全局变量。  这意味着你不能在定义它之前把它当全局变量在函数中使用。  该错误发生在如下代码中:  someVar = 42  def myFunction():  print(someVar)  someVar = 100  myFunction()  15)尝试使用 range()创建整数列表(导致“TypeError: "range" object does not support itemassignment”)  有时你想要得到一个有序的整数列表,所以 range() 看上去是生成此列表的不错方式。然而,你需要记住 range() 返回的是 “range object”,而不是实际的 list 值。  该错误发生在如下代码中:  spam = range(10)  spam[4] = -1  也许这才是你想做:  spam =list(range(10))  spam[4] = -1  (注意:在 Python 2 中 spam = range(10) 是能行的,因为在 Python 2 中 range() 返回的是list值,但是在 Python 3 中就会产生以上错误)  16)不错在 ++ 或者 -- 自增自减操作符。(导致“SyntaxError: invalid syntax”)  如果你习惯于例如 C++ , Java, PHP 等其他的语言,也许你会想要尝试使用 ++ 或者 -- 自增自减一个变量。在Python中是没有这样的操作符的。  该错误发生在如下代码中:  spam = 1  spam++  也许这才是你想做的:  spam = 1  spam += 1  17)忘记为方法的第一个参数添加self参数(导致“TypeError: myMethod() takes no arguments (1 given)”)  该错误发生在如下代码中:  class Foo():  def myMethod():  print("Hello!")  a = Foo()  a.myMethod()

python 出现这个错误是什么原因

搜集了一些python最重要的内建异常类名,并做了简单的介绍:AttributeError:属性错误,特性引用和赋值失败时会引发属性错误NameError:试图访问的变量名不存在SyntaxError:语法错误,代码形式错误Exception:所有异常的基类,因为所有python异常类都是基类Exception的其中一员,异常都是从基类Exception继承的,并且都在exceptions模块中定义。IOError:一般常见于打开不存在文件时会引发IOError错误,也可以解理为输出输入错误KeyError:使用了映射中不存在的关键字(键)时引发的关键字错误IndexError:索引错误,使用的索引不存在,常索引超出序列范围,什么是索引TypeError:类型错误,内建操作或是函数应于在了错误类型的对象时会引发类型错误ZeroDivisonError:除数为0,在用除法操作时,第二个参数为0时引发了该错误ValueError:值错误,传给对象的参数类型不正确,像是给int()函数传入了字符串数据类型的参数Python是面向对象语言,所以程序抛出的异常也是类

python 这个报错怎么解决

可以在打开时:with open("sss.txt","r",encodeing="utf-8")as df: line = df.read()

python中的multiply函数怎么用

numpy.multiplynumpy.multiply(x1, x2[, out]) = <ufunc "multiply">Multiply arguments element-wise.Parameters:x1, x2 : array_likeInput arrays to be multiplied.Returns:y : ndarrayThe product of x1 and x2, element-wise. Returns a scalar ifboth x1 and x2 are scalars.NotesEquivalent to x1 * x2 in terms of array broadcasting.Examples>>>>>> np.multiply(2.0, 4.0)8.0>>>>>> x1 = np.arange(9.0).reshape((3, 3))>>> x2 = np.arange(3.0)>>> np.multiply(x1, x2)array([[ 0., 1., 4.], [ 0., 4., 10.], [ 0., 7., 16.]])

现在学好python能干什么?

从一定的角度上来说,Python是非常不错的编程语言,适合零基础,对初学者十分友好,可以广泛应用在众多领域。几乎所有大中型互联网企业都在使用Python完成各种各样的任务。对于程序员来说,Python就像胶水一样,可以更好的帮助我们完成编程工作。Python语言拥有众多应用领域:1、web应用开发:Python经常用于web应用开发,虽然PHP、JS 依然是 Web 开发的主流语言,但是Python一直处于上升阶段。2、自动化运维:Python 是标准的系统组件,大多数 Linux 发行版以及 NetBSD、OpenBSD 和 Mac OS X 都集成了 Python,可以直接在终端运行Python。3、网络爬虫:Python很早就是用来撰写爬虫的语言,很多大型的搜索引擎公司就是使用Python进行编写爬虫的。4、科学计算:NASA 就大量使用 Python 进行各种复杂的科学运算。Python 在数据分析、可视化方面有相当完善和优秀的库,可以更好满足Python程序员编写科学计算程序。5、游戏开发:Python可以用来编写游戏逻辑,功能简单,体积小,同时Python支持更多的特性和数据类型。

python有什么框架

python有什么框架?让我们一起了解一下吧!python框架有很多,下面介绍几个常见的框架:1、DjangoDjango是比较出名的Python框架,它最出名的是其全自动化的管理后台,只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构、以及全功能的管理后台。2、FlaskFlask是一个用Python编写的轻量级Web应用框架,基于Werkzeug WSGI工具箱和Jinja2模板引擎。Flask也被称为“microframework”,因为它使用简单的核心,用extension增加其他功能。3、ScrapyScrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。4、TornadoTornado是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架有着明显的区别:它是非阻塞式服务器,而且速度相当快。5、Web2pyweb2py是一个为Python语言提供的全功能Web应用框架,旨在敏捷快速的开发Web应用,具有快速、安全以及可移植的数据库驱动的应用,兼容 Google App Engine。6、WeppyWeppy感觉就像Flask的简约风格和Django的完整性之间的中间标记。虽然开发Weppy应用程序具有Flash的直接性,但Weppy具有Django中的许多功能,如数据层和身份验证。因此,Weppy适用于从极其简单到适度复杂的应用程序。拓展:什么是PythonPython是一种跨平台的计算机程序设计语言,是ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程,是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本,随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。今天的分享就是这些,希望能帮助到大家!

干货分享!Python三大web框架简单介绍

Django: Python Web应用开发框架Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。Flask:一个用Python编写的轻量级Web应用框架Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。Tornado:异步非阻塞IO的Python Web框架Tornado是一种 Web 服务器软件的开源版本。Tornado 和主流Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其非阻塞的方式和对epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架。

Python三大web框架分别是什么 哪个更好

DjangoDjango走的大而全的方向,开发效率高。它的MTV框架,自带的ORM,admin后台管理,自带的sqlite数据库和开发测试用的服务器,给开发者提高了超高的开发效率。重量级web框架,功能齐全,提供一站式解决的思路,能让开发者不用在选择上花费大量时间。自带ORM和模板引擎,支持jinja等非官方模板引擎。自带ORM使Django和关系型数据库耦合度高,如果要使用非关系型数据库,需要使用第三方库自带数据库管理app成熟,稳定,开发效率高,相对于Flask,Django的整体封闭性比较好,适合做企业级网站的开发。python web框架的先驱,第三方库丰富。FlaskFlask是轻量级的框架,自由、灵活、可扩展性强,核心基于Werkzeug WSGI工具和jinja2模板引擎。适用于做小网站以及web服务的API,开发大型网站无压力,但架构需要自己设计。与关系型数据库的结合不弱于Django,而与非关系型数据库的结合远远优于Django。TornadoTornado走的是少而精的方向,性能优越,它最出名的异步非阻塞的设计方式。Tornado的两大核心模块:iostraem:对非阻塞的socket进行简单的封装。ioloop:对I/O多路复用的封装,它实现一个单例。

Python Web开发比较流行的框架都有什么?

目前Python流行的Web框架包括:Django、Flask和Tornado。框架把构建Web应用的通用的代码进行了封装,把相应的模块组织起来,使用Web框架可以更轻松、快捷的创建web应用,不用去关注一些底层细节。1、Django框架Django是基于Python的免费和开放源代码Web框架,它遵循模型-模板-视图(MTV)体系结构模式。它由Django Software Foundation(DSF)维护,这是一个由非营利组织成立的独立组织。Django对基础的代码进行了封装并提供相应的 API,开发者在使用框架是直接调用封装好的 API 可以省去很多代码编写,从而提高工作效率和开发速度。Django的设计理念如下:①松耦合——Django的目标是使堆栈中的每个元素彼此独立。②更少的编码——更少的代码,因此可以快速开发。③不重复自己(DRY)——一切都应该只在一个地方开发,而不是一次又一次地重复。④快速开发——Django的理念是尽一切可能促进超快速开发。⑤简洁的设计——Django严格按照自己的代码维护简洁的设计,并易于遵循最佳的Web开发实践。Django的一些优势如下:①对象关系映射(ORM)支持——Django在数据模型和数据库引擎之间建立了桥梁,并支持包括MySQL,Oracle,Postgres等在内的大量数据库系统。②多语言支持——Django通过其内置的国际化系统支持多语言网站。因此,您可以开发支持多种语言的网站。③框架支持——Django内置了对Ajax,RSS,缓存和其他各种框架的支持。④GUI——Django为管理活动提供了一个很好的即用型用户界面。⑤开发环境——Django带有轻量级的Web服务器,以促进端到端应用程序的开发和测试。⑥Django是Python Web框架。和大多数现代框架一样,Django支持MVC模式。2、Flask框架Flask 是 Python 编写的一种轻量级 ( 微 ) 的 Web 开发框架,只提供 Web 框架的核心功能,较其他类型的框架更为的自由、灵活、更加适合高度定制化的 Web 项目。Flask 在功能上面没有欠缺,只不过更多的选择及功能的实现交给了开发者去完成,因此 Flask 对开发人员的水平有了一定的要求。3、Tornado框架在之前的学习过程当中,学习过了 Flask 和 Django 这两个 Python Web 框架,现在来认识一个更加复杂但是高效的 Python Web 框架 : Tornado。Tornado 是 Python 编写的一个强大的可扩展的 Web 服务器,在处理高网络流量的时候表现的足够强大,但是在创建的时候,和 Flask 类似又足够轻量,并且可以被用到大量的工具当中。相对于其他的框架,Tornado 有如下特点:1、完整的 Web 开发框架,和 Django,Flask 一样,Tornado 也提供了路由映射,request 上下文,基于模板的页面渲染这些功能。2、同样是一个高效的网络库,性能可以和 Python 的 Twisted,Gevent 等底层框架媲美,同时提供了异步IO, 超时事件处理,功能,这样 twisted 除了做 Web 之外还可以做爬虫,物联网关或者游戏服务器等后台应用。3、提供了高效的 HTTPClient, 除了服务器端框架,还提供了基于异步框架的 HTTP 客户端4、提供了高效的内部服务器,Tornado 的内部服务器可以直接用于生产环境5、完备的 WebSocket 支持关于Python的基础问题可以看下这个网页的视频教程,网页链接,希望我的回答能帮到你。

编程语言Python有哪些好的Web框架?

Python常用的web框架推荐:1、FlaskFlask是一个轻量级的web框架,可以快速构建web应用程序。Flask的优点之一是其灵活性,因为它允许您在自己的代码项目中实现所需的定制。Flask适合小型项目和初学者,因为它的学习曲线较低。2、DjangoDjango是一个功能强大的Web框架,适合大型项目。 它包括ORM,模板引擎,管理站点和完整的认证系统等内置功能。 Django的一个独特的优点是它的强大的管理站点,允许您在不编写任何HTML的情况下构建一个完整的后台管理应用程序。 Django具有强大的社区支持,因此可以轻松找到有用的示例代码和插件。3、PyramidPyramid是一个可伸缩的Web框架,旨在处理大型应用程序。 Pyramid具有高度定制的模式,使其在Web应用程序的多种应用中具有广泛的适用性。 Pyramid的一个重要优势是其可扩展性,允许您随着项目的不断发展进行逐步构建。4、BottleBottle是另一个轻量级的Web框架,适用于小型项目。 Bottle提供了一个快速而灵活的方法来构建Web应用程序,但它并不提供预定义的模板。 如果您需要快速启动一个小型Web应用程序并掌握它的完全控制权,则Bottle是一个不错的选择。5、TornadoTornado是一个基于异步事件循环的Web框架,适用于需要高性能的应用程序。 Tornado提供了一种非阻塞的方式来处理Web请求和其他事件,这可以大大提高应用程序的吞吐量。Tornado还包括内置的Web服务器,可以轻松扩展。总的来讲,Python在web开发领域有许多优秀的框架和工具可供选择。灵活性和可扩展性是Python web开发的明显优势,而这些优势正吸引着越来越多的开发者转向Python。

python tornado中是否能实现在web上生成excel并下载功能?

#!/usr/bin/python#-*- encoding:utf-8 -*-import tornado.ioloopimport tornado.webimport os class UploadFileHandler(tornado.web.RequestHandler): def get(self): self.write(""" <html> <head><br> <title>Upload File</title><br> </head> <body> <form action="file" enctype="multipart/form-data" method="post"> <input type="file" name="file"/><br/> <input type="submit" value="submit"/> </form> </body> </html> """) def post(self): upload_path=os.path.join(os.path.dirname(__file__),"files") #文件的暂存路径 file_metas=self.request.files["file"] #提取表单中‘name"为‘file"的文件元数据 for meta in file_metas: filename=meta["filename"] filepath=os.path.join(upload_path,filename) with open(filepath,"wb") as up: #有些文件需要已二进制的形式存储,实际中可以更改 up.write(meta["body"]) self.write("finished!") app=tornado.web.Application([ (r"/file",UploadFileHandler),]) if __name__ == "__main__": app.listen(3000) tornado.ioloop.IOLoop.instance().start()其中注意利用form上传的html代码的写法。另外就是tornado获取post数据的方法。 web前端开发中比较有用的资源bootscrap: http://www.bootcss.com/bootscrap中分页插件: http://bootstrappaginator.org/#minimum-configuration js脚本构造form(表单)提交的类 转自:http://runtool.blog.163.com/blog/static/183144445201272053421155/

python2.7 可以使用tornado吗

可以使用tornado, django等框架

已解决:python3.6 使用pip命令安装tornado时报错。

在使用 pip install tornado 命令安装tornado时,报错了,错误信息如下: Could not find a version that satisfies the requirement tornado (from versions: ) No matching distribution found for tornado 原因是我的电脑没有科学上网,科学上网后再次执行安装命令,报了另一个错: OSError: [Errno 13] Permission denied: "/Library/Python/2.7/site-packages/futures-3.2.0.dist-info" 原因是权限问题,在命令前加上sudo就可以,即使用命令 sudo pip install tornado 。 执行情况如下: 但这是安装到系统带的python2.7上了,如需安装到python3.6上,执行此命令即可 sudo pip3 install tornado ,执行情况如下: Have fun.

本人使用python2.7,用tornado4.1,运行以下程序,但出现下面提示,服务器停止工作是什么原因???

我也遇到了相同的错,怎么解决?

用python做web开发,tornado 如何部署,都是用nginx+supervisor吗

因为Tornado是异步的网络框架,性能够好,可以直接放在最外层,但是为了避免阻塞问题,会开多个进程,然后使用 Nginx 做反向代理实现负载均衡。具体可以看这篇文章 Introduction to Tornado 中文翻译。那么这里就涉及到要开多个Tornado进程的问题,使用Supervisor来做这件事是最简单的。Supervisor 的使用方法可以看这篇文章 Python 进程管理工具 Supervisor 使用教程另外,如果你需要部署Django或者 Flask,则推荐 Nginx+Gunicorn+SupervisorNginx放在最外层,然后使用Supervisor做进程管理,使用Gunicorn启动Django或者Flask,相较于uwsgi 的方法,简单很多,而且Gunicorn可以让你使用Gevent和Tornado来为你的后端实现异步访问,性能直接飙升。

Python的Tornado框架实现数据可视化

这篇文章主要介绍了举例讲解Python的Tornado框架实现数据可视化的教程,Tornado是一个异步的高人气开发框架,需要的朋友可以参考下所用拓展模块xlrd:Python语言中,读取Excel的扩展工具。可以实现指定表单、指定单元格的读取。使用前须安装。=。=看起来好像基本没人值班,对,就是这样。大家都好懒T。TSign...简单分析一下,考勤记录表是文件的第三个sheet第三行有起止时间第四行是所有日期的数字接下来每两行:第一行为用户信息;第二行为考勤记录思路决定用3个collection分别储存相关信息:user:用户信息,包含id、name、deptrecord:考勤记录,包含id(用户id)、y(年)、m(月)、d(日)、check(打卡记录)duty:值班安排,包含id(星期数,例:1表示星期一)、list(值班人员id列表)、user_id:[start_time,end_time](用户值班开始时间和结束时间)读取xls文件,将新的考勤记录和新的用户存入数据库。根据年月日参数查询对应record,查询当天的值班安排,匹配获得当天值班同学的考勤记录。将值班同学的打卡时间和值班时间比对,判断是否正常打卡,计算实际值班时长、实际值班百分比。之后输出json格式数据,用echarts生成图表。分析当月、当年的考勤记录同理,不过可能稍微复杂一些。所有的讲解和具体思路都放在源码注释里,请继续往下看源码吧~源码main.py24252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116#!/usr/bin/env python# -*- coding: utf-8 -*-import os.pathimport tornado.authimport tornado.escapeimport tornado.httpserverimport tornado.ioloopimport tornado.optionsimport tornado.webfrom tornado.options import define, optionsimport pymongoimport timeimport datetimeimport xlrddefine(port, default=8007, help=run on the given port, type=int)class Application(tornado.web.Application):def __init__(self):handlers = [(r/, MainHandler),(r/read, ReadHandler),(r/day, DayHandler),]settings = dict(template_path=os.path.join(os.path.dirname(__file__), templates),static_path=os.path.join(os.path.dirname(__file__), static),debug=True,)conn = pymongo.Connection(localhost, 27017)self.db = conn[kaoqin]tornado.web.Application.__init__(self, handlers, **settings)class MainHandler(tornado.web.RequestHandler):def get(self):passclass ReadHandler(tornado.web.RequestHandler):def get(self):#获取collectioncoll_record = self.application.db.recordcoll_user = self.application.db.user#读取excel表格table = xlrd.open_workbook(/Users/ant/Webdev/python/excel/data.xls)#读取打卡记录sheetsheet=table.sheet_by_index(2)#读取打卡月份范围row3 = sheet.row_values(2)m1 = int(row3[2][5:7])m2 = int(row3[2][18:20])#设置当前年份y = int(row3[2][0:4])#设置当前月份为第一个月份m = m1#读取打卡日期范围row4 = sheet.row_values(3)#初始化上一天lastday = row4[0]#遍历第四行中的日期for d in row4:#如果日期小于上一个日期#说明月份增大,则修改当前月份为第二个月份if dlastday:m = m2#如果当前两个月份分别为12月和1月#说明跨年了,所以年份 +1if m1 == 12 and m2 == 1:y = y + 1#用n计数,范围为 3 到(总行数/2+1)#(总行数/2+1)- 3 = 总用户数#即遍历所有用户for n in range(3, sheet.nrows/2+1):#取该用户的第一行,即用户信息行row_1 = sheet.row_values(n*2-2)#获取用户idu_id = row_1[2]#获取用户姓名u_name = row_1[10]#获取用户部门u_dept = row_1[20]#查询该用户user = coll_user.find_one({id:u_id})#如果数据库中不存在该用户则创建新用户if not user:user = dict()user[id] = u_iduser[name] = u_nameuser[dept] = u_deptcoll_user.insert(user)#取该用户的第二行,即考勤记录行row_2 = sheet.row_values(n*2-1)#获取改当前日期的下标idx = row4.index(d)#获取当前用户当前日期的考勤记录check_data = row_2[idx]#初始化空考勤记录列表check = list()#5个字符一组,遍历考勤记录并存入考勤记录列表for i in range(0,len(check_data)/5):check.append(check_data[i*5:i*5+5])#查询当前用户当天记录record = coll_record.find_one({y:y, m:m, d:d, id:user[id]})#如果记录存在则更新记录if record:for item in check:#将新的考勤记录添加进之前的记录if item not in record[check]:record[check].append(item)coll_record.save(record)#如果记录不存在则插入新纪录else:record = {y:y, m:m, d:d, id:user[id], check:check}coll_record.insert(record)24252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112class DayHandler(tornado.web.RequestHandler):def get(self):#获取年月日参数y = self.get_argument(y,None)m = self.get_argument(m,None)d = self.get_argument(d,None)#判断参数是否设置齐全if y and m and d:#将参数转换为整型数,方便使用y = int(y)m = int(m)d = int(d)#获取当天所有记录coll_record = self.application.db.recordrecord = coll_record.find({y:y, m:m, d:d})#获取当天为星期几weekday = datetime.datetime(y,m,d).strftime(%w)#获取当天值班表coll_duty = self.application.db.dutyduty = coll_duty.find_one({id:int(weekday)})#初始化空目标记录(当天值班人员记录)target = list()#遍历当天所有记录for item in record:#当该记录的用户当天有值班任务时,计算并存入target数组if int(item[id]) in duty[list]:#通过用户id获取该用户值班起止时间start = duty[item[id]][0]end = duty[item[id]][1]#计算值班时长/秒date1 = datetime.datetime(y,m,d,int(start[:2]),int(start[-2:]))date2 = datetime.datetime(y,m,d,int(end[:2]),int(end[-2:]))item[length] = (date2 - date1).seconds#初始化实际值班百分比item[per] = 0#初始化上下班打卡时间item[start] = 0item[end] = 0#遍历该用户打卡记录for t in item[check]:#当比值班时间来得早if tstart:#计算时间差date1 = datetime.datetime(y,m,d,int(start[:2]),int(start[-2:]))date2 = datetime.datetime(y,m,d,int(t[:2]),int(t[-2:]))dif = (date1 - date2).seconds#当打卡时间在值班时间前半小时内if dif = 1800:#上班打卡成功item[start] = startelif tend:#如果还没上班打卡if not item[start]:#则记录当前时间为上班打卡时间item[start] = telse:#否则记录当前时间为下班打卡时间item[end] = telse:#如果已经上班打卡if item[start]:#计算时间差date1 = datetime.datetime(y,m,d,int(end[:2]),int(end[-2:]))date2 = datetime.datetime(y,m,d,int(t[:2]),int(t[-2:]))dif = (date1 - date2).seconds#当打卡时间在值班时间后半小时内if dif = 1800:#下班打卡成功item[end] = end#当上班下班均打卡if item[start] and item[end]:#计算实际值班时长date1 = datetime.datetime(y,m,d,int(item[start][:2]),int(item[start][-2:]))date2 = datetime.datetime(y,m,d,int(item[end][:2]),int(item[end][-2:]))dif = (date2 - date1).seconds#计算(实际值班时长/值班时长)百分比item[per] = int(dif/float(item[length]) * 100)else:#未正常上下班则视为未值班item[start] = 0item[end] = 0#将记录添加到target数组中target.append(item)#输出数据self.render(index.html,target = target)def main():tornado.options.parse_command_line()http_server = tornado.httpserver.HTTPServer(Application())http_server.listen(options.port)tornado.ioloop.IOLoop.instance().start()if __name__ == __main__:main()index.html{{% for item in target %}{id:{{ item[id] }},start:{{ item[start] }},end:{{ item[end] }},length:{{ item[length] }},per:{{ item[per] }}}{% end %}}最后暂时只写到读文件和查询某天值班情况,之后会继续按照之前的计划把这个小应用写完的。因为涉及到一堆小伙伴的隐私,所以没有把测试文件发上来。不过如果有想实际运行看看的同学可以跟我说,我把文件发给你。可能用到的一条数据库插入语句:db.duty.insert({id:5,list:[1,2],1:[19:00,22:00],2:[19:00,22:00]})希望对像我一样的beginner们有帮助!
 1 2 3 4 5 6  下一页  尾页