yunde110 发表于 2017-4-29 08:13:44

python学习小结3

一 文件


   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
      exceptIndexError,indexError://(异常对象1),(异常信息标识)
            printindexError
         .......
         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']
      .......................

    3SQLITE的一个简单操作例子
      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=
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      #加入连接Socket
      elif event & select.POLLIN:
            data=fdmap.recv(1024)
            if not data:          #没有数据
                print fdmap.getpeername(),'disconnected'
                p.unregister(fd)
                del fdmap
      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
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]
查看完整版本: python学习小结3