python学习-05

来源:互联网 发布:scala和java混合使用 编辑:程序博客网 时间:2024/06/14 05:42
#文件#

  文件对象不仅可以用来访问普通的磁盘文件, 而且也可以访问任何其它类型抽象层面上的"文件".
   一旦设置了合适的"钩子", 你就可以访问具有文件类型接口的其它对象, 就好像访问的是普
  通文件一样.


1>文件打开

  打开方式:   open()  file()  他们具有相同的功能,可以任意替换,所有使用open()的地方,都可以使用file()
  open()成功打开一个文件后,返回一个文件对象,否则引发一个错误.
       语法:  file_object = open(file_name,mode,buffering)

     filename是文件名,可以是相对路径,也可以是绝对路径,

     mode是文件打开方式,默认只读, 只读,只写,读写,二进制
        r    读模式,打开文件只读,不能写
        w    写模式,打开文件只写,并且清空文件
        a    追加模式,打开文件只写,不清空文件,子阿文件末尾追加内容
        b    二进制模式(与其他模式一块使用)
        +         读/写模式
        U    通用换行符支持

     buffering是访问文件所采用的缓冲方式, 0 表示不缓冲(所有读写直接针对硬盘),
        1表示缓冲区为一行, -1(或是其他负数)代表使用默认缓冲区大小,大于1代表缓冲
        区大小(单位是字节),不写参数代表使用默认缓冲区

              默认缓冲区:
                1)对于二进制文件模式时,采用固定块内存缓冲区方式,内存块的大小根据系统设备的分配的磁盘块
                       来决定,如果获取系统磁盘块的大小失败,就使用内部常量io.DEFAULT_BUFFER_SIZE定义的大小。
                        一般的操作系统上,块的大小是4096或者8192字节大小。
                2)对于交互的文本文件(采用isatty()判断为True)时,采用一行缓冲区的方式。其它文本文件使用
                       跟二进制一样的方式。

     例子:
        fp = ('/mnt/test','w')
        fp = ('test','r+')
        fp = ('test','rb')

2>文件的读取与写入
   
   读取:
    read()  读取文件字节到字符串中,最多读取给定数目的字节,如果没有参数或者参数为负,文件直接读取到末尾
    readline() 读取文件一行,包括行结束符,作为字符串返回,可选参数为负,读取整行,否则在超过给定字节后返回不完整行
    readlines() 读取所有行,返回一个字符串列表,可选参数代表返回字节的最大数

    写入:
    write()  方法功能与 read() 和 readline() 相反. 它把含有文本数据或二进制数据块的字符串写入到文件中去
    writelines() 是针对列表的操作, 它接受一个字符串列表作为参数, 将它们写入文件. 行结束符并不会被自动加入,
              所以如果需要的话, 你必须在调用writelines()前给每行结尾加上行结束符.

3>文件的关闭
    close()  每次调用完文件,都要关闭它,不然会在后台一直占用资源,而且如果是独占式打开的话,别人就无法打开这个文件

4>os模块
  os.mkdir        建立一个目录
  os.mkdirs       建立多层目录  相当于 shell 下的 mkdir -p
  os.listdir      返回指定目录下的所有文件和目录名
  os.remove       删除一个文件
  os.rmdir        删除目录
  os.removedirs   删除多层目录  ,先删除子目录,再删除父目录(如果此时父目录为空的话)
  os.getcwd       返回当前目录(相当于shell的pwd)
  os.getcwdu      返回当前目录的unicode字符串
  os.chdir        更改当前所处目录
  os.path.isfile  判断是不是一个文件
  os.path.isdir   判断是不是一个目录
  os.path.exits   检验给出的路径是否存在
  os.path.split   函数返回一个路径的目录名和文件名
  os.path.join(path,name)   连接目录与文件名或目录
  os.path.dirname(path)     返回文件路径
  os.system       运行shell命令
  os.walk()       返回一个三元组,第一个起始路径,第二个是起始路径下的文件夹,第三个是起始路径下的文件,
                                         一般用  for a,b,c in os.walk(dir) 来遍历目录


#python数据库编程#
   
  数据库: mysql

1>数据库的安装
 shell下:
   yum install MySQL-python.x86_64 -y
   yum install mariadb-server.x86_64  -y
   systemctl start mariadb

2>数据库在python下的调用

  import MySQLdb    #导入python的mysqldb模块

  conn = MySQLdb.connect(user='root',passwd='',host='127.0.0.1',charset='utf8')
     #建立一个mysql 连接对象,数据库用户为root 密码为空,机器是本机(127.0.0.1是回送地址,指本地机,utf8代表编码格式)

  cur = conn.cursor()      
  #conn 对象只是一个到 mysql 的连接状态,需要通过游标来发送 sql指令,我们需要建立一个游标,并创建一个 cur 对象保存下来
 
  conn.select_db('test') #选择所要操作的库
  cur.execute("insert into usertable(name,passwd) value('user3','789')") #插入数据
   
  conn.commit()
    #提交事物才能插入数据,在 rhel6 上使用 mysql 不需要这步,rhel7 上不提交insert 失败,提交了之后,在数据库里就能查看到插入的信息

  sqli = "insert into usertable(name,passwd) value(%s,%s)"  
     #为了方便定义字符串变量 %s 是字符串的格式化方法

  cur.execute(sqli,('user4','000'))
    #通过 execute 函数发送 sql 指令,后面的值是个元组,我们可以通过交互式获取元组的值

  cur.executemany(sqli,[('user5','005'),('user6','006')])
     #使用 executemany 函数一次插入多个值,以列表方式

  cur.execute("delete from usertable where name='user6'")                #删除数据
  cur.execute("update usertable set passwd='555' where name='user5'")    #修改数据
  cur.execute('select * from usertable') #select 比较特殊,python 不能直接打印数据表
  >>> cur.fetchone()    #打印一条数据信息
  ('user1', '123')
  >>> cur.fetchone()
  ('user2', '456')
 
  cur.scroll(0,'absolute')
    #默认指针是一次递进的,想回去需要通过 scroll 函数调整指针,第一个参数指移动的位置,第二个参数是在什么地方移动

>>> cur.fetchmany() #fetchmany 函数可以取多个
(('user3', '789'),)


>>> cur.scroll(0,'absolute')    #指针还原
>>> cur.fetchmany(5)   ##参数取几就一次取多少
(('user1', '123'), ('user2', '456'), ('user3', '789'), ('user4', '000'), ('user5', '555'))


>>> cur.fetchmany(cur.execute('select * from usertable'))      #一步搞定查询
(('user1', '123'), ('user2', '456'), ('user3', '789'), ('user4', '000'), ('user5', '555'))
>>> cur.close()
#关闭游标
>>> conn.close() #关闭连接




#异常处理#

   异常可以通过 try 语句来检测. 任何在 try 语句块里的代码都会被监测, 检查有无异常发生.
 try 语句有两种主要形式: try-except 和 try-finally . 这两个语句是互斥的, 也就是说你
  只 能 使 用 其 中 的 一 种 . 一 个 try 语 句 可 以 对 应 一 个 或 多 个 except 子 句 , 但 只 能 对 应 一 个
  finally 子句, 或是一个 try-except-finally 复合语句.

try:
       代码块
except  异常名称   :
       代码块
finally:
       代码块


except 与 finally 的区别:
    except 只有在异常发生的时候,才会执行接下来的语句块
    finally 不管异常发没发生,都要执行的语句块



#内建函数#

#filter#
    filter(func, seq)
    调用一个布尔函数 func 来迭代遍历每个 seq 中的元素; 返回一个使 func 返回值为 ture 的元素的序列
    filter 函数主要功能在过滤序列,filter 函数接收一个函数和一个序列,将传入的函数依次作用于每个元素
        然后根据返回值是 True 还是 False 决定保留还是丢弃该元素,最终,保留的元素会被返回并保存在一个序列里

    当 filter 中第一个参数为 None 时 ,返回序列中的非0值
 
  例子:
    In [44]: a= [0,1,2,3,4,5]

    In [45]: filter(lambda x:x,a)
    Out[45]: [1, 2, 3, 4, 5]

    In [46]: filter(None,a)
    Out[46]: [1, 2, 3, 4, 5]

    In [47]: filter(lambda x:x<5,a)
    Out[47]: [0, 1, 2, 3, 4]


#map#
    map(func, seq1[,seq2...])  将函数 func 作用于给定序列(s)的每个元素,并用一个列表来提供返回值;
        如果 func 为 None, func 表现为一个身份函数,返回一个含有每个序列中元素集合的 n 个元组的列表。

    map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,
        并把结果作为新的list返回

  例子:
    In [27]: a = [-1,-2,-3,-4,-5,-6,-7]
    In [28]: b = [1, 2, 3, 4, 5, 6, 7]

    In [29]: map(lambda x,y:x+y,a,b)
    Out[29]: [0, 0, 0, 0, 0, 0, 0]

    In [4]: map(lambda x:x+2,[0,1,2,3,4,5,6,7])
    Out[4]: [2, 3, 4, 5, 6, 7, 8, 9]

    In [49]: map(str,[0, 1, 2, 3, 4, 5])
    Out[49]: ['0', '1', '2', '3', '4', '5']

    In [53]: map(float,[0, 1, 2, 3, 4, 5])
    Out[53]: [0.0, 1.0, 2.0, 3.0, 4.0, 5.0]

#reduce#
    reduce(func, seq[, init]) 将二元函数作用于 seq 序列的元素,每次携带一对(先前的结果以及下一个序列元素),
        连续的将现有的结果和下一个值作用在获得的随后的结果上,最后减少我们的序列为一个单一的返回值;如果初始值
        init 给定,第一个比较会是 init 和第一个序列元素而不是序列的头两个元素。

    这个函数必须接受两个参数,序列不能为空,默认init为0,只能有一个init参数,reduce把第一个序列元素跟init输入到函
        数中,然后结果继续和序列的下一个元素做为参数输入到函数中计算
  例子:
    In [62]: reduce(lambda x,y:x+y,[1, 2, 3, 4, 5, 6, 7])
    Out[62]: 28

    In [63]: reduce(lambda x,y:x+y,[1, 2, 3, 4, 5, 6, 7],8)
    Out[63]: 36
    



脚本: 递归实现遍历目录

#!/usr/bin/env python#coding=utf-8import osdef dirList(Path):dirlist = os.listdir(Path)for dirname in dirlist:Path1 = os.path.join(Path,dirname)if os.path.isdir(Path1):dirList(Path1)else :print os.getcwd()+'/'+Path1return 0path = raw_input('请输入要遍历的目录:')dirList(path)


0 0
原创粉丝点击