二十八 二十九 文件
打開文件 open(文件名[,模式][,緩沖]) 注意open是個函數不是方法
模式:
緩沖:
大於1的數字代表緩沖區的大小(單位是字節),-1(或者是任何負數)代表使用默認緩沖區大小
只有用flush或者close時才會更新硬盤的數據
三種標准的流:
輸入:sys.stdin 輸出:sys.stdout 錯誤:sys.stderr
用list()讓文件成為一個列表,每一行是一個元素
用f.seek(0,0)還原文件指針到起始位置
用for讀取文件中的每一行
三十 os模塊和os.path模塊
Python os模塊包含普遍的操作系統功能,注意括號中需要使用字符串
1.getcwd()
返回當前工作目錄
2.chdir(path)
改變工作目錄
3.listdir(path='.')
列舉指定目錄中的文件名('.'表示當前目錄,'..'表示上一級目錄)
4.mkdir(path)
創建單層目錄,如該目錄已存在拋出異常
5.makedirs(path)
遞歸創建多層目錄,如該目錄已存在拋出異常,注意:'E:\\a\\b'和'E:\\a\\c'並不會沖突
6.remove(path)
刪除文件
7.rmdir(path)
刪除單層目錄,如該目錄非空則拋出異常
8.removedirs(path)
遞歸刪除目錄,從子目錄到父目錄逐層嘗試刪除,遇到目錄非空則拋出異常
9.rename(old, new)
將文件old重命名為new
10.system(command)
運行系統的shell命令
以下函數沒有參數
11.os.curdir
指代當前目錄('.')
12.os.pardir
指代上一級目錄('..')
13.os.sep
輸出操作系統特定的路徑分隔符(Win下為'\\',Linux下為'/')
14.os.linesep
當前平台使用的行終止符(Win下為'\r\n',Linux下為'\n')
15.os.name
指代當前使用的操作系統(包括:'posix', 'nt', 'mac', 'os2', 'ce', 'java')
os.path模塊
1.basename(path)
去掉目錄路徑,單獨返回文件名
2.dirname(path)
去掉文件名,單獨返回目錄路徑
3.join(path1[, path2[, ...]])
將path1, path2各部分組合成一個路徑名
4,split(path)
分割文件名與路徑,返回(f_path, f_name)元組。如果完全使用目錄,它也會將最后一個目錄作為文件名分離,且不會判斷文件或者目錄是否存在
5.splitext(path)
分離文件名與擴展名,返回(f_name, f_extension)元組
6.getsize(file)
返回指定文件的尺寸,單位是字節
7.getatime(file)
返回指定文件最近的訪問時間(浮點型秒數,可用time模塊的gmtime()或localtime()函數換算)
8.getctime(file)
返回指定文件的創建時間(浮點型秒數,可用time模塊的gmtime()或localtime()函數換算)
9.getmtime(file)
返回指定文件最新的修改時間(浮點型秒數,可用time模塊的gmtime()或localtime()函數換算)
以下為函數返回 True 或 False
10.exists(path)
判斷指定路徑(目錄或文件)是否存在
11.isabs(path)
判斷指定路徑是否為絕對路徑
12.isdir(path)
判斷指定路徑是否存在且是一個目錄
13.isfile(path)
判斷指定路徑是否存在且是一個文件
14.islink(path)
判斷指定路徑是否存在且是一個符號鏈接
15.ismount(path)
判斷指定路徑是否存在且是一個掛載點
16.samefile(path1, paht2)
判斷path1和path2兩個路徑是否指向同一個文件
三十一 pickle模塊
以二進制保存數據
三步走:打開文件,用pickle.dump()方法將數據放入文件,關閉文件
1 import pickle 2 my_list = [1,2,'老王',['abc']] 3 pickle_file = open('my_list.pkl','wb') #文件名后綴無所謂 4 pickle.dump(my_list,pickle_file) 5 pickle_file.close()
這樣文件夾中就保存了my_list.pkl文件,(查詢當前目錄是用 import os os.getcwd())
讀取數據
打開文件,調用pickle.load()方法
pickle_file = open('my_list.pkl','rb') list2 = pickle.load(pickle_file) print(list2)
三十二 三十三 異常
常見異常類型:
AttributeError:屬性錯誤,特性引用和賦值失敗時會引發屬性錯誤
NameError:試圖訪問的變量名不存在
SyntaxError:語法錯誤,代碼形式錯誤
Exception:所有異常的基類,因為所有python異常類都是基類Exception的其中一員,異常都是從基類Exception繼承的,並且都在exceptions模塊中定義。
IOError:一般常見於打開不存在文件時會引發IOError錯誤,也可以解理為輸出輸入錯誤
KeyError:使用了映射中不存在的關鍵字(鍵)時引發的關鍵字錯誤
IndexError:索引錯誤,使用的索引不存在,常索引超出序列范圍,什么是索引
TypeError:類型錯誤,內建操作或是函數應於在了錯誤類型的對象時會引發類型錯誤
ZeroDivisonError:除數為0,在用除法操作時,第二個參數為0時引發了該錯誤
ValueError:值錯誤,傳給對象的參數類型不正確,像是給int()函數傳入了字符串數據類型的參數。
捕獲異常
try語句一旦被檢測出異常,剩下的語句將不會被執行
幾種搭配:
1.try except
1 try: 2 sum = 1/0 3 except ZeroDivisionError: 4 print('出錯')
可以指明出錯原因:
1 try: 2 sum = 1/0 3 except ZeroDivisionError as reason: 4 print('出錯,錯誤原因:',str(reason))
可以用多個except語句:
1 try: 2 f = open("nofile.txt") 3 sum = 1/0 4 except IOError as reason: 5 print('出錯,錯誤原因:',str(reason)) 6 except ZeroDivisionError as reason: 7 print('出錯,錯誤原因:',str(reason))
可以用一個元組捕獲多個異常:
1 try: 2 sum = 1/0 3 f = open("nofile.txt") 4 except (IOError,ZeroDivisionError) as reason: 5 print('出錯,錯誤原因:',str(reason))
用while True 和 else 組合,else后的語句在沒有異常的情況下才執行,注意縮進,輸入錯誤后會重新輸入直到正確:
1 while True: 2 try: 3 x = int(input("input first num")) 4 y = int(input("input first num")) 5 z = x/y 6 print(z) 7 except ZeroDivisionError: 8 print("error,try again") 9 else: 10 break
不管try語句中是否發生異常,finally語句后都會執行:
1 try: 2 x = int(input("input first num")) 3 y = int(input("input first num")) 4 z = x/y 5 print(z) 6 except ZeroDivisionError: 7 print("error:") 8 finally: 9 print("結束")
三十四 else和with
else:
if-else語句:
和各種語言相同的用法,在條件語句中,與if語句搭配使用的else語句。如果if語句的條件表達式的結果布爾值為假,那么程序將執行else語句后的代碼。
elif(else-if)語句:
elif是python提供的else-if語句,它檢查多個條件表達式的值是否為真,並在為真時執行特定代碼塊中的代碼。和else一樣,elif是可選的,但是要注意的是,一個if語句可以跟多個elif語句,但最后只能有一個else語句
while-else/for-else語句:
在其他語言中,除了條件語句,是不會見到else分支的,但在Python中,while和for循環中,也是可以使用else語句的。它們的工作順序為:在循環中使用時,else語句只在循環完成后執行,也就是說,break語句也會跳過else代碼塊,只要循環是正常結束,而不是通過break,else語句就會執行
求素數:
1 def fun(num): 2 count = int(num/2) 3 while count>1: 4 if(num%count == 0): 5 print("%d的最大公約數是:%d" %(num,count)) 6 break 7 count -= 1 8 else: 9 print("%d是素數" %num) 10 11 n = int(input("請輸入一個整數:")) 12 fun(n)
執行結果:
注意:Python中沒有自增自減運算符,格式化輸出多個字符要用元組的形式
try-else語句:
對於python中的錯誤和異常,try-except語句段,也可以和else連用,其功能和循環中的else語句沒有多大區別:在try范圍內沒有檢測到異常的時候,執行else子句。
with:
這個語法是用來代替傳統的try...finally語法的。
with EXPRESSION [ as VARIABLE] WITH-BLOCK
1 try: 2 with open("e://1.txt",'r') as f: 3 for each_line in f: 4 print(each_line) 5 except IOError as reason: 6 print("Error:",str(reason))
如果用finally,若是文件不存在,也要走f.close(),這樣的話文件存在打開后會自動關閉
模塊
(1)import 文件名 比如想導入tmp.py,在主程序中寫import tmp,並用tmp.調用函數
(2)from 模塊 import 函數(若要引用全部,寫*) 在主程序中直接調用函數名
(3)import 文件名 as 別名 在主程序中用 別名. 調用函數
if __name__ == "__main__":
簡單來說當一個文件作為模塊時,在if __name__ == "__main__":語句后的內容不能被調用
原理:
當作為模塊時,可見__name__並不等於__main__,所以之后的東西不會執行,也不能被調用
搜索路徑:用列表的方式添加或刪除
包:創建一個文件夾,文件夾中存放相應模塊,文件夾的名字就是包的名字,在文件夾中創建一個__init__.py的模塊文件,內容可以為空
使用包,import 包名.模塊名
標准庫
學習一個模塊的方法,以timeit模塊為例:
1.IDLE中F1,索引
2. IDLE中print(timeit.__doc__)查詢模塊說明
3. dir(timeit)查詢所有用法
4. timeit.__all__查詢對外接口
5. timeit.__file__查詢源碼路徑
介紹timeit模塊
爬蟲
urllib