Python技术(精选8篇)
Python技术 篇1
1 Web数据抓取技术介绍
1.1 Web数据抓取
Web数据抓取(Web Scraping)是指从网站上提取信息的一种计算机软件技术。Web数据抓取程序模拟浏览器的行为,能将任何可以在浏览器上显示的数据提取出来,因此也称为屏幕抓取(Screen Scraping)。Web数据抓取的最终目的是将非结构化的信息从大量的网页中抽取出来以结构化的方式存储(CSV、JSON、XML、Access、Mssql、Mysql等)。简而言之,Web数据采集就是从指定网站抓取所需的非结构化信息数据,分析处理后存储为统一格式的本地数据文件或直接存入本地数据库中。
1.2 Web Scraping的作用
Internet是一个巨大的且迅速发展的信息资源。但大多数信息都以无结构的文本形式存在,使得信息归类变得非常困难。在Web Scraping出现之前,人们为了归类数据通常会采用手动复制粘贴的方式,这样不但费时费力,而且数据质量得不到保证,效率低。有时遇到海量数据的时候,靠人工整理甚至是无法完成。Web Scraping是一个使用计算机程序自动从目标网页中摘取某些数据形成统一格式的本地数据的过程,整个过程基本不需要人工干预。其效率较高:
(1)速度快。抓取程序的数据加载速度要比浏览器快,因为通常情况下浏览器不但要下载基本的HTML数据还需要下载相关的样式表、Java Script文件、多媒体资源,还要由渲染引擎进行页面排版布局,Java Script引擎还要进行客户端代码执行。而抓取程序只需要下载基本的HTML数据即可,这样可缩短数据下载时间。另外,程序的数据提取速度会比人工复制粘贴速度快得多,再结合多线程技术,速度更是人工所无法比拟的。
(2)准确性高。人工操作会产生信息遗漏或错误的情况,而且纠错难度大。而程序的准确性较高,即便出现问题,纠错也容易,通常只需要修改程序即可。
2 Web Scraping的原理
Web Scraping程序在计算机网络通信的传输层,使用TCP协议与Web服务器进行数据传输,在应用层使用HTTP协议与服务器进行数据交互。它与服务器的通信过程和HTTP客户端程序浏览器一致。
Web Scraping程序从功能上可以划分为两大模块:HTTP交互模块和HTML解析模块。对一个网页的抓取过程是:首先HTTP交互模块向服务器的Web端口发起TCP连接,连接建立后,交互模块即可向Web服务器发送HTP请求报文,当HTTP交互模块接收到服务端的应答报文后,进行HTTP包拆封,提取其中的HTML数据,然后将数据交由HTML解析模块进行数据解析和提取,最后解析模块将提取的数据以格式化的形式存储于数据库系统或者是简单的结构化的文本文件(CSV、TSV、XML等)。整个流程如图1所示。
Web Scraping程序对一个网站的采集过程就是分别对网站内感兴趣的每个页面采集的集合。为得到网站所需要采集的页面地址,需要首选对网站的结构进行分析,总结出页面的规律,例如,网站通常会有一些信息集中的列表页,通过遍历这些列表页即可得到所有详细页面的地址。
对于某些网站在于服务器交互的过程中可能会用到Cookie,这时就需要抓取程序还能够对HTTP报文中的Cookie进行管理,例如,当服务端的应答报文中含有Set-cookie字段时,要提取Cookie数据并在客户端存储或更新;之后发送请求报文时,要将Cookie一并发回服务端。
HTML解析模块负责对HTML数据进行提取和规范化处理,然后将数据以结构化的形式存储。
3 基于Python的Web数据采集方案
Python是一种面向对象、直译式计算机程序设计语言。其语法简捷而清晰、可读性强、便于维护,并且具有丰富和强大的类库[1]。为Web Scraping程序开发提供了便利:可以使用HTTP通信模块urllib2完成与Web服务器的数据交互,使用cookielib模块进行Cookie管理,使用re模块进行文本提取[2],使用XPath相关库进行HTML解析。总之,Python提供了Web Scraping程序的所有功能模块,利用Python可以最少的代码完成功能强大的功能。
3.1 实现HTTP交互模块
Python的urllib2模块包含于Python的标准库中,它定义了一些类和方法主要用于实现对HTTP通信协议的支持。urllib2支持HTTP代理、HTTP简单认证、跳转、Cookie等功能[5]。urllib2模块还支持对HTTP请求报文的头和实体进行增改,对HTTP应答报文的头和正文进行读取。
如何利用urllib2模块进行HTTP交互?urllib2.urlopen(url[,data][,timeout])方法提供了最基本的HTTP请求构造和HTTP应答处理功能。url参数指示了一个要下载的资源路径。当data参数为空时预示着将发出一个GET类型的请求,该请求不包含任何实体;当data参数为非空时预示着将发出一个POST类型的请求,data的内容即为请求的实体内容。timeout参数指示了请求超时的时间。
urllib2.urlopen方法调用的结果有两种情况:
(1)出现了HTTP错误。例如,网络异常或Web服务异常造成的请求超时错误;服务端返回HTTP错误码。这时urllib2.urlopen会抛出一个异常,可以通过捕获不同的异常类型进而判断错误的种类[5]。
(2)没有出现HTTP错误。这时urllib2.urlopen返回一个类似文件的对象,通过调用该对象的read()方法可获取到应答返回的正文内容(HTML)。如果返回是经过gzip压缩过的数据,在这里还要手动进行gzip解码。
cookielib模块也包含于Python的标准库中,它主要用于对Cookie进行管理[5],urllib2通过cookielib库实现对Cookie自动维护。
3.2 实现HTML解析模块
通过HTML交互模块可以取得网站页面数据,但是此时的数据粗糙,字符编码不确定,结构混乱甚至不符合XML规范。所以首先要确定文档的字符编码,通过<head>中的content-type元得到。然后将其解码成unicode类型[3],目的是保证后续数据提取过程中的编码一致性,以及最终数据存储方便。
正则表达式:是指一个用来描述或者匹配一系列符合某个句法规则的字符串的工具。利用正则表达式可以方便地从一堆复杂的文本中找到与规则相匹配的子串,许多程序设计语言都支持利用正则表达式进行字符串操作。在Python标准库中re是一个用来进行正则表达式相关操作的模块[6]。通过对目标页面结构进行分析,通常能够在感兴趣的字符串周围找到其他有标志性的字符,可以通过这些字符构造出正则表达式,利用re模块进行数据提取。
XPath:是一门在XML文档中查找信息的语言,用于在XML文档中通过元素和属性进行导航。利用XPath可以方便地在HTML文档中定位感兴趣的节点。lxml库是Python的第三方库,它支持标准的XPath规范[7]。
通过正则表达式和XPath的结合就可灵活地从HTML中提取任何感兴趣的信息。在提取到数据之后还要对其进行规范化处理,比如将HTML转义字符进行反转义、去除冗余的HTML标记、去除冗余的空白字符。
3.3 数据结构化存储
结构化数据通常指的是行数据,存储在数据库里,可以用二维表结构来逻辑表达实现的数据。Web Scraping程序最终输出的数据是结构化的,具体存储于各种数据库系统或文件中。在unicode数据进行本地化存储之前必须要先进行字符编码,具体的编码方式可以根据需要选择,一般是由数据最终的应用环境决定的。比如,最终的数据将应用在一个字符编码为UTF-8的网站上,那么就要选择以UTF-8的编码进行存储。
4 结束语
介绍了Web数据抓取技术以及其实现的原理,以及如何利用Python进行Web数据抓取程序的开发。Web数据抓取技术已在非结构数据结构化、Web程序自动化操作、定制搜索引擎爬虫、舆情监控等方面发挥重要作用。同时,为保护好自己的Web资源不被别人恶意采集,要做好应对措施,限制网站单个IP的并发连接数,可以使用Ajax动态加载网页内容或者将应答内容进行加密,将一些敏感的信息以非文本的形式展现,都会给数据采集造成障碍。
摘要:针对Web数据采集技术进行了介绍,分析了Web数据采集技术在将非结构化数据转换为结构化数据方面的优势:速度快、准确性高。从HTTP协议层分析了Web数据抓取的原理,并重点介绍了如何实现基于Python的Web数据采集方案。Web数据采集系统可以分为:HTTP交互和数据解析两个模块。
关键词:Web数据抓取,屏幕抓取,HTTP协议,Python,正则表达式,XPath
参考文献
[1]赫特兰.Python基础教程[M].2版.北京:人民邮电出版社,2010.
[2]丘恩.Python核心编程[M].2版.北京:人民邮电出版社,2008.
[3]鲁特兹.Python学习手册[M].北京:机械工业出版社,2009.
[4]桂小林,汪宁波,李文.基于XML的远程教育课件规范化的研究与实现[J].电子科技,2010,23(6):129-131.
[5]刘红梅.脚本语言在数据采集系统中的应用研究[J].电子科技,2009,22(11):72-75.
Python技术 篇2
PyCodeObject对象
python程序文件在执行前需要编译成PyCodeObject对象,每一个CodeBlock都会是一个PyCodeObject对象,在Python中,类,函数,模块都是一个Code Block,也就是说编译后都有一个单独的PyCodeObject对象,因此,一个python文件编译后可能会有多个PyCodeObject对象,比如下面的示例程序编译后就会存在2个PyCodeObject对象,一个对应test.py整个文件,一个对应函数test。关于PyCodeObject对象的解析,可以参见我之前的文章Python pyc格式解析,这里就不赘述了。
#示例代码test.pydef test(): print “hello world”if __name__ == “__main__”: test()
PyFrameObject对象
python程序的字节码指令以及一些静态信息比如常量等都存储在PyCodeObject中,运行时显然不可能只是操作PyCodeObject对象,因为有很多内容是运行时动态改变的,比如下面这个代码test2.py,虽然1和2处的字节码指令相同,但是它们执行结果显然是不同的,这些信息显然不能在PyCodeObject中存储,这些信息其实需要通过PyFrameObject也就是栈帧对象来获取。PyFrameObject对象中有locals,globals,builtins三个字段对应local,global,builtin三个名字空间,即我们常说的LGB规则,当然加上闭包,就是LEGB规则。一个模块对应的文件定义一个global作用域,一个函数定义一个local作用域,python自身定义了一个顶级作用域builtin作用域,这三个作用域分别对应PyFrameObject对象的三个字段,这样就可以找到对应的名字引用。比如test2.py中的1处的i引用的是函数test的局部变量i,对应内容是字符串“hello world”,而2处的i引用的是模块的local作用域的名字i,对应内容是整数123(注意模块的local作用域和global作用域是一样的)。需要注意的是,函数中局部变量的访问并不需要去访问locals名字空间,因为函数的局部变量总是不变的,在编译时就能确定局部变量使用的内存位置。
#示例代码test2.pyi = 123 def test(): i = ‘hello world‘ print i #1test()print i #2
PyFunctionObject对象
Python技术 篇3
现在人们的工作、生活中, 每天都会要查收和回复很多各种的邮件, 有用Web浏览器登录邮件系统的, 有用邮件客户端如: Foxmail、Outlook等登录处理邮件的, 而这些用久了难免就会厌烦, 想尝试一种新的方式来处理邮件, 下面就用当前比较流行的一种Python语言实现一个简单、快捷的邮件收发软件。
2 Python 体系结构
Python是最近几年逐渐流行开来的一种面向对象、解释型计算机程序设计语言, 最早是由Guido van Rossum于1989年底发明, 被Google公司广泛应用和发展壮大。Python语法简洁而清晰, 具有丰富和强大的类库。使用它能够很轻松地把用其他语言制作的各种模块联结在一起组成一个整体。较为常见 的一种应用情形是, 使用Python快速生成程序的原型, 包括用户界面等, 然后对一些有特别需求的部分, 再用更合适的语言改写, 如在3D游戏设计中的图形渲染模块及其他各种动画处理, 可以选用如3DMaX、Maya等实现, 只要通过Python把各个部分连接起来就形成了一个功能完整的项目。
接下来这里通过一个邮件收发软件的实例, 讲解如何使用Python语言进行应用开发, 开发环境如图1所示。
3 应用的主要模块
3.1 smtplib 模块
Python中的smtplib模块提供了一种非常方便的途径来发送电子邮件。它对SMTP协议进行了简单的封装。
3.1.1 smtplib 模块的介绍和功能实现
stmplib模块中有几个主要类 : SMTP类、SMTP_SSL类和LMTP类。
应用最多的就是SMTP类: smtplib.SMTP ([host [, port [, local_hostname [, timeout]]]])。
SMTP类用于实现跟SMTP服务器之间的连接 , 通过这个连接来向SMTP服务器发送指令, 执行如: 登录、发送邮件等相关操作。
SMTP类的所有 参数都是 可选的 , 其中host参数表示SMTP服务器的主机名 , port表示SMTP服务的端口 , 默认是值25; 如果在创建SMTP对象时只提供了这两个参数, 在初始化时会自动调用connect方法进行服务器的连接。
smtplib.SMTP提供的方法:
(1) SMTP.set_debuglevel (level) : 用于设置是否为调试模式。默认为False, 即非调试模式, 表示不输出任何调试信息。
( 2) SMTP.connect ( [ host [ , port] ] ) : 用于连接 到指定的SMTP服务器。参数分别表示SMTP主机和端口。也可以在host参数中指定端口号如 : smtp.163.com:25, 这样就可以不用给出port参数了。
(3) SMTP.docmd (cmd [, argstring]): 用于向SMTP服务器发送指令。一个可选参数argstring表示指令的后缀参数。
3.1.2 邮件发送的实现
以下给出邮件发送模块的实现代码:
3.2 poplib 模块
在Python中通过poplib模块来实现邮件的接收。
3.2.1 poplib 模块的的实现
poplib模块中以一个封装的pop3类来实现接收邮件的各种具体操作
pop3类的方法及功能如下:
(1) poplib.POP3._init_ () :连接pop3服务器。
(2) poplib.POP3.user poplib.POP3.pass_ (): 发送用户名和密码进行验证。为了与Python的关键字区分, 所以要加下划线。
(3) poplib.POP3.stat (): 获取邮箱中信件信息。
( 4) poplib.POP3.retr ( ) : 收取邮件 。该方法 返回一个tuple, 其中包含了结果代码和邮件。但是邮件并不是字符串格式, 而是一个字符串的列表。每一个元素表示该邮件的一行。可以使用“n” .join (lines) 来把它们转换成标准的字符串。
(5) poplib.POP3.dele (): 删除邮件。指令只带一个邮件数字作为参数, 所以必须为每一个要删除的邮件调用一次该指令, 大多数POP服务器在调用了quit () 之后才真正删除那些邮件。
3.2.2 邮件接收功能的实现
通过以下代码可以实现邮件的接收, 及邮件列表的生成:
4 结语
通过以上步骤实现了邮件的接收和发送功能, 有兴趣的读者可以试着再丰富一下软件的功能, 让平常的邮件收发更具乐趣。通过这个实例, 能够发现Python语言的简洁、 高效 , Python以其更好的兼容性和跨平台性 , 被越来越多的人所喜爱, 其强大的标准库和大量的第三方模块为Python的发展奠定了坚实的基础。
摘要:通过一个邮件收发的实例,展示了Python语言简洁和高效等特点,在日常的工作和生活中发挥越来越多的作用。
Python正则表达式研究 篇4
1.1 基本概念
正则表达式 (Regular Expression), 又称正规表示法、常规表示法, 在代码中常简写为regex、regexp或RE。正则表达式是对字符串操作的一种逻辑公式, 就是用事先定义好的一些特定字符及 这些特定 字符的组 合 , 组成一个 “规则字符 串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
给定一个正则表达式和另一个字符串, 可以达到如下的目的:
(1) 给定的字符串是否符合正则表达式的过滤逻辑 ( 称作“匹配”)。
(2) 可以通过正则表达式 , 从字符串中获取我们想要的特定部分。
1.2 正则表达式的特点
(1) 灵活性、逻辑性和功能性非常强。
(2) 可以迅速地用极简单的方式表示复杂的字符串。
(3) 对于刚接触的人来说 , 比较晦涩难懂。
(4) 常用来匹配或提取一些特征字符串。
1.3 正则表达式定义
正则表达式由一些普通字符 (literal characters) 和一些元字符 (meta characters) 组成。普通字符包 括大小写 的字母、数字和可打印的符号, 而元字符则具有特殊的含义。
1.4 正则表达式的结构
Anchors Character-Sets Modifiers
Python处理正则表达式的模块是re模块。
1.4.1 锚定符
如表1所示。
1.4.2 字符集由普通字符和元字符组成
如表2所示。
1.4.3 修饰符
由普通字符和元字符组成, 非贪婪匹配, *?+?, 如表3所示。
2 Python 正则表达式
主要介绍Python中常用的正则表达式处理函数。Python处理正则表达式的模块是re, 要使用正则表达式, 需要先import re模块。
Python中处理正 则匹配最 常见的函 数是match和search函数。
2.1 match 函数
re.match尝试从字符串的开始匹配一个模式。
函数语法:
re.match (pattern, string, flags=0)
函数参数说明如表4所示。
匹配成功则match函数返回一个匹配的正则对象, 否则返回None。
2.2 search 函数
re.search尝试从字符串中匹配一个模式。函数语法:
函数语法:
re.search (pattern, string, flags=0)
函数参数含义和match类似。
2.3 案例
输出:
2.4 re.match 与 re.search 的区别
re.match从字符串开始起匹配指定正则表达式, 如果字符串开始不符合正则表达式, 则匹配失败, 函数返回None; 而re.search从字符串开始匹配正则表达式, 直至找到一个尽可能的匹配。
2.5 正则表达式分组
可以使用group (num) 或groups() 匹配对象函数来获取匹配表达式, 如表5所示。
以上实例执行结果如下:
3 正则表达式实例
如表6所示。
4 结语
研究了正则表达式的基本概念和在Ptyhon中的常用函数,随后结合实际例子演示了Python的正则表达式使用, 从研究可以看到正则表达式在文本匹配和文本抽取方面有着强大的功能, 在实际工作中如匹配用户邮箱或手机号, 抽取网页内容等领域有着广泛的应用。
摘要:研究了正则表达式的基本概念、定义及其元字符,讲解Python中正则表达式的常用函数和使用实例,并做了简单对比,分析了正则分组的概念并利用分组进行实际的正则匹配结果抽取。
运用Python进行网络编程 篇5
1.1 基本概念
(1)Socket
Socket的英文原义是“孔”或“插座”。Socket非常类似于电话插座。以一个国家级电话网为例,电话的通话双方相当于相互通信的2个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于Socket号。任何用户在通话之前,首先要占有一部电话机,相当于申请一个Socket;同时要知道对方的号码,相当于对方有一个固定的Socket。然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。对方假如在场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向Socket发送数据和从Socket接收数据。通话结束后,一方挂起电话机相当于关闭Socket,撤消连接。
(2)IP地址
用来唯一标识网络上的主机,有IP4和IP6 2种。
(3)端口
网络中可以被命名和寻址的通信端口,是操作系统可分配的一种资源。
(4)协议
常见的连接层协议分为TCP和UDP 2种。TCP是面向连接的,UDP是面向无连接的。
(5)连接
两个进程间的通信链路称为连接。一般用一个五元组(本机ip、本机port、对端ip、对端port、协议)表示一个Socket连接。
1.2 服务器模型
Linux系统网络服务器模型主要有3种:并发服务器、循环服务器和IO多路复用服务器。
(1)TCP循环服务器:首先TCP服务器接受一个客户端的连接请求,处理连接请求,在完成这个客户端的所有请求后断开连接,然后再接受下一个客户端的请求。
(2)TCP并发服务器:并发服务器的思想是每一个客户端的请求并不由服务器的主进程直接处理,而是服务器主进程创建一个子进程来处理。
(3)多路复用I/O并发服务器:创建子进程会带来系统资源的大量消耗,为了解决这个问题,采用多路复用I/O模型的并发服务器。多路复用I/O可以解决资源限制问题,此模型实际上是将UDP循环模型用在了TCP上面。
2 运用Python进行网络编程
2.1 服务端/客户端示例
(1)客户端
(2)循环服务器
3 结语
介绍了Socket编程的基本概念和常见模型,并用Python实现了client和server示例脚本。最后给出了select模型,从例子中可以看出采用Python进行select服务器的编程简单、逻辑清晰。采用select模型最大的优点是在单线程中达到类似多线程处理网络连接的效果,其缺点是单进程打开的连接有限,并且随着连接的增多其处理效率会显著下降。
摘要:介绍了网络编程的基本概念和步骤,介绍了网络编程的服务端模型,说明了如何应用Python来进行网络程序的开发,详细介绍了select服务器模型,并通过一个简单实例说明select服务器模型的应用步骤。
关键词:Socket,select,server,client
参考文献
[1]Richard Stevens,TCP/IP Illustrated,Vol.1/Vol.2/Vol.3.
[2]Richard Stevens,UNIX Network Programming,2/e,Vol.1/Vol.2.
Python技术 篇6
Citation:YAO Jian-sheng, LIU Yan-ling, LI Shu-mei.Simulation of DTN Platform Based on Python[J].The Journal of New Industrialization, 2016, 6 (9) :42-45.
0 引言
在一些真实的移动自组织 (MANET, Mobile Ad hoc NETwork) [1]网络中, 由于节点移动、稀疏或无线链路不稳定等原因, 导致通信节点间不存在完整通信链路, 因此传统基于TCP/IP体系结构网络协议无法使用。延迟容忍网络 (DTN, Delay Tolerant Networks) [2]通过“存储-携带-转发”的理由模型, 利用节点移动带来的接触机会能够实现不存在完整通信链路节点间的通信, 这使手持便携设备和车载设备等可以随时随地感知并扩散热点区域信息, 满足物联网泛在互联与透彻感知的需求[3], 对物联网和普适计算有重要意义。
当前研究DTN网络协议的方法有理论分析、部署真实环境、搭建实验床、网络仿真等。其中理论分析通过建立数学模型分析相关网络协议性能是最快捷和经济的方法, 但是也需要通过真实或实验环境验证;部署真实环境和搭建实验床最能真实测试网络协议, 但是部署或搭建周期较长, 代价较高;网络仿真通过在计算机上建立虚拟网络仿真平台, 实现真实网络环境的模拟和分析, 该方法具有成本低、开发周期短和灵活可靠等优点, 因此是当前研究DTN网络协议的主要方法[4]。
DTN网络仿真工具有ns-2、ns-3、OMNet++、OPNET、Glo Mo Sim和ONE等。其中除了ONE仿真器外, 其它仿真工具都是比较普适的网络仿真工具, 可以仿真各种网络场景, 需要通过二次设计才能仿真DTN网络。ONE是专门的DTN网络的仿真工具, 提供了DTN网络仿真环境, 并且实现了典型网络协议, 因此称为当前主流的DTN仿真工具[5]。
ONE是基于Java语言的, 虽然提供了仿真的可视化界面, 但是对仿真数据处理、分析、统计作图需要其它工具的配合, 比如matlib、origin或sigmaplot等统计分析作图工具, 本文基于Python语言和其仿真、科学计算库搭建完整的DTN网络仿真平台, 该平台不仅能仿真DTN网络、提供可视化界面, 而且集成了数据分析统计功能。
1 搭建DTN网络仿真平台
DTN是一种新型MANET网络, DTN采用一种“存储-携带-转发”的路由模型, 因此传统网络的基于TCP/IP体系结构的协议无法直接使。常见的网络仿真工具大都不能直接支持DTN网络, 需要开发相应模块。
ONE是专门的DTN网络仿真工具, 但是ONE本身不能提供数据分析等功能。Python是一种面向对象的解释型计算机程序设计语言, 具有丰富和强大的库, Python也被称为胶水语言, 能够把其它语言模块 (包括C/C++和Java) 联结在一起, 因此基于Python开发DTN仿真平台, 能实现较完备的功能。本节首先列出基于Python搭建DTN仿真平台的相关Python库, 然后给出仿真平台框架。
1.1 相关程序包
(1) 基于Python的网络仿真库——Sim Py[6]:Sim Py是面相过程的离散事件仿真框架, 是仿真DTN的核心。Sim Py库使用很简单, 只提供了三个抽象/父类, 即Processes (进程) 、Resources (资源) 和Monitors (监控) 。模拟中的核心概念是进程, 一个进程是一个对象, 它完成某些任务。
(2) 基于Python的科学计算库[7]——Num Py、Sci Py和Sym Py:其中Num Py可用来存储和处理大型矩阵, 提供了许多高级的数值编程工具, 如:矩阵数据类型、矢量处理, 以及精密的运算库。Sci Py函数库在Num Py库的基础上增加了众多的数学、科学以及工程计算中常用的库函数。例如线性代数、常微分方程数值求解、信号处理、图像处理、稀疏矩阵等等。Sym Py是数学符号计算库, 用它可以进行数学公式的符号推导。
(3) 基于Python的图形库——Py Viz[8]和Matplotlib[9]:其中Py Viz是可视化工具, 用来形象展示DTN网络环境和运行过程;Matplotlib是作图工具, 用来形象展示仿真数据结果。
1.2 仿真框架
仿真平台由以下几个模块组成:
(1) 节点移动模块:生成动态网络拓扑结构。
(2) 数据流量模块:生成网络数据流量。
(3) 访问控制模块:Sim Py本身并不是网络仿真工具, 而是离散事件仿真工具, 因此为了仿真DTN网络, 我们添加了基本的DTN无线访问控制模块。
(4) 路由层模块:平台只提供一个路由父类, 定义了一些共性接口, 如路由更新、路由计算和数据转发等, 在实现具体路由协议时安装路由规则重写相关方法。
(5) 可视化模块:动态展示网络运行情况。
(6) 数据统计分析模块:收集、统计和分析仿真数据结果并作出相应图形。
模块间流程结构如图1所示, 移动模块生成网络拓扑结构, 然后注册节点连接和断开事件, 当执行到该事件时触发路由模块, 路由模块则依据路由计算注册消息转发和接收事件, 该事件则结合访问控制模块决策消息的转发和接收;流量模块注册消息生成和超时事件;整个网络仿真场景有网络场景可视化模块动态显示;仿真结果由数据统计分析模块收集、统计和分析, 并由数据可视化模块显示。
2 仿真示例
仿真场景如图2所示, 仿真区域大小为100m×100m, 仿真区域内随机分布30个移动节点, 系统开始运行时, 移动节点在仿真区域内随机分布, 然后按照RWP (Random Way Point) 移动模型移动, 节点首先生成目的位置D, 然后以速度v m/s从当前位置沿直线匀速运动到D, 在D处静止t秒后再选择下一个目的点D, 进行下一次重复运动过程, 其中v服从5~10的均匀分布, t服从10~50的均匀分布。系统每隔1s生成一个数据, 数据大小为1024kb, 随机选择不同的源节点和目的节点, 网络带宽为10 Mbps, 节点通信半径为5m, 仿真时间500s。仿真以Epidemic[10]路由为测试对象, 分别在缓存为4和8时测试路由性能在不同消息生存周期TTL (Time to Live) 下的值, 路由性能包括投递率、迟延和网络负载, 其中迟延成功转发消息的迟延。
仿真结果如图3所示, 随着TTL增加, 投递率、迟延和网络负载都增加, 这是因为随着消息生存时间增长, 消息被转发的概率增加, 因此增加了网络负载和投递成功率, 但是同时意味着消息可以更晚些到达目的节点, 因此消息迟延也增加。另外, 随着缓存增加, 投递率和网络负载也增加, 原因同样是较大的缓存为消息提供了更多的转发机会, 因此网络负载增加, 投递成功率也增加, 但是迟延在缓存为4和8时基本相同, 这是因为这里的迟延性能只统计成功投递消息的迟延, 因此缓存较大成功投递的消息增多。
3 结论
针对当前DTN网络仿真工具不能提供完整的平台, 基于Python和其丰富的库 (Sim Py、Py Viz和matplotlib等) 搭建DTN仿真平台, 实现了DTN网络仿真、数据统计分析及可视化仿真场景和数据结构等功能。Python的简单、强大使该平台可以很容易的高效二次开发, 方便了研究DTN网络协议。
参考文献
[1]Soni S, Srivastava S.Survey of Quality of Service Routing Protocol in MANET[J].International Journal of Computer Applications, 2016, 136-142.
[2]Sobin C C, Raychoudhury V, Marfia G, et al.A survey of routing and data dissemination in Delay Tolerant Networks[J].Journal of Network&Computer Applications, 2016, 67 (C) :128-146.
[3]马华东, 袁培燕, 赵东.移动机会网络路由问题研究进展[J].软件学报, 2015, 26 (3) :600-616.MA Hua Dong, YUAN Pei Yan, ZHAO Dong.Research Progress on Routing Problem in Mobile Opportunistic Networks[J].Ruan Jian Xue Bao/Journal of Software, 2015, 26 (3) :600-616
[4]马春光, 姚建盛.ns-3网络模拟器基础及应用[M].人民邮电出版社, 2014, 1-6.Ma Chunguang, Yao Jiansheng.Basic and application of ns-3 network simulator[M].people's Posts and Telecommunications Press, 2014, 1-6.
[5]解小刚, 陈进.采用i_d=0的永磁同步电机矢量控制系统MAT-LAB/Simulink仿真[J].新型工业化, 2016, 6 (5) :47-54.Chen Jin, Jie Xiaogang.A new type of permanent magnet synchronous motor vector control system based on MAT-LAB/Simulink i_d=0simulation[J].The Journal of New Industrialization, 2016, 6 (5) :47-54.
[6]Sim Py[EB/OL], http://simpy.readthedocs.io/en/latest/, 2016-09-16.
[7]邓杰, 张学毅, 周美琴, 等.基于OFDM技术电力通信系统的仿真研究[J].新型工业化, 2015, 5 (5) :33-39.DENG Jie, ZHANG Xueyi, ZHOU Meiqin, et al.Simulation of OFDM Communication System Based Power[J].The Journal of New Industrialization, 2015, 5 (5) :33-39.
[8]Thomas B L, Crandall A S.A demonstration of Py Viz, a flexible smart home visualization tool.[C]//IEEE International Conference on Pervasive Computing&Communications.IEEE, 2011:304-306.
[9]Hunter J D.Matplotlib:A 2D Graphics Environment[J].Computing in Science&Engineering, 2007, 9 (3) :90-95.
Python技术 篇7
现代系统设计许多都是由C/C++, Python等高级语言来完成, 而且这些系统越来越复杂, 涉及到的算法的运算量也越来越大, 许多算法需要用硬件实现来满足算法的实时性要求。FPGA是一种可编程的逻辑器件, 它具有便于修改, 调试, 并能并行地完成大量的运算, 从而提高算法的实时性, 并且随着硬件制造水平不断地提高, FPGA的资源越来越大, 工作频率也越来越高, 使得能在其上面完成的算法也越来越复杂。但是传统的软硬件分开设计的方法由于软硬件设计者采用不同的设计语言, 存在软硬件设计者之间难以沟通导致设计周期长等问题, 这种设计方法已不能满足快速地增长的市场要求, 如何将这些系统设计中的算法快速转换为相应的硬件来实现, 需要新的软硬件协同设计方法。当前基于C/C++的软硬件协同设计, 有一个System C标准化组织一直致力于这个工作[1], 也有少量商业化工具例如Synopsys公司Synphony C Compiler和Calypto Design Systems公司的Catapult SL Synthesis可以将C/C++算法转换为相应的硬件[2,3]。Python是一种简单易学并且功能强大的编程语言, 有许多算法是由Python来实现, 而且这些算法很多是免费、开源的, 和C/C++类似需要如何完成基于Python的软硬件协同设计[4]。
1 基于Python的软硬件协同设计发展
由于Python的强大的软硬件描述能力, 近年来许多研究者在Python的软硬件协同设计方面进行了许多研究, 其中Logaras E提出了一种称为Sys Py (System Python) 可以使用Python来描述硬件并将其自动转换为VHDL[5], Zhang mi采用PDSDL (Dynamic System Description Language) 来进行系统建模和校验并可将系统转换为Verilog的硬件描述[6], 特别是Decaluwe J提出一种称为My HDL的Python扩展包来进行软硬件协同设计[7], Villar J I采用My HDL完成了一个接口设计实例[8]。这些开发工具各自具有自己的一些特点, 但是他们有一点是相同, 就是采用Python来进行软硬件协同设计。下面以My HDL为例介绍基于Python的软硬件协同设计。
2 基于Python的My HDL包简介
My HDL采用Python扩展包的形式使其能支持硬件设计和仿真并在仿真结果符合要求后可将软件算法自动转换为相应的采用Verilog或VHDL硬件描述, 由于My HDL包是基于Python的硬件扩展, 下面主要对My H-DL硬件方面的一些主要特点做简要介绍[9]。
2.1 数据类型
标准Python的int类型已经具有许多硬件设计所需要特征, 但是在硬件设计中由于包含许多位操作和处理, My HDL设计了intbv类, 提供索引和切片操作来支持位的操作和处理。
2.2 模块, 端口和信号
在My HDL采用函数来对硬件的模块进行建模, MyHDL也有信号对象, 类似于VHDL语言的信号, 采用信号作为函数的参数来定义模块的端口。
2.3 发生器
发生器是My HDL的一个关键概念, 用来建立并发性模型, 对应于Verilog的always块或者VHDL的进程。
2.4 自动转换
在一定限制条件下, My HDL使用to Verilog () 或者to VHDL () 函数将My HDL设计自动转换为相应的Verilog或者VHDL代码, 如果符合My HDL可综合子集的要求, 就可使用My HDL完成可硬件综和的代码并在FPGA上实现。
2.5 仿真
My HDL通过Cosimulation对象使其能支持仿真, 对于自动转换的Verilog代码或者VHDL代码, My HDL还可作为硬件校验语言来对转换后的Verilog或VHDL进行协同仿真和校验。
3 采用My HDL的硬件设计优点
Verilog和VHDL是当前的主流硬件设计语言, 但是使用基于Python的My HDL作为硬件设计也具有许多优点[10]使得其可以作为设计者特别是硬件设计的初学者另外一种较好的选择。
3.1 My HDL使用成本低
My HDL是免费的并且开源, 在使用My HDL设计的工具链中同样可以使用大量的免费工具比如ICArus, IVERILOG仿真工具, GTKWAVE查看仿真波形, 从而可以减少设计成本。
3.2 在硬件设计中使用先进的软件开发技术
由于Python本身是一种软件开发语言, 现代软件开发的先进方法比如快速应用开发, 测试驱动开发都在Python上得以体现, 由于硬件描述语言的硬件设计和软件开发具有一定的相似性, 采用My HDL可以使用最新的软件开发技术。
3.3 软硬件设计可以采用同样的开发环境
Python是算法实现的一种理想的语言, 很多算法都由Python实现, 通常算法的软硬件实现由不同工程师来实现, 软件工程师使用Python, 硬件工程师使用通用的硬件描述语言, 例如Verilog或VHDL, 硬件工程师和软件工程师之间存在一条鸿沟, 而采用My HDL, 就可以在同一个Python环境实现算法设计, 仿真和校验。
3.4 其他优点
对于没有一定硬件设计经验的设计者, 通常采用Verilog设计会混淆阻塞和非阻塞赋值, 不清楚Verilog的符号运算, 采用VHDL进行设计又不理解VHDL的信号概念, 会觉得VHDL的类型和位宽转换很繁琐, 但是如果采用基于Python的My HDL包作为设计语言, 这些都将不成为问题。
4 基于Python的软硬件设计流程
在现代系统设计中, 软件工程师采用Python等高级语言, 而硬件系统设计多采用Verilog, VHDL硬件描述语言, 在如何将Python描述的软件映射为相应的硬件上, 软硬件开发者之间的交流存在一道天然的鸿沟, 而采用Python来进行软硬件协同设计就可以解决这一个问题, 基于Python的软硬件协同设计的流程如图1所示。
首先采用Python进行系统设计, 然后根据系统性能要求进行软硬件划分, 对于系统性能要求比较高的部分采用Python的My HDL扩展包的形式来由硬件实现, 同时采用Python来编写硬件测试平台。测试仿真如果不符合系统设计要求可以重新进行软硬件划分, 如果测试仿真结果不正确, 可重新修改。仿真通过后可以用My HDL扩展包自动将Python转换为Verilog代码, 这时的Python测试平台无需修改还可以与转换后的Verilog代码一起进行混合仿真, 如果仿真通过就可以进行硬件的综合, 下载, 测试阶段, 这与传统的硬件设计过程相同。
5 结语
从上面分析可以看出基于Python的My HDL既是一种软硬件协同设计方法, 同时其也是Python的扩展包, 使得整个开发过程仅使用一种Python语言, 并可以很方便地将一个软件算法快速地转换为其相应的硬件实现, 从而完成一个软硬件系统设计。由于Python目前的可综合子集的限制和其本身还处在发展阶段, 基于Python的软硬件设计还主要用于系统的建模方面, 将其用于芯片设计的应用还不是很多, 有研究者比较过My HDL与传统硬件设计语言的实现, 对于小规模的应用优势不是很明显。但是随着现代系统的算法越来越复杂性, 系统规模也不断增大, 相对于传统的软硬件设计方法采用Python来进行软硬件协同设计的优势就会体现出来, 系统设计、仿真、校验的速度会大大提高, 采用Python进行系统设计的产品能更快地进入市场。随着基于Python系统设计方法和工具的发展, 基于Python的软硬件协同设计方法将会有广泛的应用前景。
摘要:针对当前系统设计中软硬件设计者分别采用不同的设计语言存在的天然鸿沟和如何将基于Python的大量软件算法快速地转换为硬件设计的问题, 研究了一种新的基于Python的软硬件协同设计方法。并以基于Python的MyHDL扩展包为例, 重点研究了以Python作为软硬件协同设计、仿真和校验的系统设计流程, 得出基于Python的软硬件协同设计方法能大幅度提高系统设计及算法硬件实现的效率的结论。
关键词:Python,FPGA,软硬件协同设计,硬件加速
参考文献
[1]Intel IT Center.SystemC Version 2.3 user guide[EB/OL].[2012-07-25].http://www.accellera.org/downloads/standards/systemc.
[2]Synopsys.High level synthesis with Synphony C compiler[EB/OL].[2012-08-20].http://www.synopsys.com/Systems/BlockDe sign/HLS/Pages/default.aspx.
[3]Calypto Design Systems.Catapult product family overview[EB/OL].[2012-10-20].http://calypto.com/products/catapult/cata pult_overview.
[4]Python Software Foundation.Python documentation (Python2.7) [EB/OL].[2012-06-10].http://www.python.org.
[5]LOGARAS E, MANOLAKOS E S.SysPy:using Python for pro cessor-centric SoC design[C]//2010 17th IEEE InternationalConference on Electronics, Circuits, and Systems (ICECS) .Athens, Greece:IEEE, 2010:762-765.
[6]ZHANG Mi, TU Shi-liang, CHAI Zhi-lei.PDSDL:a dynamicsystem description language[C]//ISOCC'08.International SoCDesign Conference.Busan, Korea:ISOCC, 2008:204-209.
[7]DECALUWE J.MyHDL:a Python-based hardware descriptionlanguage[J].Linux Journal, 2004, 127 (10) :5-10.
[8]VILLAR J I, JUAN J, BELLIDO M J, et al.Python as a hard ware description language:a case study[C]//2011 VII SouthernConference on Programmable Logic (SPL) .Cordoba, Argenti na:[s.n.], 2011:117-122.
[9]Anon.The MyHDL manual[EB/OL].[2012-06-02].http://www.myhdl.org.
Python技术 篇8
关键词:ArcGIS,制图,数据流,GIS,脚本
0 引言
Arc GIS是由ESRI (美国环境系统研究所) 研发的一款用于地理空间信息采集、加工处理、进行空间分析并为人们生产提供决策的GIS软件, 目前已广泛应用于自然资源管理、自动制图、设施管理、城市和区域规划、交通管理等领域。现如今空间数据处理批量化、流程化已成为GIS发展趋势, Arc GIS中的Model Builder模块为空间数据处理自动化提供了平台, Model Builder为用户提供了创建、编辑和管理模型的界面。用户可以将空间数据、以及Arc Tool Box中的几百个的处理工具拖拽到模型窗口中, 并用连接线将他们串起来, 最终得到的就是针对某个问题的一系列的空间分析处理操作, 模型构建器也可以被认为是一个构建工作流的可视化编程语言。但是在实际应用中Model Builder无法满足所有的需要, 这时需要借助Python语言编写脚本来完成复杂的处理。Python是一种解释型、面向对象、动态数据类型的高级程序设计语言, 它提供了简易的帮助文档, 简单易学且完全免费。在Arc GIS 9.X之后ESRI开始将Python语言引入, 将Arc GIS中绝大部分的空间分析工具封装到Arcgisscripting站点包中, 而从Arc GIS10.0开始, 站点包更变为Arcpy, Arcpy很好的继承了Arcgisscripting, 用户可以借助Python语言调用站点包中的所有工具, 用于自动化处理脚本的开发。
1 Arc GIS Model Builder
许多经验丰富的地理信息系统用户可以通过图形编辑器构建数据流图重复处理数据。某些地理信息系统软件具备扩展程序模块以便设计批量数据处理。与GIS可视化语言相比, 本文则进一步深化阐述地理信息系统可视化编程语言。欧特克 (Autodesk) 公司的Auto CAD三维地图软件可提供工作流设计器用于图形编辑程序。在Arc GIS中, 数据流处理模块名为“Model Builder” (建模工具) 。其真实用途就是把地理数据处理工具按顺序连接起来, 使得前一个工具的输出结果作为下一个工具的输入来源。“Arc Tool Box”是一个工具集, 几乎包括所有空间处理操作。“Geo Processing”作为核心编程模块包含了全部功能 (函数) 。Model Builder (建模工具) 中的数据流模型可以轻易的通过从工具箱 (Arc Tool Box) 界面拖放空间对函数及数据进行设计。Arc GIS中具备了500多种应用工具。当用深灰/浅灰椭圆表示数据时, 则用白色盒子表示空间函数。椭圆表示空间函数的输入和输出数据。图1为一个简单的数据流模型例子。
上述例子的作用是为了改变输入的多边形的数量和形状。首先, 制图模型聚合多个多边形成为一个多边形, 输入的多边形代表该区域过去三年检测到的传染疾病 (图2) 。制图员需要合并代表全部时间的多边形。此外, 地图中所示的多边形边缘比原来的边缘平滑。这项操作在制图学中较为常见。这个任务由制图工具箱操作两个多边形实现。简化、平滑操作应用于输出聚合多边形。
一般来说, 任何输入数据都可以由该模型处理。该模型可处理批量数据。用户最终可获得一个适合于地图的多边形。图2显示了输入3个多边形后最终如何变化成一个为地图所用的光滑图形。
2 地理信息系统中Python语言脚本
Python脚本语言是一种免费软件的编程语言。Python是一种解释型的、通用的高级编程语言。设计理念强调代码可读性。因此, Python有非常清晰的语法。最新版本的Arc GIS 10.1支持2.7版本的Python。尽管它不是Python的最新版本, 但它在Arc GIS里是稳定的脚本。所有的方法在地理处理器模型和手册中都有详细的记录。这使得Python对于终端用户极其方便。在建模工具中, Python比模型具备更多优势, 例如循环 (for, while) 、决策 (条件) 这样的基础程序结构都可以得到较好的运用。此外, 它可以避免程序运行过程中产生错误。所有意想不到的错误几乎可以通过在Python结构中编程“尝试排除”来避免。此外, 可添加通知消息到用户窗口反应批量数据处理进程。事实上, 输出信息里可将重点标注出来。
在Arc GIS中可通过两种方式创建Python脚本。第一种方式是将建模工具现有模型输出为Python脚本, 第二种方法是直接在一个集成开发环境中创建一个脚本。对于初学者而言, 第一种方法相对第二种方法来说更为简单。
2.1 输出模型
图3显示将图1中模型导出Python脚本。自动输出的Python程序附带导出时间以及一些简单的注释以及程序调用接口名称, Arcpy包含所有地理处理方法的程序库。随后, 自动化输出创建代码以便脚本输入参数 (输入和输出特征类的名称和位置) 。最后, 添加地理数据处理方法与参数:
arcpy.Aggregate Polygons_cartography () ,
arcpy.Simplify Polygon_cartography () and
arcpy.Smooth Polygon_cartography () .
其优势在于脚本涵盖了全部函数, 它可作为其他Python扩展的基础。
2.2 集成开发环境中创建脚本
在集成开发环境中编写脚本。集成开发环境优势在于语法突显, 命令自动化执行, 智能缩进以及综合调试功能 (步进, 开启断点检视窗口) 。局部脚本的结果显示在集成开发环境的互动窗口。Python Win是脚本集成开发环境的另一个例子。图3是脚本编辑器窗口。地理编辑器中某些方法只能通过脚本实现, 例如列举法。Python列举法返回的所有文件名或栅格数据集在硬盘上的一个目录。这是直接在集成开发环境中编写脚本的一个原因。
3 运行Python脚本
Model Builder创建的数据处理模型及Python编写的脚本程序都可以添加到Arc Tool Box工具箱里形成用户自己的工具集。自定义工具的名称可以按照需求来定义。一个工具箱可包含若干个模型及脚本。建模工具里的模型以扩展工具的模式储存在自定义工具箱里。Python被单独储存为PY文件。工具箱通过链接路径将他们联系起来。如图4所示, 将用户自定义的Python脚本程序添加到系统工具箱Arc Tool Box里面。
如图5所示的界面, 是用户将数据处理程序添加到Arc Tool Box时根据需要设置的工具参数。具有帮助用户在使用该工具时能快速阅读工具的属性, 以及需要设置的参数, 而且可以了解每个参数的值域。
4 修正Python脚本
建模工具虽然方便高效, 但是不能满足所有需求。而脚本语言可充分利用Python的程序命令和函数。可以解决Model Builder不能处理的问题。当进行数字高程模型研究时, 可自动创建480多种的测试数据集。这样一来各种插值方法的输入参数就必须从文本文件中读取。这些操作对于脚本语言来说是很容易实现的。
Arc GIS对DEM名称字数限定为12位。我们需要对每组实验数据进行命名, 如果手动来处理会变得非常麻烦, 使用Model Builder来处理也是非常繁琐, 这时使用脚本语言来处理该问题就变得十分简单, 只需通过一个变量来控制每组数据最后的编号即可实现。
建模工具Model Builder可以实现Arc GIS数据批量处理功能。并且导出的模型代码可广泛应用于地理数据处理方法。但是这样一来运行效率变得较低。Python在脚本运行时需要对每个命令进行解释。因此, 脚本运行速度相对而言不如模型快。Arc GIS的基本功能也可以基于Arc Objects以另一种方式进行开发, 通过使用应用程序接口中将产生:COM、.NET、Java和c++。
5 结论
使用Arc GIS处理空间数据时可以通过模型设计器 (Model Builder) 来创建流程化处理模型。也可以使用Python语言编写脚本来进行系统工具的优化。这两种方式对于数据量较大、重复性工作较多的情况十分有效。将设计好的模型转换为Python语言可以用于后续更复杂的处理程序。Python脚本除了要求用户具备一定的编程能力外, 还应当具备对一些特殊地理处理方法的理解。Python具有非常清晰的语法并且提供了一个集成开发环境。文章中从地图学领域举了三个例子, 说明脚本在Arc GIS软件的可用性。Python脚本未来对Arc GIS用户非常有用。此外, 脚本可大幅度减少手动处理数据。
参考文献
[1]Z.Dobesova."Visual programming language in geographic information systems", NAUN/IEEE.AM International Conferences, WSEAS Press, Prague, 2011, in press.
[2]What is Python?Executive Summary.Python documentation[N].Python Software Foundation, 2011-08-1.
[3]ESRI.Geoprocessor Programming Model Arc GIS 9.3 2009[M].2010, 8 (19) .
[4]Z.Dobesova, “Automatic generation of digital elevation models using Python scripts”, Conference Proceedings SGEM 2011, 11th International Multidisciplinary Scientific Geo Conference.STEF92 Technology Ltd., Sofia, Bulgaria, 2011, ISSN 1314-2704, pp.599-604.
[5]Z.Dobesova, T.Valent, “Program Extension for Diagram Maps”.Geodesy and Cartography, 37 (01) , Taylor&Francis, 2011, pp.22-28.ISSN:2029-7009.
[6]孙广磊.征服Python——语言基础与典型应用[M].北京:人民邮电出版社, 2007.
[7]王亚卿, 方龙.浅析Python在地图处理中的应用[J].华东森林经理, 2008 (1) :83-84.
[8]彭海波, 向洪普.基于Python的空间数据批量处理方法[J].测绘与空间地理信息, 2011.
【Python技术】推荐阅读:
Python编程07-15
Python脚本06-13
Python语言06-26
python语法汇总08-03
python基础总结09-11
考勤系统Python09-22
python运动数据分析10-10
python采集百度百科的方法08-01
HTTP协议以及Python开发技巧10-15
python计数排序和基数排序算法实例09-15