科学网

 找回密码
  注册

tag 标签: Python

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

高效科学计算程序设计
alwin 2011-4-10 18:30
高效科学计算程序设计
1、科学计算中的突出问题及需求 概括一般科学计算的特点,主要包括四方面: 数值计算种类多 对于某个问题的求解,可能需要不同种类的函数,如三角函数,积分函数,概率统计函数以及某些特殊函数。 需要大量数值计算库支持。 计算密集型问题突出 在大量复杂问题,需要的时间可能指数增长,时间密集性任务往往使程序运行效率低下。计算任务的时间瓶颈必须特殊处理。 数据图形化 数据结果的图形化,有利于结论的表现,是实验分析的重要手段。 UI设计需求 程序功能稳定后,需求友好的UI设计,从而提高程序的可用性及普及度。 一般科学计算程序设计很难兼顾以上四部分,大多是独立完成。如调用数据计算库可能会用到GNU Scientific Library;为了并行化处理问题,可能要特别地求助MPI或openMP实现;数据的视图化可能要另外通过Matlab或mathematica操作来实现;对于UI的设计,使用Labview这样的专用工具但又对其他方面的调用显得很不方便。如果能兼顾以上四方面的需求,做到程序设计中的数据流传递平滑过渡,函数无缝调用,那么程序设计的效率将大大提高,因为消除了很多耗时的人工操作,低效率的接口调用,程序的整体显得统一高效。以python语言为中心的程序设计很容易达到这个目的,而传统的Fortran语言望尘莫及。 2、以python为中心的高效科学计算程序设计框架 根据现有科学计算的特点,设计出一套以python语言为中心的高效程序设计框架。 本框架主要将时间密集型的任务用c或c++实现,这一部集中在对时间瓶颈工作任务的处理,在通过swig将其包装(wrap)起来让python去调用;而numpy是python的一个非常有效的数值计算基础库,增强的库还有scipy,它们对数值计算的处理非常高效;Matplotlib是一个类似matlab工具的python数据绘图库,它又是建立在numpy基础上,可以实现数值计算的结果直接视图化,matplotlib通过提供QT的backend,这样可使其和Qt的binding库pyQT无缝交互。整个系统框架将科学计算中的突出问题集中解决,并且处理一体化完成。 3、测试用例 为了验证以python为中心的科学计算的高效率,采用上节提出的设计框架,以统计物理中的一个经典2D Ising模型为对象,设计程序模拟研究其在Generalized Canonical ensemble下的行为,其中还包括Wolff Cluster的实现。 本实验中,时间密集型操作在于大量Monte Carlo采样,这部分是用c++实现作为库;采样的数据又要经过复杂的统计分析,这是通过扩展的numpy类实现。程序的最上层是采用PyQT为框架,实现基本的UI控件,内嵌一个matplotlab backend 绘图控件将数据结果实时显示出来,而该控件又调用swig包装的C++ Ising 类实现Ising 模型上的核心算法。本程序统一了各部分需求,方便了通过UI控制,进行高效实验模拟和研究分析。【 youtube在线演示 】 4、分析讨论 4.1、关于时间效率 python语言以数据结构高级为最大特点,当然难免有些时间开销,但对于CPython,它提供c/c++库的直接调用,当接口调用时间相对于c/c++库函数的运行时间很小的时候,那么整个时间将取决于c/c++库函数的运行时间,显然把时间密集性任务放在c/c++库中实现,将使得python和c/c++几乎有相同的时间效率。【测试】c/c++作为一种中级程序设计语言很好地补充了相对高级的python语言在时间效率上的不足。python能够调用c/c++库,那么在python的框架下实现MPI和openMP的并行化调用也一定可行。如果对时间效率问题不是特别强的要求,完全可以用c或者c++代替Fortran等专业语言,毕竟c/c++更灵活更普及。(注意python也可以调用fortran生成的库)。 4.2、为什么选择swig和numpy swig是一种通用的程序转译工具,可以将c或c++转换为perl,python,java,r等多种语言的调用,比起Qt提供的SIP专用转译工具更强大,而且python的setup util可以自动识别swig格式的文件后缀(.i),自动调用swig转换为python wrap库。 numpy是一种基于C++实现的python数据库,数据结果和函数功能非常强大,用户可以通过C++进行增强,再通过swig可以很方便的实现python调用。 4.3、为什么选择PyQt 对于python的UI设计除了功能最简单的Tkinter外,还可以调用wxpython来实现,wxpython在ubuntu下的python也被当作默认库安装了。但wxpython相对PyQT有几个不足: Qt/PyQt的设计文档远远比wxpython丰富,如KDE就是基于Qt的设计; PyQT可以通过QDesigner或者eclipse插件可视化地实现UI设计,而wxpython只能凭空构思; wxpython的系统兼容上不如PyQT好,不可用在MAC os上,更不能应用在嵌入式的系统下,而Python和QT都是跨平台实现,因此Pyqt可到处通用,而且其还有GPL版权。 wxpython面向轻量级的应用,而Qt/PyQT内部数据结构和框架丰富适合面向大型项目应用,而类似于PyQt基于LGPL的PySide库还尚不完善。 5、总结 Python语言强大的数据结构,使得程序设计非常高效率(2-3倍);丰富的库函数无所不能,在 科学计算方面 功能也逐渐强大起来。 本文设计的系统框架能够满足一般性需求,兼顾了时间效率和数据处理的能力,着眼于程序设计的整体进度。 6、相关链接 从Qt到python:科学计算软件的界面开发 (原文为本文作者在“科学网博客”上所写,后由于退出原因被删除,网络上有些转载,本文可以看做其后续的深入讨论) 用Python做科学计算 非常好的PyQT入门tutorial ,step by step PyQt4 Class Reference 2016年4月14日隐藏
个人分类: 软件技术|4439 次阅读|0 个评论
[转载]用C语言扩展Python的功能
pcabaqus 2011-4-6 14:41
简介: Pyton和C分别有着各自的优缺点,用Python开发程序速度快,可靠性高,并且有许多现成模块可供使用,但执行速度相对较慢;C语言则正好相反,其执行速度快,但开发效率低。为了充分利用两种语言各自的优点,比较好的做法是用Python开发整个软件框架,而用C语言实现其关键模块。本文介绍如何利用C语言来扩展Python的功能,并辅以具体的实例讲述如何编写Python的扩展模块。 一、简介 Python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且还表现在其良好的可扩展性上,正因如此,Python已经开始受到越来越多人的青睐,并且被屡屡成功地应用于各类大型软件系统的开发过程中。 与其它普通脚本语言有所不同,Python程序员可以借助Python语言提供的API,使用C或者C++来对Python进行功能性扩展,从而即可以利用Python方便灵活的语法和功能,又可以获得与C或者C++几乎相同的执行性能。执行速度慢是几乎所有脚本语言都具有的共性,也是倍受人们指责的一个重要因素,Python则通过与C语言的有机结合巧妙地解决了这一问题,从而使脚本语言的应用范围得到了很大扩展。 在用Python开发实际软件系统时,很多时候都需要使用C/C++来对Python进行扩展。最常见的情况是目前已经存在一个用C编写的库,需要在Python语言中使用该库的某些功能,此时就可以借助Python提供的扩展功能来实现。此外,由于Python从本质上讲还是一种脚本语言,某些功能用Python实现可能很难满足实际软件系统对执行效率的要求,此时也可以借助Python提供的扩展功能,将这些关键代码段用C或者C++实现,从而提供程序的执行性能。 本文主要介绍Python提供的C语言扩展接口,以及如何使用这些接口和C/C++语言来对Python进行功能性扩展,并辅以具体的实例讲述如何实现Python的功能扩展。 回页首 二、Python的C语言接口 Python是用C语言实现的一种脚本语言,本身具有优良的开放性和可扩展性,并提供了方便灵活的应用程序接口(API),从而使得C/C++程序员能够在各个级别上对Python解释器的功能进行扩展。在使用C/C++对Python进行功能扩展之前,必须首先掌握Python解释所提供的C语言接口。 2.1 Python对象(PyObject) Python是一门面向对象的脚本语言,所有的对象在Python解释器中都被表示成PyObject,PyObject结构包含Python对象的所有成员指针,并且对Python对象的类型信息和引用计数进行维护。在进行Python的扩展编程时,一旦要在C或者C++中对Python对象进行处理,就意味着要维护一个PyObject结构。 在Python的C语言扩展接口中,大部分函数都有一个或者多个参数为PyObject指针类型,并且返回值也大都为PyObject指针。 2.2 引用计数 为了简化内存管理,Python通过引用计数机制实现了自动的垃圾回收功能,Python中的每个对象都有一个引用计数,用来计数该对象在不同场所分别被引用了多少次。每当引用一次Python对象,相应的引用计数就增1,每当消毁一次Python对象,则相应的引用就减1,只有当引用计数为零时,才真正从内存中删除Python对象。 下面的例子说明了Python解释器如何利用引用计数来对Pyhon对象进行管理: 例1:refcount.py class refcount: # etc. r1 = refcount() # 引用计数为1 r2 = r1 # 引用计数为2 del(r1) # 引用计数为1 del(r2) # 引用计数为0,删除对象 在C/C++中处理Python对象时,对引用计数进行正确的维护是一个关键问题,处理不好将很容易产生内存泄漏。Python的C语言接口提供了一些宏来对引用计数进行维护,最常见的是用Py_INCREF()来增加使Python对象的引用计数增1,用Py_DECREF()来使Python对象的引用计数减1。 2.3 数据类型 Python定义了六种数据类型:整型、浮点型、字符串、元组、列表和字典,在使用C语言对Python进行功能扩展时,首先要了解如何在C和Python的数据类型间进行转化。 2.3.1 整型、浮点型和字符串 在Python的C语言扩展中要用到整型、浮点型和字符串这三种数据类型时相对比较简单,只需要知道如何生成和维护它们就可以了。下面的例子给出了如何在C语言中使用Python的这三种数据类型: 例2:typeifs.c // build an integer PyObject* pInt = Py_BuildValue("i", 2003); assert(PyInt_Check(pInt)); int i = PyInt_AsLong(pInt); Py_DECREF(pInt); // build a float PyObject* pFloat = Py_BuildValue("f", 3.14f); assert(PyFloat_Check(pFloat)); float f = PyFloat_AsDouble(pFloat); Py_DECREF(pFloat); // build a string PyObject* pString = Py_BuildValue("s", "Python"); assert(PyString_Check(pString); int nLen = PyString_Size(pString); char* s = PyString_AsString(pString); Py_DECREF(pString); 2.3.2 元组 Python语言中的元组是一个长度固定的数组,当Python解释器调用C语言扩展中的方法时,所有非关键字(non-keyword)参数都以元组方式进行传递。下面的例子示范了如何在C语言中使用Python的元组类型: 例3:typetuple.c // create the tuple PyObject* pTuple = PyTuple_New(3); assert(PyTuple_Check(pTuple)); assert(PyTuple_Size(pTuple) == 3); // set the item PyTuple_SetItem(pTuple, 0, Py_BuildValue("i", 2003)); PyTuple_SetItem(pTuple, 1, Py_BuildValue("f", 3.14f)); PyTuple_SetItem(pTuple, 2, Py_BuildValue("s", "Python")); // parse tuple items int i; float f; char *s; if (!PyArg_ParseTuple(pTuple, "ifs", i, f, s)) PyErr_SetString(PyExc_TypeError, "invalid parameter"); // cleanup Py_DECREF(pTuple); 2.3.3 列表 Python语言中的列表是一个长度可变的数组,列表比元组更为灵活,使用列表可以对其存储的Python对象进行随机访问。下面的例子示范了如何在C语言中使用Python的列表类型: 例4:typelist.c // create the list PyObject* pList = PyList_New(3); // new reference assert(PyList_Check(pList)); // set some initial values for(int i = 0; i 3; ++i) PyList_SetItem(pList, i, Py_BuildValue("i", i)); // insert an item PyList_Insert(pList, 2, Py_BuildValue("s", "inserted")); // append an item PyList_Append(pList, Py_BuildValue("s", "appended")); // sort the list PyList_Sort(pList); // reverse the list PyList_Reverse(pList); // fetch and manipulate a list slice PyObject* pSlice = PyList_GetSlice(pList, 2, 4); // new reference for(int j = 0; j PyList_Size(pSlice); ++j) { PyObject *pValue = PyList_GetItem(pList, j); assert(pValue); } Py_DECREF(pSlice); // cleanup Py_DECREF(pList); 2.3.4 字典 Python语言中的字典是一个根据关键字进行访问的数据类型。下面的例子示范了如何在C语言中使用Python的字典类型: 例5:typedic.c // create the dictionary PyObject* pDict = PyDict_New(); // new reference assert(PyDict_Check(pDict)); // add a few named values PyDict_SetItemString(pDict, "first", Py_BuildValue("i", 2003)); PyDict_SetItemString(pDict, "second", Py_BuildValue("f", 3.14f)); // enumerate all named values PyObject* pKeys = PyDict_Keys(); // new reference for(int i = 0; i PyList_Size(pKeys); ++i) { PyObject *pKey = PyList_GetItem(pKeys, i); PyObject *pValue = PyDict_GetItem(pDict, pKey); assert(pValue); } Py_DECREF(pKeys); // remove a named value PyDict_DelItemString(pDict, "second"); // cleanup Py_DECREF(pDict); 回页首 三、Python的C语言扩展 3.1 模块封装 在了解了Python的C语言接口后,就可以利用Python解释器提供的这些接口来编写Python的C语言扩展,假设有如下一个C语言函数: 例6:example.c int fact(int n) { if (n = 1) return 1; else return n * fact(n - 1); } 该函数的功能是计算某个给定自然数的阶乘,如果想在Python解释器中调用该函数,则应该首先将其实现为Python中的一个模块,这需要编写相应的封装接口,如下所示: 例7: wrap.c #include Python.h PyObject* wrap_fact(PyObject* self, PyObject* args) { int n, result; if (! PyArg_ParseTuple(args, "i:fact", n)) return NULL; result = fact(n); return Py_BuildValue("i", result); } static PyMethodDef exampleMethods = { {"fact", wrap_fact, METH_VARARGS, "Caculate N!"}, {NULL, NULL} }; 方法列表中的每项由四个部分组成:方法名、导出函数、参数传递方式和方法描述。方法名是从Python解释器中调用该方法时所使用的名字。参数传递方式则规定了Python向C函数传递参数的具体形式,可选的两种方式是METH_VARARGS和METH_KEYWORDS,其中METH_VARARGS是参数传递的标准形式,它通过Python的元组在Python解释器和C函数之间传递参数,若采用METH_KEYWORD方式,则Python解释器和C函数之间将通过Python的字典类型在两者之间进行参数传递。 3.4 初始化函数 所有的Python扩展模块都必须要有一个初始化函数,以便Python解释器能够对模块进行正确的初始化。Python解释器规定所有的初始化函数的函数名都必须以init开头,并加上模块的名字。对于模块example来说,则相应的初始化函数为: void initexample() { PyObject* m; m = Py_InitModule("example", exampleMethods); } 当Python解释器需要导入该模块时,将根据该模块的名称查找相应的初始化函数,一旦找到则调用该函数进行相应的初始化工作,初始化函数则通过调用Python的C语言扩展接口所提供的函数Py_InitModule(),来向Python解释器注册该模块中所有可以用到的方法。 3.5 编译链接 要在Python解释器中使用C语言编写的扩展模块,必须将其编译成动态链接库的形式。下面以RedHat Linux 8.0为例,介绍如何将C编写的Python扩展模块编译成动态链接库: $ gcc -fpic -c -I/usr/include/python2.2 \ -I /usr/lib/python2.2/config \ example.c wrapper.c $ gcc -shared -o example.so example.o wrapper.o 3.6 引入Python解释器 当生成Python扩展模块的动态链接库后,就可以在Python解释器中使用该扩展模块了,与Python自带的模块一样,扩展模块也是通过import命令引入后再使用的,如下所示: $ python Python 2.2.1 (#1, Aug 30 2002, 12:15:30) on linux2 Type "help", "copyright", "credits" or "license" for more information. import example example.fact(4) 24 回页首 四、结束语 作为一门功能强大的脚本语言,Python将被更加广泛地应用于各个领域。为了克服脚本语言执行速度慢的问题,Python提供了相应的C语言扩展接口,通过将影响执行性能的关键代码用C语言实现,可以很大程度上提高用Python编写的脚本在运行时的速度,从而满足实际需要。 参考资料 可以从Python( http://www.python.org )网站着手了解所有关于Python的内容。 可以在Python网站上找到正式的Python C/API文档( http://www.python.org/doc/current/api/api.html )。 可以在Python网站上找到正式的编写Python扩展模块的文档( http://www.python.org/doc/current/api/api.html )。 关于作者 肖文鹏,是北京理工大学计算机系的一名硕士研究生,主要从事操作系统和分布式计算环境的研究,喜爱Linux和Python。你可以通过 xiaowp@263.net 与他取得联系。
个人分类: 编制程序|3664 次阅读|0 个评论
Python中改变当前工作目录
热度 2 aurora1625 2011-3-13 14:29
import os os.getcwd() # 查看当前工作目录 os.chdir("D:\\Python\\some_other_directory") # 改变目录,注意双引号和反斜杠 顺便推荐一下Dreampie这个Python编辑器,非常好用
个人分类: Python|43896 次阅读|1 个评论
Pyhton2.6和networkx的安装
热度 5 lulili 2011-2-27 19:48
昨天按照阎小勇老师博客《复杂网络分析库NetworkX学习笔记(1):入门 》中介绍的方法了成功安装了Python2.6和NetWorkX。在安装过程中了遇到了一些小问题,考虑到一些同学在安装过程中可能也会遇到类似的问题,现把具体的安装方法总结一下,也是对阎老师介绍方法的一些补充。 安装Python2.6和NetWorkX,一共需要下载以下5个软件: 1.下载python-2.6.6.msi 下载地址 http://www.python.org/ftp/python/2.6.6/python-2.6.6.msi 2.下载pywin32-214.win32-py2.6.exe 下载地址 http://starship.python.net/crew/mhammond/win32/Downloads.html 3.下载matplotlib和numpy 下载地址 http://sourceforge.net/projects/matplotlib/ 下载地址 http://sourceforge.net/projects/numpy/files/ 4.下载setuptools-0.6c11.win32-py2.6.exe 下载地址 http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11.win32-py2.6.exe 5.下载networkx-1.1-py2.6.egg 下载地址 http://pypi.python.org/pypi/networkx/ 下载完成后,首先安装python-2.6.6.msi, 注意这个必须是第一个安装的。 安装很简单, 一路next就行了,然后依次安装pywin32-214.win32-py2.6.exe和matplotlib和numpy,也是一路next。第四个安装setuptools-0.6c11.win32-py2.6.exe, 这个是必须安装的。 如果不安装setuptools,就会在用 easyinstall安装networkx时就找不到easy_install.py,也就导致networkx无法正常安装。 只要正确完成以上软件的安装,就可按照阎老师介绍的easyinstall方法成功安装NetWorkX。具体可参照阎老师的博客。 第一次发博没有经验,可能写得不够准确详细,还请前辈们多多指教!
个人分类: 复杂网络|9811 次阅读|5 个评论
[转载]python资源
csxyllx 2011-1-14 19:25
Python基本安装: * http://www.python.org/ 官方标准Python开发包和支持环境,同时也是Python的官方网站; * http://www.activestate.com/ 集成多个有用插件的强大非官方版本,特别是针对Windows环境有不少改进; Python文档: * http://www.python.org/doc/current/lib/lib.html Python库参考手册。 * http://www.byteofpython.info/ 可以代替Tutorial使用,有中文译版的入门书籍。 * http://diveintopython.org/ 一本比较全面易懂的入门书,中文版翻译最近进步为很及时的5.4了。 * http://www.python.org/peps/pep-0008.html 建议采用的Python编码风格。 * http://doc.zoomquiet.org/ 包括Python内容的一个挺全面的文档集。 常用插件: * http://www.pfdubois.com/numpy/ Python的数学运算库,有时候一些别的库也会调用里面的一些功能,比如数组什么的; * http://www.pythonware.com/products/pil/ Python下著名的图像处理库Pil; * http://simpy.sourceforge.net/ 利用Python进行仿真、模拟的解决方案; * Matplotlib 据说是一个用来绘制二维图形的Python模块,它克隆了许多Matlab中的函数, 用以帮助Python用户轻松获得高质量(达到出版水平)的二维图形; * http://www.amk.ca/python/code/crypto python的加解密扩展模块; * http://cjkpython.i18n.org/ 提供与python有关的CJK语言支持功能:转码、显示之类。 * Psyco、Pyrex:两个用于提高Python代码运行效率的解决方案; * Pyflakes、PyChecker、PyLint:都是用来做Python代码语法检查的工具。 * http://wxpython.sourceforge.net/ 基于wxWindows的易用且强大的图形界面开发包wxPython; * http://www.pygame.org/ 用Python帮助开发游戏的库,也可以用这个来播放视频或者音频什么的,大概依靠的是SDL; * http://starship.python.net/crew/theller/py2exe/ win下将Python程序编译为可执行程序的工具,是一个让程序脱离Python运行环境的办法,也可以生成Windows服务或者COM组件。其他能完成Python脚本到可执行文件这个工作的还有Gordon McMillan's Installer、Linux专用的freeze以及py2app、setuptools等。不过此类工具难免与一些模块有一些兼容性的问题,需要现用现测一下。 * 嵌入式数据库:BerkeleyDB的Python版,当然还有其他的好多。 * PEAK提供一些关于超轻量线程框架等基础性重要类库实现。 部分常用工具: * http://www.scons.org/ Java有Ant这个巨火的构建工具,Python的特性允许我们构建更新类型的构建工具,就是scons了。 * Python Sidebar for Mozilla FireFox的一个插件,提供一个用来查看Python文档、函数库的侧边栏。 * IPython 很好用的Python Shell。wxPython发行版还自带了PyCrust、PyShell、PyAlaCarte和PyAlaMode等几个工具,分别是图形界面Shell和代码编辑器等,分别具有不同特点可以根据自己的需要选用。 * Easy Install 快速安装Python模块的易用性解决方案。 推荐资源: * Parnassus山的拱顶 巨大的Python代码库,包罗万象。既可以从上面下载代码参考学习,同时也是与Python有关程序的大列表。 * Python号星际旅行船 著名Python社区,代码、文档、高人这里都有。 * faqts.com的Python程序设计知识数据库 Python程序设计知识库,都是与Python有关的程序设计问题及解决方法。 * 啄木鸟 Pythonic 开源社区 著名的(也可以说是最好的)国内Python开源社区。 代码示例: * http://newedit.tigris.org/technical.htm Limodou的NewEdit编辑器的技术手册,讨论了一些关于插件接口实现、i18实现、wxPython使用有关的问题,值得参考。 其他东西: * http://www.forum.nokia.com/main/0,,034-821,00.html Nokia居然发布了在Series 60系统上运行Python程序(图形界面用wxPython)的库,还有一个Wiki页是关于这个的:http://www.postneo.com/postwiki/moin.cgi/PythonForSeries60 。Python4Symbian这个页面是记录的我的使用经验。 * pyre:使用Python完成高性能计算需求的包,真的可以做到么?还没研究。 * Parallel Python:纯Python的并行计算解决方案。相关中文参考页面 * Pexpect:用Python作为外壳控制其他命令行程序的工具(比如Linux下标准的ftp、telnet程序什么的),还没有测试可用程度如何。 * pyjamas:Google GWT的Python克隆,还处在早期版本阶段。 * Durus:Python的对象数据库。 有意思的东西: * Howie:用Python实现的MSN对话机器人。 * Cankiri:用一个Python脚本实现的屏幕录像机。 参考资料 * ZDNET文章:学习Python语言必备的资源 * Pythonic Web 应用平台对比 * 在wxPython下进行图像处理的经验 (其实,仅使用wxPython也可以完成很多比较基础的图像处理工作,具体可以参照《wxPython in Action》一书的第12节) * 通过win32扩展接口使用Python获得系统进程列表的方法 * 如何获得Python脚本所在的目录位置 * Python的缩进问题 * py2exe使用中遇到的问题 * idle的中文支持问题 * 序列化存储 Python 对象 Python IDE 我的IDE选择经验 * http://www.xored.com Trustudio 一个基于Eclipse的、同时支持Python和PHP的插件,曾经是我最喜欢的Python IDE环境,功能相当全了,不过有些细节不完善以致不大好用。 * http://pydev.sourceforge.net/ 另一个基于Eclipse的,非常棒的Python环境,改进速度非常快,现在是我最喜欢的IDE。 * http://www-900.ibm.com/developerWorks/cn/opensource/os-ecant/index.shtml 用 Eclipse 和 Ant 进行 Python 开发 * http://www.die-offenbachs.de/detlev/eric3.html ERIC3 基于QT实现的不错的PYTHON IDE,支持调试,支持自动补全,甚至也支持重构,曾经在Debian下用它,但图形界面开发主要辅助qt,我倾向wxpython,所以最后还是放弃了这个。 * http://www.scintilla.org/ 同时支持Win和Linux的源代码编辑器,似乎支持Python文件的编辑。 * http://boa-constructor.sourceforge.net/ 著名的基于WxPython的GUI快速生成用的Python IDE,但是开发进度实在太差了 * http://pype.sourceforge.net/ 成熟的Python代码编辑器,号称功能介于EMACS和IDLE之间的编辑器。 * http://www.stani.be/python/spe SPE:号称是一个Full Featured编辑器,集成WxGlade支持GUI设计。
个人分类: python在路上|1617 次阅读|0 个评论
pick模块 2011-01-13
csxyllx 2011-1-14 18:59
marshal和pickle可以用来转换并储存python对象 pickle.dump(obj, file )   序列化对象,并将结果数据流写入到文件对象中。参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。protocol的值还可以是1或2,表示以二进制的形式序列化。 pickle.load(file)   反序列化对象。将文件中的数据解析为一个Python对象。
个人分类: data mining|0 个评论
Python 学习笔记————Numpy
innocent2010 2010-12-23 05:41
个人分类: 未分类|3395 次阅读|0 个评论
VISUM脚本--Python
innocent2010 2010-12-23 05:40
个人分类: 未分类|3348 次阅读|0 个评论
工欲善其事,必先利其器
zyw1983 2010-9-14 23:57
个人分类: 快乐学习|10 次阅读|0 个评论
怎样运行Lagrange软件
热度 3 zjlcas 2010-8-3 14:32
注意! 运行Lagrange软件的指南随后贴出,现在的版本仅供参考。 How to run Lagrange in Windows XP "Lagrange is a Python package implementing likelihood models for geographic range evolution on phylogenetic trees, with methods for inferring rates of dispersal and local extinction and ancestral ranges. " http://code.google.com/p/lagrange/ 1 Download and install Python NumPy and SciPy Lagrange requires Python, NumPy and SciPy, the first step is to download and install these software. Download and install Python2.5 , because SciPy requires this version, it can be downloaded from http://www.python.org/download/ Download and install NumPy and SciPy ,you can down load theexe filesform http://sourceforge.net/project/showfiles.php?group_id=27747 for SciPy http://sourceforge.net/project/showfiles.php?group_id=1369package_id=175103 for NumPi It is strongly recommended that you download the numpy-1.2.1-win32-superpack-python2.5.exe , since the imcompatible problems may exist if you installed a incorrect version. You can visit scipy's website for more detail. http://www.scipy.org/ 2 Copy the Lagrange modules to working directory Assume you have had all the software that Lagrange required installed on your PC. You may seed a directory under C:\Python25 now unzip your lagrange2 .0.1.tar.gz copy all the file in the directory which just unzipped to C:\python25\ 3 Data preparation The python scripts for exercise can be downloaded at http://bodegaphylo.wikispot.org/Biogeography_%28Donoghue_%26_Smith%29 copy the test python script named psychotria.py and psychotria.matrix to python directory, C:\python25\ . 4 Run python scripts in cmd The python scripts can be implement in commander just which just like the DOS , to run the script, begin here: Beginrun type cmd a commander window will appeared just type cd C:\python25\ to change your working directory to test\ and type psychotria.pyresults.txt “results.txt” allowed you to save the results of the scripts in “results.txt” When all are got ready , the python script will be run in your PC
个人分类: 科研笔记|8063 次阅读|5 个评论
[转载]Python读写文件
热度 1 yanxiaoyong 2010-7-19 11:22
转载自: http://edu.codepub.com/2010/0604/23244.php Python中文件操作可以通过open函数,这的确很像C语言中的fopen。通过open函数获取一个file object,然后调用read(),write()等方法对文件进行读写操作。 1.open 使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能 关闭文件。 file_object = open( ' thefile.txt ' ) try : all_the_text = file_object.read( ) finally : file_object.close( ) 注:不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file_object无法执行close()方法。 2.读文件 读文本文件 input = open( ' data ' , ' r ' ) # 第二个参数默认为r input = open( ' data ' ) 读二进制文件 input = open( ' data ' , ' rb ' ) 读取所有内容 file_object = open( ' thefile.txt ' ) try : all_the_text = file_object.read( ) finally : file_object.close( ) 读固定字节 file_object = open( ' abinfile ' , ' rb ' ) try : while True: chunk = file_object.read( 100 ) if not chunk: break do_something_with(chunk) finally : file_object.close( ) 读每行 list_of_all_the_lines = file_object.readlines( ) 如果文件是文本文件,还可以直接遍历文件对象获取每行: for line in file_object: process line 3.写文件 写文本文件 output = open( ' data ' , ' w ' ) 写二进制文件 output = open( ' data ' , ' wb ' ) 追加写文件 output = open( ' data ' , ' w+ ' ) 写数据 file_object = open( ' thefile.txt ' , ' w ' ) file_object.write(all_the_text) file_object.close( ) 写入多行 file_object.writelines(list_of_text_strings) ======================================================================== 文件操作模式有三种: 'r'(read), 'w'(write) 和'a'(append) 文件读取的三种方式: read(), readline(), readlines() read(): 读取文件所有内容,返回一个字符串对象 readline(): 每次读取文件一行 readlines():按行读取文件所有内容,返回一个列表 f = open ( 'test.txt' ) for i in f . readlines ( ) print i
个人分类: Python|11942 次阅读|2 个评论
如何在matplotlib里显示中文
热度 1 summersubdue 2010-7-11 11:56
缺省情况下,matplotlib是无法显示中文的,主要原因是没有指定中文字体(文件)。通过修改matplotlib的unicode_demo(http://matplotlib.sourceforge.net/examples/pylab_examples/unicode_demo.html),将unicode字符串用中文填充,显示的是方块。该问题解决的方法有两种,一个是在python代码中指定字体,另一个是在配置文件matplotlibrc里指定字体。或者两种方法同时使用,在代码中没有显式的指定参数值时用缺省值,包括配置文件matplotlibrc里指定的值,代码里有显式指定的参数值时用代码里指定的值。 方法一:代码中指定中文字体 该方法主要使用matplotlib.font_manager模块 # -*- coding: utf-8 -*- import matplotlib.pyplot as plt import matplotlib zhfont1 = matplotlib.font_manager.FontProperties(fname='/usr/share/fonts/cjkunifonts-ukai/ukai.ttc') plt.xlabel(u横坐标xlabel,fontproperties=zhfont1) 这里使用truetype楷体中文字体文件ukai.ttc。关于系统中安装了哪些中文字体见下面如何确定系统中的中文字体。 方法二:rc文件中指定缺省字体 该方法设置rc文件中的参数,该rc文件为matplotlibrc,查找到该文件后,把该文件复制到$HOME/.matplotlib/文件夹下,在文件中找到#font.family : sans-serif,虽然有注释,但该语句说明font.family的缺省值是sans-serif,这是英文的一大类无衬线字体,线条粗细基本一样,就像中文的黑体,如果font.family设为sans-serif,那就要在下面设置sans-serif对应的具体字体为中文,这需要设置font.sans-serif,缺省的值为 #font.sans-serif : Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif 可见这些字体都是粗细一样的。去掉注释符,添加中文字体AR PL UMing CN得到 font.sans-serif : AR PL UMing CN,Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif axes.unicode_minus : False 这里还设值了axes.unicode_minus为False,不用unicode的负号而是使用连字符(hypen,hyphen),否则坐标轴的负号将显示为方块,这样plt.xlabel(u横坐标xlabel)等语句就可正确显示中文了 上面我们把宋体AR PL UMing CN这个有衬线的宋体字归到了无衬线(sans-serif)的字体族(family)里,严格的说是不恰当的,但linux里的中文字体没有几个,所以只有先解决显示的问题。要使AR PL UMing CN归到有衬线(serif)的字体族(family)里并能正确显示只需多设置一个参数font.family为serif,然后设置font.serif,例如 f ont.family : serif font.serif : AR PL UMing CN,Bitstream Vera Serif, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif 绘图示例 该示例图看上去有点杂乱,其实是利用了matplotlib能在3D坐标轴中添加文字的方法,三段文字起始于三维空间的某一点,然后分别朝着x,y,z三个轴的方向书写,其中系统:fedora 10.....这段文字朝z方向,其他两段文字类似。坐标的标签与刻度有点重叠,主要是因为刻意缩小图像尺寸而没有缩小字体所致。 如何确定系统中的中文字体 不管是以哪种方式,首先都要知道系统里有哪些中文字体文件,在shell里运行fc-list程序 $ fc-list :lang=zh WenQuanYi Zen Hei Mono,文泉驛等寬正黑,文泉驿等宽正黑:style=Medium,中等 AR PL UMing TW:style=Light AR PL UMing HK:style=Light AR PL UMing CN:style=Light AR PL UKai TW MBE:style=Book WenQuanYi Zen Hei,文泉驛正黑,文泉驿正黑:style=Medium,中等 AR PL UKai CN:style=Book AR PL UKai HK:style=Book AR PL UKai TW:style=Book WenQuanYi Bitmap Song:style=Regular AR PL UMing TW MBE:style=Light 这里用fc-list找出语言为zh的字体文件,可见系统里中文字体少的可怜。知道了这些字体,还需要进一步了解这些字体对应的文件,可以运行fc-match程序得到, $ fc-match -v AR PL UKai CN Pattern has 32 elts (size 48) family: AR PL UKai CN(s) familylang: en(s) style: Book(s) stylelang: en(s) fullname: AR PL UKai CN(s) fullnamelang: en(s) slant: 0(i)(s) weight: 80(i)(s) width: 100(i)(s) size: 12(f)(s) pixelsize: 12.5(f)(s) spacing: 90(i)(w) foundry: unknown(s) hintstyle: 3(i)(s) hinting: FcTrue(s) verticallayout: FcFalse(s) autohint: FcFalse(s) globaladvance: FcFalse(w) file: /usr/share/fonts/cjkunifonts-ukai/ukai.ttc(s) index: 0(i)(s) outline: FcTrue(s) scalable: FcTrue(s) dpi: 75(f)(s) scale: 1(f)(s) minspace: FcFalse(w) charset: 0000: 00000000 ffffffff ffffffff 7fffffff 00000000 ffffffff ffffffff ffffffff 0001: ffffffff ffffffff ffffffff ffffffff 00800000 00018003 fffffff0 ff3f3fcf 0002: cfffffff 008fffc0 08130010 00200502 00000608 30000000 2f002fc0 00000c00 02f8: 00000000 08000020 00000001 01000000 00100000 00000040 00002000 00000000 02f9: 00000000 00000000 00000000 00000000 00100000 10040000 00100000 00000000 (s) lang: aa|af|ast|ay|bg|bi|bin|br|bs|ca|ch|co|cs|cy|da|de|el|en|eo|es|et|eu|fi|fj|fo|fr|fur|fy|ga|gd|gl|gn|gv|ho|hr|hu|ia|ibo|id|ie|io|is|it|ki|kl|kum|kw|la|lb|lt|lv|mg|mh|mi|mo|mt|nb|nds|nl|nn|no|nr|nso|ny|oc|om|os|pl|pt|rm|ro|ru|se|sel|shs|sk|sl|sma|smj|smn|so|sq|ss|st|sv|sw|tn|tr|ts|ven|vi|vo|vot|wa|wen|wo|xh|yap|yo|zh-cn|zh-sg|zh-tw|zu(s) fontversion: 13107(i)(s) capability: otlayout:DFLT otlayout:bopo otlayout:cyrl otlayout:grek otlayout:hani otlayout:kana otlayout:latn(s) fontformat: TrueType(s) embeddedbitmap: FcTrue(s) decorative: FcFalse(s) 这里只查阅了字体AR PL UKai CN,可以看到其对应文件/usr/share/fonts/cjkunifonts-ukai/ukai.ttc,其他的字体信息也可以通过该方法查得。
个人分类: 日记|39915 次阅读|1 个评论
[转载]10分钟学会Python
yanxiaoyong 2010-6-23 20:52
按 :这三天密集监考,没有大块的时间干正事,就一口气写了5篇《 复杂网络分析库NetworkX学习笔记 》,看点击量估计会有朋友有兴趣学习这个库,但可能很多朋友都没有接触过Python。我以前也说过,Python一点也不难学,可以说是我接触过的最简单的编程语言了(我前后学用过C、C++、C#、Basic四门语言,现在则主要用Python)。为了方便感兴趣的朋友学习Python,我上网搜索了一些Python教程,大厚本的语法书估计各位都比较忙,也没时间看,我就专找那种速成性的,还真找到一些:有《 24小时学会Python 》、《 1小时学会Python 》,还有这个《 10分钟学会Python 》(英文原版见 http://www.korokithakis.net/tutorials/python )。咱就来最快的吧:10分钟学会它! 以下是转载的全文(向原作者和译者表示感谢):   1. 准备工作   哦,你是要学习Python编程语言但是又苦于找不到一个简洁但是全面 的教程么?这个教程就是要试图在10分钟内让你掌握Python。可能它有点不像一个教程,或者说应该介于教程和cheatsheet[可以快速查找的一 个简单表单,不知道怎么翻译,译注]之间,所以在这里我只能向你展示一些最基本的概念,旨在让你能够快速入门。显然,如果你真要学习一门编程语言,你需要 使用它编码一段时间。我假定你已经有一些熟知的编程知识,因此在这里我就不再讲那些与语言无关的编程知识。教程中的关键字我都让它高亮显示,这样你就可以 一眼就看清楚。另外,为了保持教程的简洁,一些知识就只在代码中展示,只有一些简单的注释。   2. 特性   Python 是一个强类型(也就是类型都是强制指定的),动态,隐式类型的(即,你不需要声明变量),大小写敏感(var和VAR是两个不同的变量),面向对象(一切 皆是对象)的语言。[专业术语翻译有点别扭,译注]   3. 语法   Python 没有命令结束标志,并且,使用缩进来区分程序块。块开始的时候缩进开始,块结束的时候缩进结束。声明需要一个:来引领一个缩进块。注释使用#开始并且只占 一行。多行注释使用多行字符串。赋值使用等号(=),测试是否相等使用两个等号(==)。可以分别使用+=或者-=来增加或者减少变量值。这在多 个数据结构上都适用,包括字符串。你也可以在一行上使用多个变量。举例来说: myvar = 3 myvar += 2 myvar -= 1 This is a multiline comment. The following lines concatenate the two strings. mystring = Hello mystring += world. print mystring Hello world. # This swaps the variables in one line(!). myvar, mystring = mystring, myvar   4. 数据类型   在Python中可用的数据类型有列表、元组以及字典。在集合库中集合 也可用。列表就像是以维数组(但是你还可以有列表的列表),字典就是关联数组(或者叫哈希表),元组就是不可变一维数组(Python中数组可以是任何类 型,因此你可以在列表、字典或者元组中混合使用数字、字符串等数据类型)。在所有的数组类型中第一个元素的标号都是0,负数表示从后向前数,-1则表示最 后一个元素。变量可以指向函数。用法如下: sample = , (a, tuple)] mylist = mylist = List item 1 again mylist = 3.14 mydict = {Key 1: Value 1, 2: 3, pi: 3.14} mydict = 3.14 mytuple = (1, 2, 3) myfunction = len print myfunction(mylist) 你可以使用:取到数组的一个范围,:前留空则表示从第一个元素开始,:后留空则表示直到最 后一个元素。负值表示从后索引(即-1是最后一个元素)。如下所示: mylist = print mylist print mylist print mylist print mylist 5. 字符串   字符串可以使用单引号或者双引号,你可以在使用一个引号的里面嵌套使用另一种引号(也就是说,He said 'hello'.是合法的)。多行字符串则使用三引号(单双皆可)。Python还可以让你设置Unicode编码,语法如下:uThis is a unicode string.使用值填充一个字符串的时候可以使用%(取模运算符)和一个元组。每个%s使用元组中的一个元素替换,从左到右。你还可以使用字典。如下 所示: print Name: %snNumber: %snString: %s % (myclass.name, 3, 3 * -) Name: Poromenos Number: 3 String: --- strString = This is a multiline string. # WARNING: Watch out for the trailing s in %(key)s. print This %(verb)s a %(noun)s. % {noun: test, verb: is} This is a test. 6. 流程控制   流程控制使用while,if,以及for。没有select[和哪种语言对比?不知道。译 注],使用if代替。使用for来列举列表中的元素。要得到一个数字的列表,可以使用range(number)。这些声明的语法如下: rangelist = range(10) print rangelist for number in rangelist:   # Check if number is one of    # the numbers in the tuple.   if number in (3, 4, 7, 9):     # Break terminates a for without     # executing the else clause.      break   else:     # Continue starts the next iteration      # of the loop. It's rather useless here,     # as it's the last statement of the loop.     continue else:   # The else clause is optional and is   # executed only if the loop didn't break.    pass # Do nothing if rangelist == 2:   print The second item (lists are 0-based) is 2 elif rangelist == 3:   print The second item (lists are 0-based) is 3 else:   print Dunno while rangelist == 1:   pass 7. 函数   函数使用def关键字。可选参数在必须参数之后出现,并且可以被赋一默认值。对命名参数而言,参数名参数 名被赋一个值。函数可以返回一个元组(打开元组你就可以实现返回多个值)。Lanbda函数是个特例,它由一个表达式构成。参数使用引用传递,但是可变类 型(元组,列表,数字,字符串等等)不能被改变。举例如下: # arg2 and arg3 are optional, they have default values # if one is not passed (100 and test, respectively). def myfunction(arg1, arg2 = 100, arg3 = test):    return arg3, arg2, arg1 ret1, ret2, ret3 = myfunction(Argument 1, arg3 = Named argument) # Using print with multiple values prints them all, separated by a space. print ret1, ret2, ret3 Named argument 100 Argument 1 # Same as def f(x): return x + 1 functionvar = lambda x: x + 1 print functionvar(1) 8. 类 Python部分支持类的多重继承。私有变量和方法可以使用至少两个_开始并且至少一个_结束来声明,比 如__spam(这只是约定,语言中并没有强制规定)。我们可以给类的实例赋任意的变量。请看下例: class MyClass: common = 10 def __init__(self): self.myvariable = 3 def myfunction(self, arg1, arg2): return self.myvariable # This is the class instantiation classinstance = MyClass() classinstance.myfunction(1, 2) 3 # This variable is shared by all classes. classinstance2 = MyClass() classinstance.common 10 classinstance2.common 10 # Note how we use the class name # instead of the instance. MyClass.common = 30 classinstance.common 30 classinstance2.common 30 # This will not update the variable on the class, # instead it will create a new one on the class # instance and assign the value to that. classinstance.common = 10 classinstance.common 10 classinstance2.common 30 MyClass.common = 50 # This has not changed, because common is # now an instance variable. classinstance.common 10 classinstance2.common 50 # This class inherits from MyClass. Multiple # inheritance is declared as: # class OtherClass(MyClass1, MyClass2, MyClassN) class OtherClass(MyClass): def __init__(self, arg1): self.myvariable = 3 print arg1 classinstance = OtherClass(hello) hello classinstance.myfunction(1, 2) 3 # This class doesn't have a .test member, but # we can add one to the instance anyway. Note # that this will only be a member of classinstance. classinstance.test = 10 classinstance.test 10 9. 异常处理 Python中的异常处理使用try-except 程序块: def somefunction(): try: # Division by zero raises an exception 10 / 0 except ZeroDivisionError: print Oops, invalid. fnExcept() Oops, invalid. 10. 包的导入 使用import 导入外部包,你也可以为单独的函数使用from import 这种形式来导入。下面是一个例子: import random from time import clock randomint = random.randint(1, 100) print randomint 64 11. 文件I/O Python有一个很大的内建库数组来处理文件的读写。下面的例子展示如何使用Python的文件I/O来序列化(使用 pickle把数据结构转换成字符串)。 import pickle mylist = # Open the file C:binary.dat for writing. The letter r before the # filename string is used to prevent backslash escaping. myfile = file(rC:binary.dat, w) pickle.dump(mylist, myfile) myfile.close() myfile = file(rC:text.txt, w) myfile.write(This is a sample string) myfile.close() myfile = file(rC:text.txt) print myfile.read() 'This is a sample string' myfile.close() # Open the file for reading. myfile = file(rC:binary.dat) loadedlist = pickle.load(myfile) myfile.close() print loadedlist 12. 其他 条 件语句可以链接使用。1 a 3检查a是否介于1和3之间。 可以使用del删除数组中的元素或者变量。 List comprehensions[不知怎么翻译,译注]提供一个强大的方法来创建和操作list(列表)。它由一个后跟一个for语句的表达式组成,这个 for语句后跟一个或者多个if@ 或者 @for语句,就像这样: lst1 = lst2 = print print # Check if an item has a specific property. # any returns true if any item in the list is true. any(i % 3 for i in ) True # Check how many items have this property. sum(1 for i in if i == 3) 3 del lst1 print lst1 del lst1 全局变量可以声明在函数外边并且不需要任何特殊 的声明就可以直接读取使用。但是如果你要改变该全局变量的值,你必须在函数的开始使用global关键字声明它,否则,Python将创建一个局部变量并 给他赋值(要特别注意这点,不知道的话很容易犯错)。比如: number = 5 def myfunc(): # This will print 5. print number def anotherfunc(): # This raises an exception because the variable has not # been assigned to before printing. Python knows that it a # value will be assigned to it later and creates a new, local # number instead of accessing the global one. print number number = 3 def yetanotherfunc(): global number # This will correctly change the global. number = 3 13. 结束语 这个教程并没有列出Python的全部细节(甚至连一个子集都算不上)。Python还有一系列的库以及许多其他功能,这就需要你通 过其他途径来学习了,比如很优秀的在线教程Dive into Python。我只希望这个教程能让你对Python快速上手。如果你觉得有什么需要改进或者添加的地方,或者你想看到的其他任何东西(类,错误处理,任 何东西),那就在这里留言吧。
个人分类: Python|9709 次阅读|2 个评论
[转载]用Python做科学计算
yanxiaoyong 2010-5-7 15:32
《用Python做科学计算》是一本非常不错的书,我读过后感觉受益匪浅。在这里帮作者做个广告,该书地址: http://hyry.dip.jp/pydoc/index.html ,填写调查问卷后可获得pdf电子版(问卷填写地址: http://hyry.dip.jp/blogt.py?file=0406.blog ) 。 下边转载该书介绍和目录部分: Python是一种面向对象的、动态的程序设计语言。具有非常简洁而清晰的语法,适合于完成各种高层任务。它既可以用来快速开发程序脚本,也可以用来开发大规模的软件。 随着NumPy, SciPy, Matplotlib, Enthought librarys等众多程序库的开发,Python越来越适合于做科学计算、绘制高质量的2D和3D图像。和科学计算领域最流行的商业软件Matlab相 比,Python是一门通用的程序设计语言,比Matlab所采用的脚本语言的应用范围更广泛,有更多的程序库的支持。虽然Matlab中的许多高级功能 和toolbox目前还是无法替代的,不过在日常的科研开发之中仍然有很多的工作是可以用Python代劳的。 本书将介绍如何用Python开发科学计算的应用程序,除了介绍数值计算之外,我们还将着重介绍如何制作交互式的2D、3D图像;如何设计精巧的程序界面;如何和C语言所编写的高速计算程序结合;如何编写声音、图像处理算法。 阅读本书你需要学习过Python语言的一些基础知识,对面向对象的程序开发有所了解。有关Python语言基础的知识,可以参考: 啄木鸟社区的Python图书概览: http://wiki.woodpecker.org.cn/moin/PyBooks 本书中的所有示例均在Windows XP系统下采用Python(x,y)通过测试。如果你觉得安装众多的Python程序库很麻烦,不妨下载安装Python(x,y)。请阅读: 软件包的安装和介绍 基础篇 科学计算所用到的各种库的入门介绍 软件包的安装和介绍 安装软件包 函数库介绍 NumPy-快速处理数据 ndarray对象 ufunc运算 矩阵运算 文件存取 SciPy-数值计算库 最小二乘拟合 函数最小值 非线性方程组求解 B-Spline样条曲线 数值积分 解常微分方程组 滤波器设计 用Weave嵌入C语言 SymPy-符号运算好帮手 封面上的经典公式 球体体积 matplotlib-绘制精美的图表 快速绘图 绘制多轴图 配置文件 Artist对象 Traits-为Python添加类型定义 背景 Traits是什么 动态添加Trait属性 Property属性 Trait属性监听 TraitsUI-轻松制作用户界面 缺省界面 自定义界面 配置视图 Chaco-交互式图表 面向脚本绘图 面向应用绘图 TVTK-三维可视化数据 TVTK使用简介 TVTK的改进 Mayavi-更方便的可视化 用mlab快速绘图 Mayavi应用程序 将Mayavi嵌入到界面中 Visual-制作3D演示动画 场景、物体和照相机 简单动画 盒子中反弹的球 OpenCV-图像处理和计算机视觉 读写图像和视频文件 手册篇 各个库的用户使用手册的翻译 Traits使用手册 traits traits.ui Visual使用手册 场景窗口 实战篇 用所学到的东西解决实际问题 声音的输入输出 读写Wave文件 用pyAudio播放和录音 用pyMedia播放Mp3 数字信号系统 FIR和IIR滤波器 FIR滤波器设计 IIR滤波器设计 滤波器的频率响应 二次均衡器设计工具 FFT演示程序 FFT知识复习 合成时域信号 三角波FFT演示程序 频域信号处理 观察信号的频谱 快速卷积 Hilbert变换 Ctypes和NumPy 用ctypes加速计算 用ctypes调用DLL numpy对ctypes的支持 自适应滤波器和NLMS模拟 自适应滤波器简介 NLMS计算公式 NumPy实现 DLL函数的编写 ctypes的python接口 单摆和双摆模拟 单摆模拟 双摆模拟 分形与混沌 Mandelbrot集合 迭代函数系统(IFS) L-System分形 附录 关于本书的编写 本书的编写工具 问题与解决方案 ReST使用心得 未解决的问题 最近更新 源程序集 源程序集
个人分类: Python|10794 次阅读|2 个评论
PyQt及Eric的安装
vectorzhang 2010-4-16 13:19
Python是功能很强大的脚本语言。Qt是跨平台的界面开发语言。二者的结合就是PyQt,而Eric则是由Python开发的一款支持PyQt的IDE。Python目前有两个较大的版本,分别是3.x系列和2.x系列(包括2.6.x和2.5.x),支持在win和linux下的开发。由于Python和PyQt都有win下的安装包,此处不再多说。重点说一下Eric的安装。 Eric目前的稳定版本还是Eric4,Eric5的测试版已经出来了。安装Eric4时,如果想要支持中文,还需要下载一个中文包,eric4-i18n-zh_CN.GB2312-4.4-snapshot-20090419.zip(http://sourceforge.net/project/downloading.php?group_id=119070&filename=eric4-i18n-zh_CN.GB2312-4.4-snapshot-20090419.zip&a=64674974)或eric4-i18n-zh_CN.GB2312-4.3.3.zip(http://sourceforge.net/project/downloading.php?group_id=119070&filename=eric4-i18n-zh_CN.GB2312-4.3.3.zip&a=310107)。 先将下载的Eric4的安装包和中文包解压缩到同一个文件夹下,然后可以将这个文件夹移动到其他位置(如Python的安装目录下),运行Eric目录下的install.py,然后运行install-i18n.py安装中文包。安装之后运行eric4.pyw就打开了Eric4。之后进行部分配置工作即可使用。 配置过程如下(以英文为例):Settings–Preferences中,在Eidtor下面,点击APIs,勾选上”CompileAPIsautomatically”,选择Language为”Python”,点击AddfrominstalledAPIs,选择eric4.api或其它你需要的APIs。然后点击下面的”CompileAPIs”,这里会需要点时间。结束后点Apply。然后点击Autocompletion,里面的三个都勾选上。然后再点击QScintilla,选”fromDocumentandAPIfiles”。Apply,然后OK。 如果需要中文的话,可以在Settings-Preferences-Interface-Interface-Language中选择中文,重新启动Eric4之后界面就变成中文了。
个人分类: 生活点滴|11275 次阅读|1 个评论
从C#到Python (pdf整理版)
热度 1 yanxiaoyong 2010-4-5 21:43
本文整理自我在博客园( http://www.cnblogs.com/yanxy/ )上发表的《从C#到Python》系列连载文章。原文从2010年2月25日开始写作,到4月5日全部完工。现将这篇连载整理成pdf文档,方便感兴趣的朋友下载阅读或打印。与原版本相比,这个整理版在语句上略有一些修改,删掉了一些废话,个别章节进行了少许调整。 写这个文章的目的,一方面是整理下我自己学习Python的心得体会,留着以后忘记时备查;另一方面就是希望能对有一定C#编程基础、同时对Python感兴趣的朋友有所帮助。 下载地址: CSharp.2.Python.By.YanXY.pdf 附:全文目录 0 前言:进入Python的世界 1 0.0 写在前面 1 0.1 安装和配置Python开发环境 1 0.2 第一个程序:Hello, world! 1 0.3 认识二者最基本的差异 3 0.4 小结 4 1 变量和数据类型 5 1.1 变量声明和定义 5 1.2 简单数据类型 6 1.3 高级数据类型 8 1.4 小结 12 2 运算符、表达式和流程控制 13 2.1 运算符和表达式 13 2.2 流程控制语句 15 2.4 动态表达式 19 2.5 小结 19 3 函数及函数编程 21 3.1 函数的定义 21 3.2 函数的参数 21 3.3 函数文档 23 3.4 函数编程 24 3.5 小结 26 4 类及面向对象 27 4.1 类的定义与实例化 27 4.2 类的成员变量 27 4.3 类的方法 30 4.4 类的继承 32 4.5 获取对象的信息 33 4.6 本章小结 34 5 模块和包 36 5.1 模块 36 5.2 包 37 5.3 本章小结 38 参考文献(推荐读物) 39
个人分类: Python|21831 次阅读|5 个评论
我的第一个Python程序——删除代码前行号的小工具
热度 1 yanxiaoyong 2010-2-24 09:01
(根据我在 博客园 上连载的四篇文章整理,见 http://yanxy.cnblogs.com ,转载请注明出处) 近两天内的目标是在我博的每个栏目发一篇文章,先都占个坑再说,空着不好看:) 《程序设计》这个栏目里,就从我刚开始学的Python开始吧。 一、引言 Python是一种简单却又强大的语言,我觉得它很适合非专业程序员(特别是科研人员)使用。比如作一些科学计算、数据处理工作等,Python简单的语法和丰富的第三方库可以有效帮助我们提高工作效率。 本文并不主要介绍Python编程的语法,或Python怎么安装、运行、调试等,有兴趣可以到科学网 潘超的 Blog 去看看,那里有一些不错的入门资源。整理这篇文章的主要目的还是想介绍下我学、用Python的一些体会,希望能为大家提供借鉴。我学Python已经有十多天了,现在已经初步掌握了Python。我认为好的学习方法不光是看书或上网查资料,最好是能结合一个实际的例子一点点去深入,这样掌握起来会更快更牢。我在写了Hello World之后,第一个正式编的程序就是下面这个复制代码时去除行号的小工具。 二、分析与设计 现在很多专业计算机技术网站提供的各种源代码前,很多会带有数字行号。我们将这些代码复制下来运行前,要一行一行的去删除前面的代码,即浪费时间又容易出错。如果有一个程序能快速、正确的去除掉代码前的行号,无疑可以节省我们的很多时间(当然我写这个程序花了大概有10几个小时,不过正所谓磨刀不误砍柴工嘛:)。 网上代码前的行号排列大都比较有规律,多数采取如下形式: 1. abc 2. def 或 1 abc 2 def 以及 、1:、(1)等。 因此,要去除行号,首先就是要查找到每行的开头数字及前后分割符号,然后替换掉他们。根据这个思路,很容易写出如下的基本程序框架: 第1步:读取全部n行代码到一个字符串,然后将其转换为包含n个子字符串的数组(或列表); 第2步:对于每一个子字符串,从左至右开始查找每个字符,如果找到一个或多个连续的、可转换为整数的字符,就删除其左侧(包含数字自身位置)的全部字符,并用剩余部分生成一个新字符串。 第3步:如果新字符串左侧有空白或:.])等分割符号,就去除掉它们,再用剩余部分生成一个新字符串。 第4步:将所有处理过的字符串顺序连接起来,得到一个字符串,返回处理行号后的源代码。 三、初步的实现字符串替换 由于Python语言提供了良好的字符串操作功能,因此很快可以写出一个初步的版本: # 代码 1 # -*- coding: utf-8 -*- def CutLineNum(inStr): # 用def关键字声明函数,注意后边加冒号 multiStr = inStr.splitlines(1) # 将多行文本拆分为文本列表 outStr = u '' for singleStr in multiStr: # 循环用for in的结构,后边也加冒号 singleStr = singleStr.lstrip() # 去除左侧空白 i=0 # 迭代算子 for charStr in singleStr: # 从左至右循环查找字符 if charStr.isdigit(): # 如果判断是数字类型 i += 1 # 迭代算子加1 elif i0: # 找到了一个非数字字符,而且前边已有数字字符 singleStr = singleStr # 返回从该位置起的剩余字符 break # 跳出循环 else : # 如果都没有,说明是空行 break # 跳出循环 outStr += singleStr # 将所有行组成完整代码 return outStr # 返回 (注意, # -*- coding: utf-8 -*- 是使用utf-8编码,可以支持中文字符) 以上代码实现了基本程序框架中的1-3步,第4步由于情况较复杂(有的行号后有分割符,有的没有,而且空格数量也不一样),所以暂时用以下函数手工处理: # 代码 2 # -*- coding: utf-8 -*- def CutLeftChar(inStr): outStr = u '' multiStr = inStr.splitlines(1) for singleStr in multiStr: singleStr = singleStr outStr += singleStr return outStr 这样虽然苯拙一点,但至少解决了问题。 四、进一步优化正则表达式替换 正则表达式(Regular Expression,简称Regex),是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。关于Python中正则的入门材料可以参考《 正则表达式30分钟入门教程 》, (不过我觉得30分钟掌握正则表达式还是有困难的,为掌握它我还专门买了一本《精通正则表达式》)。正则表达式是一种处理文本的强大工具,删除代码行号对于它来讲是小菜一叠。下面用正则表达式改写代码1和2,如下: # 代码 3 import re # 导入Python的正则表达式模块 def CutLineNum (inStr): multiStr = inStr.splitlines(1) outStr = u '' p = re.compile(r '\D*\d+\s? |\)]?\s?' ) # 编译正则表达式 for singleLine in multiLine: outStr += p.sub( '' , singleLine,count = 1 ) # 用空字符替换每行的第一个匹配上述正则表达式的字符串 return outStr # 返回 累加后的 字符串 以上代码中的咖色部分就是一个Regex,它的含义是:0或多个非数字字符 + 至少1个数字字符 + 0或1个空白字符 + 0或1个分隔符(包括点、冒号、右圆/方括号,可添加其他分隔符) + 0或1个空白字符。 以上Regex符合大多数代码前行号的规则,删除行号就是用空字符替换掉每行代码中第一个匹配该Regex的字符串(注意只能是第一个,因为程序里可能会存在abc1.open等情况,如果全部匹配就会误删代码)。 五、继续优化采用函数编程 代码3看起来还不够简洁,没关系,Python是一种准函数编程(Functional Programming,FP)语言,做这种简化代码的事情最拿手。在这里,我用到了两种函数编程手段匿名函数(lambda)和一种高阶函数(map),将代码简化至一行,如下: # 代码 4 import re # 导入Python的正则表达式模块 outStr = '' .join(map( lambda x:re.compile(r '\D*\d+\s? |\)]?\s?' ).sub( '' , x,count = 1 ),inStr.splitlines(1)))) 这样代码就只优化到了一行了,是不是很简洁呢?当然代码的可读性受到一定影响。所以函数编程不能滥用。(滥用的例子可以见我的文章《 学习Python列表内涵:一行代码搞定双倍超立方数计算 》)。函数编程是个稍微复杂点的问题,我觉得掌握与否均可,所以就不很详细地去解释上述代码了。如果对Python的函数编程感兴趣,可以参考《 可爱的 Python:Python 中的函数编程 》,很不错的一篇文章。 六、完整的程序添加I/O 完整的程序肯定少不了输入输出功能。对于这个去除复制代码行号的小工具,我想到的输入输出方式一共有三种: 1、 文件方式 将复制的代码存为一个文本文件,然后用程序读取它,去掉行号后在写回文件。这种方法应该说是最不方便的,可以算一下自己需要点多少下鼠标麻烦,所以我没有实现它。关于Python的文件操作内容,网上有很多资料,可以搜索一下。 2 、窗口方式 将复制的代码粘贴到一个窗体的文本框里,然后点击按钮去除行号,再从文本框里把处理后的代码复制出来。这是比较常规的做法,我分别用wxPython和PyQt4实现了这项功能,源代码见 http://www.cnblogs.com/yanxy/archive/2010/02/19/YanxyFirstPython.html 。由于GUI编程是个比较复杂的问题,我就不详细展开了,以后有时间再写。 3 、剪贴板方式 复制代码到剪贴板后,启动处理行号程序,直接处理剪贴板内的文本,然后再复制到其他地方。这是最方便的一种方法,而且由于不用构建GUI,代码量也会很少。见下边: # 代码 5 # -*- coding: utf-8 -*- import win32clipboard as c #import 包的时候,如果包名太长,可以用as起一个别名 import win32con as w # 以上两个包都是专门针对windows平台的,注意 import re c.OpenClipboard() # 打开剪贴板 strList = c.GetClipboardData(w.CF_TEXT).splitlines(1) # 读取剪贴板内容到一个字符列表 c.EmptyClipboard() # 清空剪贴板 c.SetClipboardData(w.CF_TEXT, '' .join(map( lambda x:re.compile \ (r '\D*\d+\s? |\)]?\s?' ).sub( '' , x,count = 1 ),strList ))) # 将去处行号后的字符写回剪贴板,此处用到代码 3 c.CloseClipboard() # 关闭剪贴板 七、总结 以上就是我初学Python作的第一个程序,虽然很简单,但在编写这个程序的过程中,我学习到了: 1、Python的基本语法、类型与逻辑控制 2、Python的函数定以及函数编程方法 3、Python的图形用户界面设计(GUI) 4、正则表达式及其在Python中的应用 短时间内就可以学会这么多内容,足以说明Python的简单易学,你也应该能体会到Python的强大吧。此外,在完成这个程序的过程中,我所用到的基本思路是: 1 、由粗到细 先根据功能要求实现程序逻辑框架,然后用你所掌握的最基本方法实现初步版本,先让程序能用。在此基础上,再去看是否有继续优化的可能(从代码简洁性或效率两方面),逐步细化,这时候才是提高的过程。 2 、自内而外 先实现核心算法,再添加外围功能(I/O,GUI等)。有些编程初学者热衷于用IDE去拖拉控件、美化界面等(当然这项工作也是必要的),没有把更多精力集中到核心算法中去,这样不利于真正学好一门语言。 当然这个程序还有很多需要完善的地方,欢迎提出你的意见或建议。 如果需要了解更多关于Python的内容,可访问啄木鸟社区的《 Python 资源索引 》。
个人分类: Python|11974 次阅读|1 个评论
python学习笔记一
lyshaerbin 2010-1-21 15:20
python错误和异常处理 try-except 定义函数def 定义类class 模块是一种组织形式,它将彼此有关系的代码组织到一个个独立的文件当中,当创建一个python源文件时,模块的名字就是不带.py后缀的文件名。导入模块用import module_name;可以通过句点属性来访问模块的方法。 type返回对象的类型 python不支持类似x++或--x这样的前置/后置自增/自减运算 divmod()内建函数把除法和取余运算结合起来,返回一个包含商和余数的元组。 核心模块random:randint( ),两个整型参数,返回二者之间的随机整型;randrange()接受和range函数一样的参数,随机返回range结果的一项;uniform()几乎和randint一样,不过它返回的是二者之间的一个浮点数;random()类似于uniform不过下限恒等于0.0,上限恒等于1.0;choice()随机返回给定序列的一个元素。 序列类型操作符:成员关系操作符(in,not in);连接操作符(+);重复操作符(*);切片操作符( , )
个人分类: 未分类|3525 次阅读|1 个评论
天文计算PyEphem指南
zjlcas 2010-1-17 00:09
PyEphem (http://rhodesmill.org/pyephem/tutorial.html) ( github , Pypi )是Python下的一个软件包,计算准确度很高,可用来计算不同坐标系下太阳、月亮、行星、彗星及人造卫星的位置,亮度,出没时刻,中天时刻等,为天文爱好者制作星历表提供了很大方便。初次接触该软件可能觉得无从下手,本文做简要介绍。 1. 下载和安装软件 1.1 安装Anaconda Python 由于pyephem依赖于NumPy, SciPy等,所以这里建议直接安装Anaconda Python。pyephem 最早是在python2下开发的, 但是已经成功移植到python3下面,所以建议下载和安装anaconda3。 下载Anaconda Python https://anaconda.org/ 。 1.2 安装pyephem 通过开始CMD,通过pip安装 pyephem 输入如下命令: pipinstallephem 1.3 运行Jupyter Notebook 在开始CMD中,输入 jupyter notebook , 在自动打开的浏览器(即 http://localhost:8888/tree )页面的右上角点击 New, 新建一个Jupyter记事本。 点击加号图标, 新建一个代码区域, 将以下各Python代码块拷贝到代码区,点击左侧的运行符号即可。 运行完成后,点击 Filesave as选择.ipynb,保存为Jupyter Notebook。关于运行 Jupyter Notebook, 请参考 知乎上的专栏 。 2 代码举例 2.1 计算2010年1月16日天王星的位置和亮度 importephem u=ephem.Uranus() #天王星 u.compute('2010/1/16') print(u.ra,u.dec,u.mag) #赤经、赤纬、亮度 print(ephem.constellation(u)) #所在星座 #print(u.rise_time) 23:37:29.43-3:14:13.65.9 ('Psc','Pisces') 2.2 计算2010年1月16日木星的位置和亮度 importephem j=ephem.Jupiter('2010/1/16') #木星 n=ephem.Neptune('2010/1/16') #海王星 print(Jupiter) print(RA:,j.ra,,\\nDEC,j.dec,,\\nMAG:,j.mag) print(Neptune)print(RA:,n.ra,,\\nDEC:,n.dec,,\\nMAG:,n.mag) print(SeparationbetweenJupiterandNeptune:,ephem.separation(j,n)) #木星和海王星的角距 Jupiter RA:22:07:54.83, DEC-12:30:01.9, MAG:-1.91 Neptune RA:21:49:56.21, DEC:-13:33:46.0, MAG:7.97 SeparationbetweenJupiterandNeptune4:30:19.5 2.3 计算火星在近日点和远日点速度的差异 importephem defhpos(body):returnbody.hlong,body.hlat ma0=ephem.Mars('1976/05/21') #火星在远日点ma1=ephem.Mars('1976/05/22') print(ephem.separation(hpos(ma0),hpos(ma1))) mp0=ephem.Mars('1975/06/13') #火星在远日点mp1=ephem.Mars('1975/06/14') print(ephem.separation(hpos(mp0),hpos(mp1))) 0:26:11.4 0:38:05.2 2.4 地方时 importephem d=ephem.Date('1984/12/2115:00') ephem.localtime(d) #地方时print(ephem.localtime(d).ctime()) FriDec2123:00:001984 2.5 时间转换 ## importephem d=ephem.Date('1950/2/28') print(d+1) #儒略日 print(ephem.Date(d+1))#年月日时分秒 18321.5 1950/3/100:00:00 2.6 日期转换 importephem ###赋值类型 ###注意时间以1899/12/3112:00:00作为起点 d=ephem.Date(34530.34375)# d=ephem.Date('1994/7/16.84375') d=ephem.Date('1994/7/1620:15') d=ephem.Date((1994,7,16.84375)) d=ephem.Date((1994,7,16,20,15,0)) print('asafloat:%f\\nasastring:%s'%(d,d)) print(d.triple()) #只显示年月日,但是日为小数格式 print(d.tuple()) #显示为tuple asafloat:34530.343750 asastring:1994/7/1620:15:00 (1994,7,16.84375) (1994,7,16,20,15,0.0) 2.7 计算某时刻太阳和月亮的高度和方位 importephem gatech=ephem.Observer()print(gatech) #查看观测者位置信息#2010/1/1516:20:56日环食 gatech.long,gatech.lat='126','40' #观测者位置重新赋值gatech.date='2010/1/1516:20:56' #观测者时间重新赋值 sun,moon=ephem.Sun(),ephem.Moon() sun.compute(gatech) moon.compute(gatech) print(sun.alt,sun.az) print(moon.alt,moon.az) print(ephem.separation((sun.az,sun.alt),(moon.az,moon.alt))) print(sun.size,moon.size,sun.size-moon.size) -69:36:06.824:22:55.8 -69:24:12.612:32:15.7 4:08:44.6 1950.96191406251743.300048828125207.661865234375 2.8 计算每隔五分钟太阳的方位角和高度 importephem gatech.date='1984/5/3100:00' #20:00EDTsun.compute(gatech) foriinrange(8): old_az,old_alt=sun.az,sun.alt gatech.date+=ephem.minute*5. sun.compute(gatech) sep=ephem.separation((old_az,old_alt),(sun.az,sun.alt)) #地平坐标角距 print(gatech.date,sun.alt,sep) print(gatech.next_setting(sun)) print(gatech.next_setting(sun)) print(sun.alt,sun.az) 1984/5/3100:40:0049:09:10.01:09:32.8 1984/5/3110:58:06 1984/5/3110:58:06 -0:15:46.3300:05:46.5 2.9 通过轨道根数计算小行星和彗星的位置和亮度 ##ephemdatabaseformat格式小行星或彗星的轨道根数 yh=ephem.readdb(C/2002Y1(Juels-Holvorcem),e,103.7816, 166.2194,128.8232,242.5695,0.0002609,0.99705756,0.0000, 04/13.2508/2003,2000,g6.5,4.0) yh.compute('2003/4/11') print(yh.name) print(yh.ra,yh.dec) print(ephem.constellation(yh),yh.mag) print(yh) C/2002Y1(Juels-Holvorcem) 0:22:44.5826:49:48.1 ('And','Andromeda')5.96 ephem.EllipticalBody'C/2002Y1(Juels-Holvorcem)'at0x1043dc5b0 2.10 通过人造卫星的轨道根数 计算卫星出没时刻 ##轨道根数为TLE格式 iss=ephem.readtle(ISS(ZARYA),125544U98067A03097.78853147.0002190600000-028403-308652, 22554451.636113.7980000425635.667159.256615.58778559250029) gatech.date='2003/3/23'iss.compute(gatech) print(iss.rise_time,iss.transit_time,iss.set_time) gatech.date='2003/3/238:00'iss.compute(gatech) print(iss.rise_time,iss.transit_time,iss.set_time) 2003/3/2310:48:452003/3/2310:53:092003/3/2310:57:34 2003/3/2310:48:452003/3/2310:53:092003/3/2310:57:34 2.11 计算在不同历元下,恒星的坐标 polaris=ephem.readdb(Polaris,f|M|F7,2:31:48.704,89:15:50.72,2.02,2000) polaris.compute() print(polaris.dec) #默认情况下使用的是电脑的时间 print(ephem.degrees(ephem.degrees('90')-polaris.a_dec)) polaris.compute(epoch='2100') print(polaris.dec) thuban=ephem.readdb(Thuban,f|V|A0,14:4:23.3,64:22:33,3.65,2000) thuban.compute()print(thuban.dec)thuban.compute(epoch='-2800') print(thuban.dec) polaris.compute(epoch='-2800') print(polaris.dec) 89:20:08.2 0:44:09.3 89:20:08.2 64:17:38.4 64:17:38.4 89:20:08.2
个人分类: 特别转载|13262 次阅读|0 个评论
一个删除文件的Python程序
热度 1 xwebsite 2009-11-27 16:46
Python是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定。Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用。它具有简单、易学、免费、开源、可移植性、解释性、面向对象、可扩展性、可嵌入性以及丰富的库等特性,目前的应用范围也非常广泛,如系统编程、图像处理、数据库编程等方面。 Python开发者可以使用文本编辑器(如Windows的记事本等)或者专业的IDE(集成开发环境)来编写程序代码。IDE使得开发者可以很方便地创建、运行、调试Python程序。IDE可以在Python的官方网站( http://www.python.org )下载,目前(2009年9月)最新版本为Python 3.1.1,本文中将以Python 2.6.2为开发平台进行介绍。 关于Python程序的运行,其实一个Python程序就相当于一个应用程序,它不需要经过编译,只需要用户电脑上面安装Python环境即可。要运行一个py程序,直接双击这个py文件即可。一般情况下,没有提示用户输入或控制屏幕显示,打开一个py文件时会突然闪一下马上就退出,这是由于程序运行已经完成了。若需要显示,则要添加一个屏幕暂停的代码: os.system('pause') 在使用这个代码前,需要引用os模块:import os 下面开始介绍删除文件的Python程序设计: 很多软件在运行时会自动创建一些备份文件,在程序退出后又不自动删除备份文件,随着文件数量的增加,每隔一段时间就要清理一下。如果文件数量比较多,手工清理显然比较麻烦。于是可以编写一个Python脚本来完成该任务。如下代码: # -*- coding: cp936 -*- #file:E01.py import os #该函数用于删除文件 def scan(arg, dirname, names): for file in names: if file ==~ or file ==.bak: print 删除文件:, file file=dirname+ \\+file os.remove(file) print 完成! #提示用户输入目录路径 path=raw_input(请输入要删除文件所在目录:(如D:\\temp)) if os.path.exists(path)==False: #检查用户输入的目录是否存在,如果不存在则退出程序 print 输入的目录不存在! os._exit(1) os.path.walk(path, scan, 0) os.system('pause') 运行该程序,它将删除用户指定目录下的以波浪符号(~)开头或以后缀(.bak)结尾的文件。运行结果如下图所示: 下面来分析这段代码。首先,系统操作都在os模型中,所有首先需要导入os模型。然后提示用户输入文件目录,同时检查用户输入的文件目录是否正确。检验目录是否存在使用os.path.exists(path)方法,如果返回True则表示目录存在,如果返回False则表示不存在,则退出程序。退出Python程序采用os._exit(1)方法。os.path.walk()方法是访问目录中的每个目录以及文件,在该方法内调用函数scan。函数scan的参数指定为3个,其中names表示目录内所有文件的名称,为列表类型。然后对于每一个文件检查其文件名是否符合要删除文件名的特征(以波浪符号(~)开头或以后缀(.bak)结尾的文件),如果符合要求,则采用os.remove(file)方法删除。在此值得注意的是,采用os.remove(file)方法删除文件,要求参数file为全路径和文件名,如D:\temp\1.bak。 如果要删除tmp临时文件,只需要将上段代码中的file ==.bak更改为file ==.tmp即可。最后一句(os.system('pause'))表示屏幕暂停。
个人分类: 未分类|6801 次阅读|0 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-26 18:03

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部