- 浏览: 7936070 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (2425)
- 软件工程 (75)
- JAVA相关 (662)
- ajax/web相关 (351)
- 数据库相关/oracle (218)
- PHP (147)
- UNIX/LINUX/FREEBSD/solaris (118)
- 音乐探讨 (1)
- 闲话 (11)
- 网络安全等 (21)
- .NET (153)
- ROR和GOG (10)
- [网站分类]4.其他技术区 (181)
- 算法等 (7)
- [随笔分类]SOA (8)
- 收藏区 (71)
- 金融证券 (4)
- [网站分类]5.企业信息化 (3)
- c&c++学习 (1)
- 读书区 (11)
- 其它 (10)
- 收藏夹 (1)
- 设计模式 (1)
- FLEX (14)
- Android (98)
- 软件工程心理学系列 (4)
- HTML5 (6)
- C/C++ (0)
- 数据结构 (0)
- 书评 (3)
- python (17)
- NOSQL (10)
- MYSQL (85)
- java之各类测试 (18)
- nodejs (1)
- JAVA (1)
- neo4j (3)
- VUE (4)
- docker相关 (1)
最新评论
-
xiaobadi:
jacky~~~~~~~~~
推荐两个不错的mybatis GUI生成工具 -
masuweng:
(转)JAVA获得机器码的实现 -
albert0707:
有些扩展名为null
java 7中可以判断文件的contenttype了 -
albert0707:
非常感谢!!!!!!!!!
java 7中可以判断文件的contenttype了 -
zhangle:
https://zhuban.me竹板共享 - 高效便捷的文档 ...
一个不错的网络白板工具
一 文件
1)open 函数
o=open(files+'\\files.doc','w');
o.write('DDDDDDDDDDDDDD');
o.close();
2) 文件的读取
A read()函数
一次将文件中的所有数据读出来
o=open("xxxx.txt")
content=o.read(20) //读前20个字符
content1=o.read() //读所有字符
o.close()
B readline()函数
每次只读取文件中的一行数据
content=o.readline();
C readlines()函数 读取N行,然后循环
contents=o.readlines();
for content in contents:
print content;
3)写入
listabc=["xxxxxxxxxxx"];
o.writelines(listabc);
//用一个集合的方式写入文件
4) os是python的标准模块,提供了统一的操作系统接口函数,能在不同系统间切换。
比如文件删除时
import os;
if os.path.exists("d:\xxxxxxxxxxx");
os.remove("d:\xxxxxxxx\xxx.txt");
5) copyfile()函数
import shutil //文件高级操作的API
shutil.copyfile(src,dst)
6) mkdir函数
import os;
os.mkdir(dir)
mkdirs()函数
设置多个目录
os.mkdirs("d:\\ddd\ddd\dddd\\\ddd") //设置多级目录
7) rmdir(dir) //删除空目录
os.rmdir("d:\\xxxxxx");
rmtree函数
删除非空目录
import shutil;
shutil.rmtree("d:\\\\\\\\");
9) os.walk()函数
读取指定目录下的文件并返回
def ListDir (path,fun,par):
for filespath in par:
print os.path.join(fun,filespath);
if __name__=="__main__":
os.walk("d:\it",ListDir,());
其中,os.walk中,第一个参数为目录的路径,第2个参数为回调方法,上面就是列出it目录下的所有文件。
但如果要把下面的子目录及文件也一起列了,则需要
os.path.walk函数中,walk(path,topdown=true,onerror=none)
其中第2个参数默认TRUE,表示先返回目录树下的文件,然后遍历目录树的子目录,当为FALASE时,先遍历子目录,
然后返回子目录下的文件,最后返回根目录下的文件
二 异常
1) 格式
try:
a=1/0
except (异常1,异常2,......),e:
print e
或
try:
a=1/0
except 异常1:
。。。。。。
except 异常2:
..............
2) try:
num=1/0
except IndexError,indexError: //(异常对象1),(异常信息标识)
print indexError
.......
else:
................
3)try :
.............
finally:
..................
4) 自定义异常
class MyError(Exception):
//自定义异常的名以Error结尾。
try :
raise MyError(....)
exception MyError,e:
print e.value
三 持久化
1 使用dbhash模块读写数据
DBM是文件式数据库,用哈希保存,不具备管理能力,但比普通文件可靠。windows用dbhash进行读取
import dbhash
db=dbhash.open('filename','c') //c表示创建数据库,r,w表示读写。
db['abc']='dddddd'
db.inseritems() //插入
但缺点是dbhash只支持字符串,不支持其他类型,比如db['abc']=1 则出错
2 使用shelve模块写数据
其返回的字典类型可以支持python中的基本类型等。
import shelve
db=shelve.open("mydb")
db['ddsd']=['sdsd','sdsd','sdsd','sdsdsdsd']
.......................
3 SQLITE的一个简单操作例子
import sqlite3 #导入sqlite3模块
conn=sqlite3.connect('userDB.db') #连接数据库userDB,如果userDB不存在,则创建数据库userDB
cur=conn.cursor()
print '---------未处理之前的数据-----------'
conn.execute("create table if not exists address(id integer primary key autoincrement,name varchar(128),address
varchar(128))") #如果address表不存在,则创建表address
conn.execute("insert into address(name,address)values('dcy','zhengzhou')") #添加一条数据到表address
cur.execute("select * from address")
res=cur.fetchall() #调用游标对象cur的fetchall()方法返回表address中的所有数据
print "address:",res #输出结果集
for line in res: #输出结果集
for f in line:
print f
conn.execute("delete from address where id=12")
conn.execute("delete from address where id=17")
conn.execute("delete from address where id=30")
conn.execute("delete from address where id=30")
strUpdate=raw_input('请选择您要修改某条数据的编号:')
strId=raw_input('请选择您要删除某条数据的编号:')
conn.execute("update address set name='maxianglin' where id="+strUpdate)
conn.execute("delete from address where id="+strId)
conn.commit() #手动提交
print '-------------处理之后的数据----------------'
cur.execute("select * from address") #调用游标对象cur的execute方法查询表address中的数据
res=cur.fetchall() #调用游标对象cur的fetchall()方法返回表address中的所有数据
print "address:",res #输出结果集
for line in res: #输出结果集
for f in line:
print f
cur.close() #关闭游标对象cur
conn.close() #关闭数据库链接对象conn
四 网络设计模块
1 urllib2模块 适合高级网络应用,比如HTTP验证等,一般的可以用urllib.
import urllib2
response=urllib2.urlopen("http://www.sohu.com")
html=response.read()
print html
2 urlretrieve方法
import urllib
urllib.urlretrieve('http://www.sohu.com','d:\\xxxx.html')
3 简单的socket服务器
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host=socket.gethostname()
port=1234
s.bind((host,port))
s.listen(5) //5为连接队列的长度
while True:
c,addr=s.accept()
print '连接来自:',addr
c.send('恭喜你!一个简单的服务器创建成功!')
c.close()
4 socketserver模块
其中针对TCP的有tcpserver,udpserver,unixstreamserver和unixdatagramserver
服务端:
from SocketServer import TCPServer,StreamRequestHandler
class Handler(StreamRequestHandler):
def handle (self):
addr=self.request.getpeername()
print '获取的连接来自:',addr
self.wfile.write('恭喜你!连接成功!') //wfile用来些如 ,self.rfile用来读取
server=TCPServer(('',1234),Handler)
server.serve_forever() //循环监听
客户端:
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host=socket.gethostname()
port=1234
s.connect((host,port))
print s.recv(1024)
s.close()
5 简单的服务端和客户端程序:
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 8001))
sock.listen(5)
while True:
connection,address = sock.accept()
try:
connection.settimeout(5)
buf = connection.recv(1024)
if buf == '1':
connection.send('welcome to server!')
else:
connection.send('please go out!')
except socket.timeout:
print 'time out'
connection.close()
客户端:
import socket
import time
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 8001))
time.sleep(2)
sock.send('1')
print sock.recv(1024)
sock.close()
四 异步通信方式
应付多个连接,采用异步方式,分别为分叉,线程方式和异步方式
1)分叉(fork) :主进程会有响应的一个子进程来处理此连接,而主进程依然保持在侦听状态,不会阻塞主线程,
当客户端结束请求时,子进程退出,例子
from SocketServer import TCPServer , ForkingMixIn , StreamRequestHandler
class Server(ForkingMixIn , TCPServer):
pass
class Handler(StreamRequestHandler):
def handle (self):
addr=self.request.getpeername()
print '获取的连接来自:',addr
self.wfile.write('使用Fork方式实现多连接')
if __name__=='__main__':
server=Server(('localhost',1234),Handler)
server.serve_forever()
2) 采用线程方式:
class Server(ThreadingMixIn , TCPServer):
pass
。。。。。。
3) 异步IO方式
1 select方式使用
import socket , select
s=socket.socket()
host=socket.gethostname()
port=1234
s.bind((host,port))
s.listen(5)
inputs=[s]
while True:
rs,ws,es=select.select(inputs,[],[])
for r in rs :
if r is s:
c,addr=s.accept()
print '获取连接来自:',addr
inputs.append(c)
else:
try:
data=r.recv(1024)
disconnected=not data
except socket.error:
disconnected=True
if disconnected:
print r.getpeername(),'disconnected'
inputs.remove(r)
else:
print data
2、POLL方式
import socket , select
s=socket.socket()
host=socket.gethostname()
port=1234
s.bind((host,port))
fdmap={s.fileno():s}
s.listen(5)
p=select.poll() #生成Polling对象
p.register(s) #注册Socket对象
while True:
events=p.poll() #获取准备好的文件对象
for fd,event in events :
if fd is fdmap:
c,addr=s.accept()
print '获取连接来自:',addr
p.register(c)
fdmap[c.fileno()]=c #加入连接Socket
elif event & select.POLLIN:
data=fdmap[fd].recv(1024)
if not data: #没有数据
print fdmap[fd].getpeername(),'disconnected'
p.unregister(fd)
del fdmap[fd]
else:
print data
3 asyncore模块
import asyncore, socket
class http_client(asyncore.dispatcher):
def __init__(self, host, path):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.connect((host, 80))
self.buffer = 'GET %s HTTP/1.0\r\n\r\n' % path
def handle_connect(self):
pass
def handle_close(self):
self.close()
def handle_read(self):
print self.recv(8192)
def writable(self):
return (len(self.buffer) > 0)
def handle_write(self):
sent = self.send(self.buffer)
self.buffer = self.buffer[sent:]
if __name__=='__main__':
c = http_client('snaps.php.net', '/')
asyncore.loop()
print 'Program exit'
例子
import asyncore,socket
class AsyncGet(asyncore.dispatcher):
def __init__(self,host):
asyncore.dispatcher.__init__(self)
self.host=host
#创建Socket对象
self.create_socket(socket.AF_INET, \
socket.SOCK_STREAM)
self.connect((host,80)) #连接服务器
self.request='GET /index.html HTTP/1.0\r\n\r\n' #请求index.html页面
self.outf=None
print '请求的index.html来自:',host
def handle_connect(self):
print '连接:',self.host
def handle_read(self):
if not self.outf:
print '正在创建连接::',self.host
self.outf=open('%s.txt'%self.host,'wb') #将服务器信息写入记事本中
data=self.recv(8192) #获取服务器发送过来的信息
if data:
self.outf.write(data) #写入记事本中
def writeable(self):
return len(self.request)>0
def handle_write(self):
num_sent=self.send(self.request) #发送客户端请求
def handle_close(self):
asyncore.dispatcher.close(self)
print 'Socket对象关闭于:',self.host
if self.outf:
self.outf.close()
if __name__=='__main__':
AsyncGet('www.python.org')
asyncore.loop()
五 HTML处理
1 urlparse
import urlparse
url=urlparse.urlparse("http:///xxxxxxxxxxxxxxxxxx")
会将URL切割为不同的部分,变成一个元组,比如输出url.schema,url.path,url.params等
2 urlunparse方法
把各个部分拼接起来形成URL、
url=urlparse.urlunparse(('http','abc.com.cn','/ddddd/dddd.php','','pid=12233''))
3 urlparse.urljoin('http://xxxxx/admin/","sdsdsdsd/dsdsdsdsdd")
实际上是将两部分地址进行拼接。
4 urllib中的quote方法,对URL编码,其中的地址栏中的空格被编码为%20,用quote_plus编码时,地址中的空格被编码为+连接。
而unquote方法,则是将已经编码的地址,重新解压其内容
url=xxxxxxxxxxxx
url.unquote(url)
5 urlopen
可以打开本地文件,如abc=urllib.urlopen("a.txt")
abc.info() //打开文件
abc.readline() //只读一行数据
6 httplib模块获得资源
connection=httplib.httpconnection('http:/www.xxx.org')
connection.request('get','/xxxx.html')
re=connection.getresponse()
print re.status()
六 XML处理
SAX例子:
import string
from xml.sax import*
class QuotationHandler(ContentHandler):
def __init__(self):
self.string=''
def startDocument(self): #开始处理文档时调用
print '-------开始处理XML文档------'
print 'name\tprice\taffect'
print '--------------------------'
def endDocument(self): #处理文档结束时调用
print '-------处理结束XML文档-'
nameStr=raw_input('请输入你想查看XML文档中的标签(title):')
def startElement(self, nameStr, attrs):
print '-----------Start Element-----------'
if nameStr == 'title':
print '------标签为title下的数据-------'
print attrs['name'],attrs['offer_id'],attrs['mobile_url']
def characters(self, ch):
self.string = self.string + ch
if __name__ == '__main__':
try:
parser =make_parser()
handler = QuotationHandler()
parser.setContentHandler(handler)
parser.parse("sample.xml")
except:
import traceback
traceback.print_exc()
七 DJANGO
1)安装 setup.py install
2) 在setting.py中,是django的配置文件
3)创建模版项目
django-admin.py startproject Django_Pro
生成有4个文件
__init__.py:用来指定python语言将此网站目录作为python的包
manage.py:管理django项目
setting.py:配置文件
urls.py:包含url的配置文件。
4) 启动内置服务器
manage.py runserver //到项目所在路径中运行
默认使用localhost:8000端口监听,也可以更改
manage.py runserver 8001
manage.py runserver 0.0.0.0:8000 允许其他机器访问此web服务器
5) 修改settings.py中的数据库配置文件,修改database部分
6) manage.py syncdb 即会生成对应的xxxx.db3文件
7) 然后生成DJANGO应用
manage.py startapp Users
则会生成一个users目录,修改其中的model.py文件,定义数据模型
from django.db import models
# Create your models here.
class Users(models.Model):
username = models.CharField('用户名',max_length=20)
password = models.CharField('密码',max_length=20)
realname = models.CharField('真实姓名',max_length=255)
sex = models.CharField('性别',max_length=10)
email = models.EmailField('电子邮箱',blank=True)
def __str__ (self):
return '%s'%(self.username)
然后在settings.py中加入此应用
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'Django_Pro.Users',
再继续用manage.py syncdb生成数据库中的Users_users表。
8)URL控制,是在项目根录下的urls.py中可以看到定义的URL规则,比如:
from django.conf.urls.defaults import *
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
(r'^$', 'views.home'),
(r'^Users/', include('Django_Pro.Users.urls')),
#(r'^$', 'Django_Pro.Users.views.index'),
#(r'^Django_Pro/', include('Django_Pro.foo.urls')),
#(r'^Users/',include('Django_Pro.Users.urls')),
(r'^admin/',include(admin.site.urls)),
(r'^login/$','Django_Pro.views.login'),
(r'^pro/$','Django_Pro.views.proList'),
(r'^buy/$','Django_Pro.views.buyPro'),
(r'^fruit/$','Django_Pro.views.fruitList')
)
而在各模块,比如users下中也有对应的url.py,如:
urlpatterns = patterns('',
url(r'^$', 'Users.views.index'),
url(r'^random_number/$', 'Users.views.random_number'),
)
9) 静态视图 在项目根目录中,views.py可以写视图。
10) 模版文件,可以在setting.py中,设立模版目录,如
TEMPLATE_DIRS = (
'./templates',
)
一个模版样例文件:
{% if latest_users_list %}
<ul>
{% for user in latest_users_list %}
<li><a href="/users/{{ user.id }}/">{{ user.username }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>没有有效的数据!</p>
{% endif %}
在users\views.py中,加入控制文件:
from django.shortcuts import render_to_response
from Django_Pro.Users.models import Users
def index(rq):
latest_users_list = Users.objects.all().order_by('-username')[:5]
return render_to_response('users/index.html',{
'latest_users_list':latest_users_list
})
并且在项目根目录的urls.py中配置
urlpatterns = patterns('',
(r'^$', 'Django_Pro.Users.views.index'),
.....
11 增加管理界面
1) 要加入admin元组管理
INSTALLED_APPS = ( 'django.contrib.admin',
.............................
2)生成数据库
manage.py syncdb
3)修改根目录下的urls.py,增加支持
(r'^admin/',include(admin.site.urls)),
4) 在users目录下生成一个admin.py文件
from django.contrib import admin
from Django_Pro.Users.models import Users
admin.site.register(Users)
5) 如果要汉化的话,修改成language_code='zh-CN',修改settings.py
6)http://localhost:8000/admin运行
12 支持SESSION
1) 需要在setting.py 中修改middleware_classes元组类型的属性值
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
同时在配置文件中的installed_apps元素中加入:
INSTALLED_APPS = (
'django.contrib.sessions',
2)使用时
request.session['username']=username
在模版中,可以这样 {{request.session.username}} ..........
但要记得在settings.py中,将
TEMPLATE_CONTEXT_PROCESSORS = (
"django.core.context_processors.request"
1)open 函数
o=open(files+'\\files.doc','w');
o.write('DDDDDDDDDDDDDD');
o.close();
2) 文件的读取
A read()函数
一次将文件中的所有数据读出来
o=open("xxxx.txt")
content=o.read(20) //读前20个字符
content1=o.read() //读所有字符
o.close()
B readline()函数
每次只读取文件中的一行数据
content=o.readline();
C readlines()函数 读取N行,然后循环
contents=o.readlines();
for content in contents:
print content;
3)写入
listabc=["xxxxxxxxxxx"];
o.writelines(listabc);
//用一个集合的方式写入文件
4) os是python的标准模块,提供了统一的操作系统接口函数,能在不同系统间切换。
比如文件删除时
import os;
if os.path.exists("d:\xxxxxxxxxxx");
os.remove("d:\xxxxxxxx\xxx.txt");
5) copyfile()函数
import shutil //文件高级操作的API
shutil.copyfile(src,dst)
6) mkdir函数
import os;
os.mkdir(dir)
mkdirs()函数
设置多个目录
os.mkdirs("d:\\ddd\ddd\dddd\\\ddd") //设置多级目录
7) rmdir(dir) //删除空目录
os.rmdir("d:\\xxxxxx");
rmtree函数
删除非空目录
import shutil;
shutil.rmtree("d:\\\\\\\\");
9) os.walk()函数
读取指定目录下的文件并返回
def ListDir (path,fun,par):
for filespath in par:
print os.path.join(fun,filespath);
if __name__=="__main__":
os.walk("d:\it",ListDir,());
其中,os.walk中,第一个参数为目录的路径,第2个参数为回调方法,上面就是列出it目录下的所有文件。
但如果要把下面的子目录及文件也一起列了,则需要
os.path.walk函数中,walk(path,topdown=true,onerror=none)
其中第2个参数默认TRUE,表示先返回目录树下的文件,然后遍历目录树的子目录,当为FALASE时,先遍历子目录,
然后返回子目录下的文件,最后返回根目录下的文件
二 异常
1) 格式
try:
a=1/0
except (异常1,异常2,......),e:
print e
或
try:
a=1/0
except 异常1:
。。。。。。
except 异常2:
..............
2) try:
num=1/0
except IndexError,indexError: //(异常对象1),(异常信息标识)
print indexError
.......
else:
................
3)try :
.............
finally:
..................
4) 自定义异常
class MyError(Exception):
//自定义异常的名以Error结尾。
try :
raise MyError(....)
exception MyError,e:
print e.value
三 持久化
1 使用dbhash模块读写数据
DBM是文件式数据库,用哈希保存,不具备管理能力,但比普通文件可靠。windows用dbhash进行读取
import dbhash
db=dbhash.open('filename','c') //c表示创建数据库,r,w表示读写。
db['abc']='dddddd'
db.inseritems() //插入
但缺点是dbhash只支持字符串,不支持其他类型,比如db['abc']=1 则出错
2 使用shelve模块写数据
其返回的字典类型可以支持python中的基本类型等。
import shelve
db=shelve.open("mydb")
db['ddsd']=['sdsd','sdsd','sdsd','sdsdsdsd']
.......................
3 SQLITE的一个简单操作例子
import sqlite3 #导入sqlite3模块
conn=sqlite3.connect('userDB.db') #连接数据库userDB,如果userDB不存在,则创建数据库userDB
cur=conn.cursor()
print '---------未处理之前的数据-----------'
conn.execute("create table if not exists address(id integer primary key autoincrement,name varchar(128),address
varchar(128))") #如果address表不存在,则创建表address
conn.execute("insert into address(name,address)values('dcy','zhengzhou')") #添加一条数据到表address
cur.execute("select * from address")
res=cur.fetchall() #调用游标对象cur的fetchall()方法返回表address中的所有数据
print "address:",res #输出结果集
for line in res: #输出结果集
for f in line:
print f
conn.execute("delete from address where id=12")
conn.execute("delete from address where id=17")
conn.execute("delete from address where id=30")
conn.execute("delete from address where id=30")
strUpdate=raw_input('请选择您要修改某条数据的编号:')
strId=raw_input('请选择您要删除某条数据的编号:')
conn.execute("update address set name='maxianglin' where id="+strUpdate)
conn.execute("delete from address where id="+strId)
conn.commit() #手动提交
print '-------------处理之后的数据----------------'
cur.execute("select * from address") #调用游标对象cur的execute方法查询表address中的数据
res=cur.fetchall() #调用游标对象cur的fetchall()方法返回表address中的所有数据
print "address:",res #输出结果集
for line in res: #输出结果集
for f in line:
print f
cur.close() #关闭游标对象cur
conn.close() #关闭数据库链接对象conn
四 网络设计模块
1 urllib2模块 适合高级网络应用,比如HTTP验证等,一般的可以用urllib.
import urllib2
response=urllib2.urlopen("http://www.sohu.com")
html=response.read()
print html
2 urlretrieve方法
import urllib
urllib.urlretrieve('http://www.sohu.com','d:\\xxxx.html')
3 简单的socket服务器
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host=socket.gethostname()
port=1234
s.bind((host,port))
s.listen(5) //5为连接队列的长度
while True:
c,addr=s.accept()
print '连接来自:',addr
c.send('恭喜你!一个简单的服务器创建成功!')
c.close()
4 socketserver模块
其中针对TCP的有tcpserver,udpserver,unixstreamserver和unixdatagramserver
服务端:
from SocketServer import TCPServer,StreamRequestHandler
class Handler(StreamRequestHandler):
def handle (self):
addr=self.request.getpeername()
print '获取的连接来自:',addr
self.wfile.write('恭喜你!连接成功!') //wfile用来些如 ,self.rfile用来读取
server=TCPServer(('',1234),Handler)
server.serve_forever() //循环监听
客户端:
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host=socket.gethostname()
port=1234
s.connect((host,port))
print s.recv(1024)
s.close()
5 简单的服务端和客户端程序:
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 8001))
sock.listen(5)
while True:
connection,address = sock.accept()
try:
connection.settimeout(5)
buf = connection.recv(1024)
if buf == '1':
connection.send('welcome to server!')
else:
connection.send('please go out!')
except socket.timeout:
print 'time out'
connection.close()
客户端:
import socket
import time
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 8001))
time.sleep(2)
sock.send('1')
print sock.recv(1024)
sock.close()
四 异步通信方式
应付多个连接,采用异步方式,分别为分叉,线程方式和异步方式
1)分叉(fork) :主进程会有响应的一个子进程来处理此连接,而主进程依然保持在侦听状态,不会阻塞主线程,
当客户端结束请求时,子进程退出,例子
from SocketServer import TCPServer , ForkingMixIn , StreamRequestHandler
class Server(ForkingMixIn , TCPServer):
pass
class Handler(StreamRequestHandler):
def handle (self):
addr=self.request.getpeername()
print '获取的连接来自:',addr
self.wfile.write('使用Fork方式实现多连接')
if __name__=='__main__':
server=Server(('localhost',1234),Handler)
server.serve_forever()
2) 采用线程方式:
class Server(ThreadingMixIn , TCPServer):
pass
。。。。。。
3) 异步IO方式
1 select方式使用
import socket , select
s=socket.socket()
host=socket.gethostname()
port=1234
s.bind((host,port))
s.listen(5)
inputs=[s]
while True:
rs,ws,es=select.select(inputs,[],[])
for r in rs :
if r is s:
c,addr=s.accept()
print '获取连接来自:',addr
inputs.append(c)
else:
try:
data=r.recv(1024)
disconnected=not data
except socket.error:
disconnected=True
if disconnected:
print r.getpeername(),'disconnected'
inputs.remove(r)
else:
print data
2、POLL方式
import socket , select
s=socket.socket()
host=socket.gethostname()
port=1234
s.bind((host,port))
fdmap={s.fileno():s}
s.listen(5)
p=select.poll() #生成Polling对象
p.register(s) #注册Socket对象
while True:
events=p.poll() #获取准备好的文件对象
for fd,event in events :
if fd is fdmap:
c,addr=s.accept()
print '获取连接来自:',addr
p.register(c)
fdmap[c.fileno()]=c #加入连接Socket
elif event & select.POLLIN:
data=fdmap[fd].recv(1024)
if not data: #没有数据
print fdmap[fd].getpeername(),'disconnected'
p.unregister(fd)
del fdmap[fd]
else:
print data
3 asyncore模块
import asyncore, socket
class http_client(asyncore.dispatcher):
def __init__(self, host, path):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.connect((host, 80))
self.buffer = 'GET %s HTTP/1.0\r\n\r\n' % path
def handle_connect(self):
pass
def handle_close(self):
self.close()
def handle_read(self):
print self.recv(8192)
def writable(self):
return (len(self.buffer) > 0)
def handle_write(self):
sent = self.send(self.buffer)
self.buffer = self.buffer[sent:]
if __name__=='__main__':
c = http_client('snaps.php.net', '/')
asyncore.loop()
print 'Program exit'
例子
import asyncore,socket
class AsyncGet(asyncore.dispatcher):
def __init__(self,host):
asyncore.dispatcher.__init__(self)
self.host=host
#创建Socket对象
self.create_socket(socket.AF_INET, \
socket.SOCK_STREAM)
self.connect((host,80)) #连接服务器
self.request='GET /index.html HTTP/1.0\r\n\r\n' #请求index.html页面
self.outf=None
print '请求的index.html来自:',host
def handle_connect(self):
print '连接:',self.host
def handle_read(self):
if not self.outf:
print '正在创建连接::',self.host
self.outf=open('%s.txt'%self.host,'wb') #将服务器信息写入记事本中
data=self.recv(8192) #获取服务器发送过来的信息
if data:
self.outf.write(data) #写入记事本中
def writeable(self):
return len(self.request)>0
def handle_write(self):
num_sent=self.send(self.request) #发送客户端请求
def handle_close(self):
asyncore.dispatcher.close(self)
print 'Socket对象关闭于:',self.host
if self.outf:
self.outf.close()
if __name__=='__main__':
AsyncGet('www.python.org')
asyncore.loop()
五 HTML处理
1 urlparse
import urlparse
url=urlparse.urlparse("http:///xxxxxxxxxxxxxxxxxx")
会将URL切割为不同的部分,变成一个元组,比如输出url.schema,url.path,url.params等
2 urlunparse方法
把各个部分拼接起来形成URL、
url=urlparse.urlunparse(('http','abc.com.cn','/ddddd/dddd.php','','pid=12233''))
3 urlparse.urljoin('http://xxxxx/admin/","sdsdsdsd/dsdsdsdsdd")
实际上是将两部分地址进行拼接。
4 urllib中的quote方法,对URL编码,其中的地址栏中的空格被编码为%20,用quote_plus编码时,地址中的空格被编码为+连接。
而unquote方法,则是将已经编码的地址,重新解压其内容
url=xxxxxxxxxxxx
url.unquote(url)
5 urlopen
可以打开本地文件,如abc=urllib.urlopen("a.txt")
abc.info() //打开文件
abc.readline() //只读一行数据
6 httplib模块获得资源
connection=httplib.httpconnection('http:/www.xxx.org')
connection.request('get','/xxxx.html')
re=connection.getresponse()
print re.status()
六 XML处理
SAX例子:
import string
from xml.sax import*
class QuotationHandler(ContentHandler):
def __init__(self):
self.string=''
def startDocument(self): #开始处理文档时调用
print '-------开始处理XML文档------'
print 'name\tprice\taffect'
print '--------------------------'
def endDocument(self): #处理文档结束时调用
print '-------处理结束XML文档-'
nameStr=raw_input('请输入你想查看XML文档中的标签(title):')
def startElement(self, nameStr, attrs):
print '-----------Start Element-----------'
if nameStr == 'title':
print '------标签为title下的数据-------'
print attrs['name'],attrs['offer_id'],attrs['mobile_url']
def characters(self, ch):
self.string = self.string + ch
if __name__ == '__main__':
try:
parser =make_parser()
handler = QuotationHandler()
parser.setContentHandler(handler)
parser.parse("sample.xml")
except:
import traceback
traceback.print_exc()
七 DJANGO
1)安装 setup.py install
2) 在setting.py中,是django的配置文件
3)创建模版项目
django-admin.py startproject Django_Pro
生成有4个文件
__init__.py:用来指定python语言将此网站目录作为python的包
manage.py:管理django项目
setting.py:配置文件
urls.py:包含url的配置文件。
4) 启动内置服务器
manage.py runserver //到项目所在路径中运行
默认使用localhost:8000端口监听,也可以更改
manage.py runserver 8001
manage.py runserver 0.0.0.0:8000 允许其他机器访问此web服务器
5) 修改settings.py中的数据库配置文件,修改database部分
6) manage.py syncdb 即会生成对应的xxxx.db3文件
7) 然后生成DJANGO应用
manage.py startapp Users
则会生成一个users目录,修改其中的model.py文件,定义数据模型
from django.db import models
# Create your models here.
class Users(models.Model):
username = models.CharField('用户名',max_length=20)
password = models.CharField('密码',max_length=20)
realname = models.CharField('真实姓名',max_length=255)
sex = models.CharField('性别',max_length=10)
email = models.EmailField('电子邮箱',blank=True)
def __str__ (self):
return '%s'%(self.username)
然后在settings.py中加入此应用
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'Django_Pro.Users',
再继续用manage.py syncdb生成数据库中的Users_users表。
8)URL控制,是在项目根录下的urls.py中可以看到定义的URL规则,比如:
from django.conf.urls.defaults import *
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
(r'^$', 'views.home'),
(r'^Users/', include('Django_Pro.Users.urls')),
#(r'^$', 'Django_Pro.Users.views.index'),
#(r'^Django_Pro/', include('Django_Pro.foo.urls')),
#(r'^Users/',include('Django_Pro.Users.urls')),
(r'^admin/',include(admin.site.urls)),
(r'^login/$','Django_Pro.views.login'),
(r'^pro/$','Django_Pro.views.proList'),
(r'^buy/$','Django_Pro.views.buyPro'),
(r'^fruit/$','Django_Pro.views.fruitList')
)
而在各模块,比如users下中也有对应的url.py,如:
urlpatterns = patterns('',
url(r'^$', 'Users.views.index'),
url(r'^random_number/$', 'Users.views.random_number'),
)
9) 静态视图 在项目根目录中,views.py可以写视图。
10) 模版文件,可以在setting.py中,设立模版目录,如
TEMPLATE_DIRS = (
'./templates',
)
一个模版样例文件:
{% if latest_users_list %}
<ul>
{% for user in latest_users_list %}
<li><a href="/users/{{ user.id }}/">{{ user.username }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>没有有效的数据!</p>
{% endif %}
在users\views.py中,加入控制文件:
from django.shortcuts import render_to_response
from Django_Pro.Users.models import Users
def index(rq):
latest_users_list = Users.objects.all().order_by('-username')[:5]
return render_to_response('users/index.html',{
'latest_users_list':latest_users_list
})
并且在项目根目录的urls.py中配置
urlpatterns = patterns('',
(r'^$', 'Django_Pro.Users.views.index'),
.....
11 增加管理界面
1) 要加入admin元组管理
INSTALLED_APPS = ( 'django.contrib.admin',
.............................
2)生成数据库
manage.py syncdb
3)修改根目录下的urls.py,增加支持
(r'^admin/',include(admin.site.urls)),
4) 在users目录下生成一个admin.py文件
from django.contrib import admin
from Django_Pro.Users.models import Users
admin.site.register(Users)
5) 如果要汉化的话,修改成language_code='zh-CN',修改settings.py
6)http://localhost:8000/admin运行
12 支持SESSION
1) 需要在setting.py 中修改middleware_classes元组类型的属性值
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
同时在配置文件中的installed_apps元素中加入:
INSTALLED_APPS = (
'django.contrib.sessions',
2)使用时
request.session['username']=username
在模版中,可以这样 {{request.session.username}} ..........
但要记得在settings.py中,将
TEMPLATE_CONTEXT_PROCESSORS = (
"django.core.context_processors.request"
发表评论
-
python 的requests小结
2018-05-06 18:48 1098GET 请求 >>> r = request ... -
PYTHON抓取公众号
2018-04-26 08:19 27711.基于搜狗微信搜索的微信公众号爬虫 a. 项目地址:htt ... -
KMN算法初学
2018-04-16 20:04 1827KMN算法,其实就是"人以类聚,物有群分“,可以参考 ... -
jupyter 指定默认的打开路径
2018-04-16 20:03 2398jupyter notebook是挺好用的,但是老打开默认 ... -
python 爬虫小结2
2018-04-08 19:08 6941 LXML是比beautisoup速度更快的解析,使用的是X ... -
python 爬虫小结1
2018-04-05 11:53 710python 爬虫小结1 1 正则匹配中注意的: impor ... -
python3 中jupyter开发工具的几个魔法命令
2018-03-28 20:10 8981 %run myscript/hello.py 可以执 ... -
python使用beutifulsoup来爬虫的基本套路
2018-03-26 23:19 1071使用python3,比如爬kugo的榜单: import ... -
python 2的一篇不错的讲解编码的文章
2017-12-16 23:05 815https://mp.weixin.qq.com/s/ImVH ... -
scrapy3在python2,python3共存下的使用
2017-12-06 09:51 1036因为安装了PYTHON2,PYTHON3,之前的SCRAPY ... -
(转)两句话轻松掌握python最难知识点——元类
2017-10-15 20:42 871https://segmentfault.com/a/1190 ... -
python的深复制和浅复制
2017-10-12 22:34 570附上一篇不错的说PYTHON深浅复制的文: http://ww ... -
python中常见字符串操作小结
2017-10-07 23:11 605#!/usr/bin/env python #-*- codi ... -
python要点1
2017-08-18 22:06 528python要点 1 2.7下安装PIP https ... -
python 初步学习 小结2
2012-02-16 08:57 2321一 字符串 1) 字符串的索引可以是负数,比如str= ... -
python学习小结1
2012-02-13 11:39 51031 使用idel新建立程序后,保存运行,CTRL+F5即可运行 ...
相关推荐
《Python学习手册(第3版)》讲述...除了有许多详实说明和每章小结之外,每章还包括一个头脑风暴:这是《Python学习手册(第3版)》独特的一部分,配合以实用的练习题和复习题,让读者练习新学的技巧并测试自己的理解程度。
Python学习总结 Python学习总结全文共34页,当前为第1页。Python学习总结全文共34页,当前为第1页。Python总结 Python学习总结全文共34页,当前为第1页。 Python学习总结全文共34页,当前为第1页。 目录 Python总结 ...
大佬的Python学习总结
学习归纳总结:python学习个人归纳总结,后续还有各种字符串操作函数
"Python学习心得&总结" Python学习心得&总结.doc 中涵盖了Python基础知识点和实践经验总结。本文将对命令行常用命令、Python语法特点、分号和连行符的使用进行详细解释。 一、命令行常用命令 在命令行中,我们...
实验报告总结强调了Python与C语言之间的共通性,即都需要逻辑思维和上机实践。通过不断练习和阅读他人的代码,学生可以更好地理解和运用Python语法,例如理解元组、列表等数据结构的特性。此外,报告鼓励将Python...
Python常用技巧,技术,框架等总结
python自学学习资料总结
### Python3自学文档知识点概述 #### 一、Python3安装指南 ##### 1.1 Python3简介 Python是一种跨平台的编程语言,可以在多种操作系统上运行,包括但不限于Windows、Mac OS以及各种Linux/Unix系统。这使得Python...
Python学习总结材料.pdfPython学习总结材料.pdfPython学习总结材料.pdfPython学习总结材料.pdfPython学习总结材料.pdfPython学习总结材料.pdfPython学习总结材料.pdfPython学习总结材料.pdfPython学习总结材料.pdf
Python学习总结37100.pdfPython学习总结37100.pdfPython学习总结37100.pdfPython学习总结37100.pdfPython学习总结37100.pdfPython学习总结37100.pdfPython学习总结37100.pdfPython学习总结37100.pdf
Python总结 目录 Python总结 1 前言 2 (一)如何学习Python 2 (二)一些Python免费课程推荐 3 (三)Python爬虫需要哪些知识 4 (四)Python爬虫进阶 6 (五)Python爬虫面试指南 7 (六)推荐一些不错的Python...
Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。 * *...
#### Python学习资源推荐 为了更好地理解和掌握Python,以下是一些值得参考的学习资料: 1. **《Python参考手册》**:这本书详细介绍了Python的标准库以及各种特性,非常适合初学者用来了解Python的基本语法和功能...
这篇博文"python学习总结"可能是作者对于自己学习Python过程中的经验分享,可能涵盖了基础语法、数据结构、函数、模块化编程、面向对象编程、错误与异常处理、文件操作以及常用的第三方库和工具的使用。下面,我们将...
除了有许多详实说明和每章小结之外,每章还包括一个头脑风暴:这是《Python学习手册(第3版)》独特的一部分,配合以实用的练习题和复习题,让读者练习新学的技巧并测试自己的理解程度。, 《Python学习手册(第3版)》...
总结来说,《深入Python3》是一本全面的Python学习资源,它涵盖了Python 3的基础安装、语法、高级特性和生态系统等方面的知识。无论是编程初学者还是有经验的开发者,都能从中获得新的知识和灵感。掌握Python 3不仅...