python學習-05

#文件#

  文件對象不僅可以用來訪問普通的磁盤文件, 而且也可以訪問任何其它類型抽象層面上的"文件".
   一旦設置了合適的"鉤子", 你就可以訪問具有文件類型接口的其它對象, 就好像訪問的是普
  通文件一樣.


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-8

import os

def 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()+'/'+Path1
	return 0


path = raw_input('請輸入要遍歷的目錄:')
dirList(path)


發佈了54 篇原創文章 · 獲贊 32 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章