资源描述
一、扩展模块
■ 影像扩展模块PIL(单独安装)
影像扩展模块需安装PIL V1.16(与python版本对应)
安装完毕后调用方式为:
import Image # 注意首字母大写!!
im = Image.open(r"d:\000.jpg") # 注意路径字符串的处理
row, col = im.size # 获取影像的尺寸
■ 声音引擎pyTTS扩展模块(单独安装)
下载并安装pytts 3.0(for python 2.5版),然后使用以下代码即可发声!!
import pyTTS # 注意大小写
tts = pyTTS.Create() # 注意首字母大写
tts.Speak("Mission Finished!") # 注意首字母大写
■ Math库(系统自带)
from math import *
1、包含两个常数,pi, e 注意小写
2、包含常用的算术运算:floor, ceil, log, log10, exp, sqrt
3、包含常用的三角运算:sin, cos, tan, asin, acos, atan, degree, radians
注意:1、abs()为系统内置函数;2、numpy 可以替代 math 实现所有功能!!
■ Random库(系统自带)
1、整型随机数:
randint(a, b) # 生成[a, b)的整型浮点数
randrange(a, b, s) # 生成[a, b)的整型浮点数
2、浮点随机数:
random() # 生成[0, 1)的浮点随机数
uniform(a, b) # 生成[a, b)的浮点随机数
■ FTP库(系统自带)
import ftplib
1、ftp服务器的连接
ftp = ftplib.FTP("192.168.209.205") # 连接影响服务器,注意FTP要大写
print ftp.login("sino", "801") # 使用用户名登录
2、路径操作
ftp.cwd("/aaa/bbb//") # 设置当前工作路径
ftp.mkd("/aaa/bbb/ccc//") # 创建路径
ftp.rmk("/aaa/bbb/ccc//") # 删除路径
ftp.pmd("/aaa/bbb//") # 返回当前路径名
3、文件操作
ftp.rename(...) # 文件更名
ftp.delete(...) # 文件删除
二、数组/矩阵处理
早期有个包叫Numeric,后来有人写了numarray替代它,很快有人写了个numpy把两个包都替换了,现在有人在Numpy的基础上写了个Scipy,这个咚咚不错,可以完成80%的Matlab工作!!
numpy是python用于科学计算的扩展模块,numpy提供ndarray和ufunc两个对象,主要提供数组对象、数组函数和傅立叶变换相关函数,Scipy则提供了更多计算工具。
注意:scipy库依赖于numpy库,必须先安装numpy才能使用!!
1、 数组的定义
numpy中同时提供了array数组和matrix矩阵对象,使用时容易弄混。
import numpy as np # 数组对象为array对象,而不是普通列表对象!!
import scipy as sp
a = np.array([[1,2],[3,4]],dtype=np.float) # 通过列表创建数组
a = np.array(((1,2,3),(4,5,6))) # 通过元组创建数组,效果相同
a = np.mat([[1,2,3],[4,5,6]]) # 通过列表创建矩阵
a = np.mat(((1,2,3),(4,5,6))) # 通过元组创建矩阵
a = np.mat(array([[1,2,3],[4,5,6]])) # 通过数组创建数组
b = np.arange(30) # 通过类似range()创建一维数组
b = np.arange(2, 3, 0.1) # 通过(起点,终点,步长)创建数组
b = np.linspace(2, 3, 10) # 通过(起点,终点,个数)创建线性数组
b = np.logspace(2, 3, 5) # 通过(起点,终点,个数)创建指数数组,很少用
c = np.zeros((3,5)) # 通过元组创建零矩阵
c = np.zeros_like(a) # 通过类似创建
c = np.ones((3,5)) # 通过元组创建一矩阵
c = np.ones_like(a) # 通过类似创建
c = np.eye(3,5) # 注意单位阵创建方法,不是元组!!
d = np.diag(a) # 获取矩阵a的对角阵
d = np.tri(3, 5) # 生成3*5的下三角阵
d = np.tril(a) # 获取矩阵a的下三角阵
d = np.triu(a) # 获取矩阵a的上三角阵
2、 数组常用属性
a = np.array([[1, 2, 3, 4],[5, 6, 7, 8], [9, 10, 11, 12]])
a.ndim # 数组的维数,一维数组=1,二维数组=2
a.dtype # dtype('int32'),获取数组类型
a.size # 12, 获取数组总元素个数(个数=行*列)
a.itemsize # 数组单个元素所占字节数
a.nbytes # 数组总共所占字节数
a.shape # (3,4), 获取数组的行列数
a.shape = 4, 3 # 将数组重排为4行3列,注意不是转置,且划分前后数组尺寸不变
a.shape = 2, -1 # 使用-1自动计算行/列长度,相当于(2,6)
a.reshape((4, 3)) # 同上,重新划分
3、 数组常用操作
a.real; a.imag # 返回数组的实部,虚部
a.T # 矩阵转置
a.tolist() # 数组转换为列表
a.flatten() # 多维数组转一维数组
a.reshape(2,3) # 一维数组转多维数组,创建新数组,自身不变!!
a.resize(2,3) # 同上,但直接改变自身!!
a.transpose() # 矩阵转置,同a.T
a.max(); a.min(); a.mean() # 获取数组最大值,最小值,平均值
a.sum(); a.prod() # 获取数组所有元素之和,之积
a.cumsum(); a.cumprod() # 获取数组累加求和,累加求积
4、 numpy 可以替换 math 实现所有功能
pi, e # 常数
sin(x); cos(x); tan(x) # 三角函数
arcsin(x); arccos(x); arctan(x) # 反三角函数,注意math库中使用asin, acos, atan
sinh(x); cosh(x); tanh(x) #
arcsinh(x); arccosh(x); arctanh(x)#
exp(x); log(x); log2(x); log10(x) # 以e为底的指数;以e,2,10为底的对数
fix(x); round(x); floor(x); ceil(x) # 舍入函数
sign(x); sqrt(x); square(x); # 符号函数
real(x); imag(x); angle(x); conj(x) # 实部;虚部;角度;共轭复数
三、对话框使用
VB中控件Control采用所见即所得方式,需人工调整对其方式;
python中控件Widget通过系统自动调整对其方式:grid(常用), pack, place。
注:使用TKinter时会出现讨厌的空白窗口,不能自动消除~~
1、主对话框
from Tkinter import * # 注意Tkinter首字母大写
root = Tk() # 创建主窗口对象
root.title("标题") # 修改主窗口标题
root.mainloop() # 显示主窗口
2、使用系统对话框
import tkFileDialog # 使用文件选择对话框
fn = tkFileDialog.askopenfilename() # 注意返回fn为路径全名
import tkMessageBox
tkMessageBox.showinfo("Title", "Message") # 显示信息提示框
tkMessageBox.showwarning("Title", "Message") # 显示警告提示框
tkMessageBox.showerror("Title", "Message") # 显示错误提示框
b = tkMessageBox.askokcancel("Title", "Message") # 显示确定取消提示框,返回1,0
b = tkMessageBox.askyesno("Title", "Message") # 显示是否提示框,返回1,0
b = tkMessageBox.askquestion("Title", "Message") # 显示是否提示框,返回1,0
3、使用widget控件
控件类型包括:Label(单行标签)Message(多行标签)Entry(单行输入框)Text(多行输入框)Button(按钮)
Radiobutton(单选框)CheckButton(多选框)Listbox(列表框)Frame(框架)
TopLevel(窗口)Menu(菜单栏)Canvas(画布)Scrolbar(滚动条)等
控件属性包括:fg(前景色)bg(背景色)font(字体)text(内容)command(事件处理函数)等
wLab = Label(root, text="Show", fg="red") # 创建一个红色文字的标签
wBtn = Button(root, text="OK", command=confirm) # 创建一个OK按钮,点击时调用confirm()函数
注1:颜色设置方式:#RGB, #RRGGBB, #RRRGGGBBB, 如w["fg"]=#FF0000,推荐使用第2种方式(0-255)
四、文件相关操作
■ 文件名操作
import os
fn = "e:\\tmp\\000.txt" # 文件名中必须使用\\
os.path.dirname(fn) # 获取路径名,返回e:\tmp
os.path.basename(fn) # 获取文件名,返回000.txt
os.path.exists(fn) # 判断 文件 或 路径 是否存在,返回true/false
os.path.isdir(fn) # 判断字符串路径是否存在
os.path.isfile(fn) # 判断字符串文件名是否存在
os.path.join("c:/tmp", "000.txt") # 将路径和文件名组合成路径名
三种分离方式
os.path.split(fn) # 按路径分离,返回('e:\\tmp', '000.txt')
os.path.splitdrive(fn) # 按驱动器分离,返回('e:', '\\tmp\\000.txt')
os.path.splitext(fn) # 按后缀名分离,返回('e:\\tmp\\000', '.txt')
■ 文件外部操作
import os
os.mkdir("e:\\0001") # 创建指定路径
os.rmdir("e:\\0001") # 删除指定路径
os.remove("e:\\001.txt") # 删除指定文件
os.rename("e:\\0001", "e:\\0002") # 路径重命名
os.rename("e:\\01.txt", "e:\\02.txt") # 文件重命名
os.path.exists("e:\\") # 判断路径是否存在
os.path.exists("e:\\00.txt") # 判断文件是否存在
ArcGIS的文件操作
gp.exists("e:\\001.shp") # 判断文件是否存在
gp.delete("e:\\001.shp") # 可以将shp相关的文件全部删除
注意:gp不能处理系统外未知文件格式,如自定义的dem格式。
■ 文件读写操作
f1 = open("c:\\temp.txt", "r") # 打开文件,"r"只读,"w"只写,"a"附加,"r+"读写
f2 = open("c:\\temp.txt", "rb") # 以二制方式打开文件,在以上模式后加b,"rb", "wb", "rb+"
s1 = f1.read(100) # 读取指定字节数,不指定字节数将读取整个文件
s2 = f1.readline() # 读取一行
lst = f1.readlines() # 读取所有行到数组
f1.write(s1) # 写入数据,写入行数据必须加"\n"
f1.seek(0) # 定位到文件开始
f1.seek(5, 2) #
f1.close() # 关闭文件,释放资源
注:直接获取文件内容的简单表达:data = file("c:/temp.txt").read(),open是file的别名,用file更直观!!
■ 遍历文件夹下的所有文件
srcPath = r"d:\"
for li in os.listdir(srcPath):
fname = os.path.join(srcPath, li)
if os.path.isfile(fname):
……
■ 二制文件的读写
from struct import *
ss = pack("2h4s", 1, 2, "TEST") # 将数字字符打包为二制码
n = calcsize("2h4s") # 计算二制码字节数
a = unpack("2x1h4x", ss[0:calcsize("2h4s")]) # 将二制码解压,只取第2个数值,其余丢弃
注:
1、二制码读写通常只用到pack, unpack, calcsize三个函数;
2、x填充位,c字符,s字符串,h/H短整型/无符号短整(2B),i/I整型/无符号整型(4B)
l/L长整型/无符号长整(4B),f浮点(4B),d双精度(8B)
3、每个字符前可以加数字表示多个,x表示不输出,注意字节数必须对应否则报错。
■ 获取当前py执行文件路径
fPath = os.path.dirname(sys.argv[0]) # 获取当前py文件路径
五、日期时间处理
日期时间处理有5个核心模块:date, time, datetime, timedelta, tzinfo,通过 from datetime import *导入五个模块。
1、 date模块(很少用)
from datetime import date # 导入date模块
d = date(2009, 6, 15) # 设置日期对象
d = date.today() # 获取当前时间
d.year; d.month; d.day # 获取对象的年,月,日
d.ctime() # 返回长日期字符串,如'Thu Jun 15 00:00:00 2009'
d.format() # 返回 年月日 字符串,如'2009-6-15'
d.isocalendar() # 返回 年月日 元组,如(2009,6,15)
d.isoweekday() # 返回星期,周一至周日分别为1-7
d.weekday() # 返回星期,周一至周日分别为0-6
注:运算操作与datetime相同
2、 time模块(很少用)
from datetime import time # 导入time模块
t = time(18) # 设置时间,分秒可选。不能获取当前时间!!
t.hour; t.minute; t.second # 获取对象的时,分,秒
3、 timedelta模块(便于计算时间差)
from datetime import timedelta # 导入timedelta模块
dd = timedelta(12) # 设置时间差为12天
dd = timedelta(12, 3600) # 设置时间差为12天3600秒
dd = timedelta(12, hours=3, minutes=5, seconds=18) # 设置时间差为12天3时5分18秒
dd.days; dd.seconds # 获取时间差的天数,秒数,注意小时、分秒不能直接获取!!
dd1 + dd2, dd1 - dd2, dd1*3, dd1/3 # 时间差可以进行加、减、乘(天,秒均被乘)、除(天被除,秒不变)
4、 datetime模块[最常用,推荐]
from datetime import datetime # 导入datetime模块
d1 = datetime.now() # 获取当前日期
d1 = datetime.today() # 同上
d1.date() # 获取对象的年月日
d1.year; d1.month; d1.day # 获取对象的年,月,日
d.hour; d.minute; d.second # 获取对象的时,分,秒
d.ctime() # 返回长日期字符串,如'Thu Jun 15 00:00:00 2009'
d.isoformat(' ') # 返回 年月日 字符串,如'2009-6-15 00:00:00',缺省模式用T分隔
d.timetuple() # 返回 离散 元组,如(2009, 6, 15, 0, 0, 0, 0, 166, -1)
d.isocalendar() # 返回 年月日 元组,如(2009,6,15)
d.isoweekday() # 返回星期,周一至周日分别为1-7,√
d.weekday() # 返回星期,周一至周日分别为0-6,不好用!
d1 = date(2012,3,15) # 直接设置日期,d1=date(2012,3,15)
d2 = datetime(2012,3,15) # 直接设置日期时间,d2=datetime(2012,3,15,0,0)
d1 == d2 ; d1 == d2.date() # 前者返回False(不同的对象),后者返回True
a = "2012-3-15 8:05" # 通过字符串输入时间
dt = datetime.strptime(a, "%Y-%m-%d %H:%M")
dt.strftime("%H:%M") # 输出成字符串"8:05"
注意:strptime参数:%Y 四位年;%y 两位年;%m 月份(1-12);%d 日期(1-31);%H 24制小时(0-23);%I 12制小时(1-12);%M 分钟(0-59);%S 秒数(0-59);
s = d2 + timedelta(hours=7, minutes=15) # s=datetime(2012,3,15,7,15), days=3,可以省略只写数字3
e = d2.replace(hour=8, minute=30) # e=datetime(2012,3,15,8,30)
注意:timedelta的关键词有s,replace的关键词没有s!!
s < dt < e # 返回True
d1 - d2 # 两对象之间只能进行减法,比较预算
d1 > d2 # 比较
六、网页处理
网页处理使用HTMLParser模块,该模块有以下方法:
reser() # 重置实例,在初始化时被隐式调用
feed(data) # 处理指定数据
close() # 强制处理所有缓冲数据
handle_starttag(tag, attrs) # 处理开始标记<tag>,其中tag是标记名称,attrs是名称、数值对的属性
handle_startendtag(tag, attrs) # 处理合并标记<tag.../>,同上
handle_endtag(tag) # 处理结束标记</tag>,其中tag是标记名称
handle_data(data) # 处理标记<tag>data</tag>之间数据
handle_comment(data) # 处理注释标记<!-- data -->之间的字符串
handle_decl(decl) # 处理文件开始的声明<! data>之间的内容
注意:tag名称参数是全部转换为小写字母的名称。
1、如果是现有的html文件,一般的处理方式为:
fi = open("E:/Interim/保守配置.htm", "r") # 打开现有的htm文件
data = fi.read().replace(" ", " ") # 读取所有的数据,并替换空格
fi.close() # 关闭文件
pp = MyParser() # 初始化网页处理实例
pp.feed(data) # 处理数据
2、如果直接通过url,一般的处理方式为:
七、网络相关
import socket
socket.gethostname() # 获取当前主机名称,"sino"
socket.gethostbyname("") # 获取指定主机的IP地址
socket.gethostbyname_ex("") # 扩展,返回主要主机名,可选主机名,IP列表
socket.gethostbyaddr("202.165.102.205") # 返回值同ex,通过address方式
socket.getservbyname("http", "tcp") # 返回http服务的端口号(通过tcp协议)
socket.getservbyname("telnet", "tcp") # 同上
1、创建和销毁socket
import socket
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
soc.close()
注:使用以下方式可以把socket模块中所有属性带到当前命名空间,可缩短代码
from socket import *
soc = socket(AF_INET, SOCK_STREAM) # 创建TCP的socket对象
soc.close() # 销毁socket对象
2、建立服务器和客户端连接
启动服务器端,等待连接(此时服务器端处于死循环状态,直道有人连接时为止):
from socket import *
soc = socket(AF_INET, SOCK_STREAM) # 创建TCP的socket对象
soc.bind(("127.0.0.1", 44443)) # 绑定指定地址(host, port)
soc.listen(1) # 开始监听,连接数至少为1,队列已满则拒绝请求
con, adr = soc.accept() # 接受请求,调用accept会使socket处于阻塞状态waiting
启动客户端,开始连接(一旦连接成功,服务器将推出死循环状态):
from socket import *
soc = socket(AF_INET, SOCK_STREAM)
soc.connect(("127.0.0.1", 44443))
3、发送和接收字符串
验证连接,在服务器端发送信息:
con.send("Hello!")
在客户端接受信息
soc.recv(1024) # recv(n, flag)其中n=2^i,如果数据量超过该值将被截断
端口号:为0—65 535之间的数值,但不能随意使用。0-1023的保留端口用于系统服务器,20 000—30 000的保留端口用于远程过程调用服务(RPC)。
展开阅读全文