文件:
- 打開文件使用open函數,open()的第一個參數是:要打開文件的路徑,如果只傳入文件名那么將在當前文件下查找文件并打開。第二個參數是:文件的打開模式,其他參數都是默認的。文件的打開模式如下圖所示:
f=open('C:\\Users\\Lenovo\\Desktop\\test.txt','r')
f#這個f是文件對象
<_io.TextIOWrapper name='C:\\Users\\Lenovo\\Desktop\\test.txt' mode='r' encoding='cp936'>
#這里name是取自的路徑,mode是打開的模式,encoding是編碼格式
文件的讀取操作:
需要用到以下幾個文件對象方法:
f=open('C:\\Users\\Lenovo\\Desktop\\test.txt','rt',encoding="utf-8")
以只讀文本模式打開文件,編碼是utf-8
str3=f.read()
str3
'年后ijrgwingjnvjnjfdnv困難克服斯諾克女可男可女開心呢可能可男可女可能可男可女 可能發生空空死你女那oadnfkln'
f.tell()
144#文件光標的位置,打開開文件時,光標在文件頭,進行讀取操作后光標會發生移動
f.seek(0,0)
0#將光標移動到文件的頭
f.close()#關閉文件f=open('C:\\Users\\Lenovo\\Desktop\\test2.txt','w',encoding="utf-8")
str4="這是一個新文件"
f.write(str4)#返回寫入文件的字節數
7
f.close()
#寫完后關閉后才會寫入,不關閉存在緩沖區里面想要將文件里的內容迭代輸出的話可以使用for循環
方法一:先將文件對象轉化為序列再輸出
for each in list(b):print(each)這是一個新文件這是一個新文件這是一個新文件這是一個新文件這是一個新文件方法二:直接對文件對象進行操作(推薦使用)
for each in b:print(each)這是一個新文件這是一個新文件這是一個新文件這是一個新文件這是一個新文件
模塊:
- 模塊就是可用代碼段的打包,模塊是一個包含你所定義的所有函數和變量的文件,后綴是
.py
。模塊可以被別的程序引入,以使用該模塊中的函數等功能。 - 我們所知道常用的操作系統就有:Windows、Mac OS、Linux、UNIX等,這些操作系統底層對于文件系統的訪問工作原理是不一樣的,因此你可能就要針對不同的操作系統來考慮使用哪些文件系統模塊,這樣的做法非常不友好且麻煩,因為這樣意味著當你的程序運行環境一改變,你就要相應的去修改大量代碼來應付。那么有了OS模塊,我們不需要關心什么操作系統下使用什么模塊,OS模塊會幫助你選擇正確的模塊并調用。
os模塊中關于文件/目錄常用的函數使用方法
pickle模塊:
這個模塊幾乎可以將prthon的對象轉化為二進制的形式取放字節流。
存放:picking,讀取:unpicking,pickle模塊的使用:
my_list=["123",123,["hello",3.14]]
my_list
['123', 123, ['hello', 3.14]]
pick_file=open("C:\\Users\\Lenovo\\Desktop\\","wb")#注意要使用wb的方式創建文件
pickle.dump(my_list,pick_file)#將列表以二進制的方式存入到文件中
pick_file.close()#關閉該文件,只有關閉后才會保存到文件中去如果要讀取的話:
pick_file=open("C:\\Users\\Lenovo\\Desktop\\test.pkl","rb")#先將文件以二進制可讀的方式打開
my_list2=pickle.load(pick_file)#文件利用load讀取到my_list2列表
my_list2
['123', 123, ['hello', 3.14]]
異常處理:
Python標準異常總結
- AssertionError 斷言語句(assert)失敗
- AttributeError 嘗試訪問未知的對象屬性
- EOFError 用戶輸入文件末尾標志EOF(Ctrl+d)
- FloatingPointError 浮點計算錯誤
- GeneratorExit generator.close()方法被調用的時候
- ImportError 導入模塊失敗的時候
- IndexError 索引超出序列的范圍
- KeyError 字典中查找一個不存在的關鍵字
- KeyboardInterrupt 用戶輸入中斷鍵(Ctrl+c)
- MemoryError 內存溢出(可通過刪除對象釋放內存)
- NameError 嘗試訪問一個不存在的變量
- NotImplementedError 尚未實現的方法
- OSError 操作系統產生的異常(例如打開一個不存在的文件)
- OverflowError 數值運算超出最大限制
- ReferenceError 弱引用(weak reference)試圖訪問一個已經被垃圾回收機制回收了的對象
- RuntimeError 一般的運行時錯誤
- StopIteration 迭代器沒有更多的值
- SyntaxError Python的語法錯誤
- IndentationError 縮進錯誤
- TabError Tab和空格混合使用
- SystemError Python編譯器系統錯誤
- SystemExit Python編譯器進程被關閉
- TypeError 不同類型間的無效操作
- UnboundLocalError 訪問一個未初始化的本地變量(NameError的子類)
- UnicodeError Unicode相關的錯誤(ValueError的子類)
- UnicodeEncodeError Unicode編碼時的錯誤(UnicodeError的子類)
- UnicodeDecodeError Unicode解碼時的錯誤(UnicodeError的子類)
- UnicodeTranslateError Unicode轉換時的錯誤(UnicodeError的子類)
- ValueError 傳入無效的參數
- ZeroDivisionError 除數為零
程序運行過程中可能會拋出某些異常,但是這些異常不會使程序崩潰。那么如何檢測和處理這些異常呢?
- 異常的檢測可以使用try語句,try語句捕獲到異常時,異常后面的語句將不會被執行會被跳過。
栗子:
try:f=open("hhhh.txt")print(f.read())f.close()
except OSError:print("文件出錯")如果使用as reason這個可選的參數:
try:f=open("hhhh.txt")print(f.read())f.close()
except OSError as reason:print("文件出錯\n錯誤的原因是:"+str(reason))文件出錯
錯誤的原因是:[Errno 2] No such file or directory: 'hhhh.txt'要捕獲多個異常(try語句捕獲到異常時,異常后面的語句將不會被執行會被跳過,所以第二個異常沒有被打印):
try:sum=1+'1'f=open("hhhh.txt")print(f.read())f.close()
except OSError as reason:print("文件出錯\n錯誤的原因是:"+str(reason))
except TypeError as reason:print("類型出錯\n錯誤的原因是:"+str(reason))類型出錯
錯誤的原因是:unsupported operand type(s) for +: 'int' and 'str'以下方式可以檢測多個異常:
try:sum=1+'1'f=open("hhhh.txt")print(f.read())f.close()
except (OSError,TypeError):print("出錯")如果想只要程序中出現異常,不管是什么類型的都有提示,可以這樣做(不推薦):
try:sum=1+'1'f=open("hhhh.txt")print(f.read())f.close()
except:print("出錯")
- 另一個實現方式
栗子:
try:f=open("C:\\Users\\Lenovo\\Desktop\\hhhh.txt","w")sum=1+'1'f.close()
except (OSError,TypeError):print("出錯")
finally:#這里面的語句無論如何都會被執行f.close()#防止因異常退出而文件沒有被關閉,而導致數據丟失
- 可以使用raise語句自己引發一個異常,只需要在raise后面加上一個異常的名稱就好。例如:
raise ZeroDivisionError
引發除0異常。也可以:raise ZeroDivisionError("除數為0")
豐富的else語句:
else語句可以和if語句配合使用:要么怎樣,要么不怎樣。還可以和while、for循環語句搭配使用:干完了能怎樣,干不完就別想怎樣。還能和異常處理語句搭配使用:沒有問題就干吧。
- 當else和循環配合使用的話,如果循環里面的代碼正常的執行完,沒有使用break等退出,則會執行循環外else后面的代碼。
while:正常退出
else:這里會被執行,否則不被執行
- 只要try語句塊里面沒有出現任何的異常,將會執行else里面的語句
try:int("abc")
except ValueError as reason:print("出錯了"+str(reason))
else:print("沒有任何異常")
簡潔的with語句:
with在你使用完文件忘記關閉后,with語句就會幫助你關閉。
try:with open("hhhh.txt")as fd:#fd是文件標簽print(f.read())#注意代碼的縮進with下面要將代碼縮進
except OSError as reason:print("文件出錯\n錯誤的原因是:"+str(reason))
對象:
對象就是屬性加方法,靜態的特征稱為屬性,動態行為稱為方法。在pyhton中約定類名以大寫字母開頭,函數以小寫字母開頭,注意: 如果屬性的名字和方法相同,屬性會將方法覆蓋掉。那么:1、不要試圖在一個類里面定義出所有能想到的特性和方法,應該利用繼承和組合機制進行擴展。2、用不同的詞性命名,如屬性用名詞,方法名用動詞。
類的定義:
class Turtle:#屬性color="green"weight=10#方法def climb(self):#self相當于C++的this指針,在python中定義類的時候默認self作為第一個參數print("爬行")t=Turtle()#生成類對象,創建類的實例對象
t.climb()#適用類方法
繼承:
是子類自動共享父類之間數據和方法的機制,子類繼承父類所有的屬性和方法,如果子類中定義與父類同名的方法或屬性,則會自動覆蓋父類對應的方法或屬性,對父類不受影響,當子類重寫父類的構造方法時,如果還想有父類的功能,那么有兩種方法:1、調用未綁定的父類方法(只需要在子類構造方法中,寫上父類的名字.
構造方法名稱,調用父類的構造函數即可)2、使用super函數(只需要在子類構造方法中通過super函數調用父類的構造方法即可:surper().__init__(),括號里面self也不用寫
)。多重繼承: 一個子類繼承多個父類,寫法:class Son(father1,father2,.....)
class MyList (list):pass
#pass表示占位符,表示不做任何事情,list表示繼承list>>> class Parent:def hello(self):print("父類方法在子類中被調用")>>> class Son(Parent):pass>>>
>>> d=Son()
>>> d.hello()
父類方法在子類中被調用>>> class Son(Parent):def hello(self):print("子類覆蓋父類方法")>>> C=Son()
>>> C.hello()
子類覆蓋父類方法
多態: 不同對象對同一方法響應不同的行動。也就是不同類里面定義方法的名相同但是方法的內容不同。
>>> class First:def func(self):print("hello")>>> class Second:def func(self):print("你好")>>> a=First()
>>> a.func()
hello
>>> b=Second()
>>> b.func
>>> b.func()
你好
>>>
構造函數: 需要用到函數_ _init_ _(self)
方法,在對象實例化時,傳入參數,可以重寫_ _init_ _(self)
方法來初始化對對象的操作。
class New:def _init_(self,name):self.name=namedef func(self):print("%s爬"%self.name)
>>> b=New("給我")
>>> b.func()
給我爬
公有和私有:
在pyhton中沒有像c++一樣的關鍵字來說明公有還是私有。默認對象的屬性和方法都是公有的可以通過.
操作符訪問,為了實現私有變量的特征,python內部采用了name mangling(名字改編,名字重整)技術,在python中定義私有變量只需要在變量名或者函數名前加上_ _
兩個下劃線,那么這個函數或變量就會為私有的了。這樣外部就無法訪問到了。
>>> class New:__name="小魚醬"#私有的def func(self):return self.__name>>> a=New()
>>> a.func()
'小魚醬'
>>> a._New__name#其實python的私有機制是偽私有,可以通過這種方式訪問私有變量
'小魚醬'
>>>
組合:把類的實例化給放到新類里面,這樣就把舊類組合進去了
class Turtle:def __init__(self,x):self.num=x
class Fish:def __init__(self,x):self.num=x
class Pool:def __init__(self,x,y):self.turtle=Turtle(x)#turtle是烏龜的實例化對象self.fish=Fish(y)#fish是小魚的實例化對象def print_num(self):print("水池里總共烏龜有%d只,小魚%d只"% (self.turtle.num,self.fish.num))>>> pool=Pool(1,10)
>>> pool.print_num()
水池里總共烏龜有1只,小魚10只
什么是綁定?
python嚴格要求方法需要有實例才能被調用,這種限制其實就是python所謂的綁定概念。
一些與類相關的BIF:
issubclass(class,classinfo)
如果class是classinfo的一個子類,那么返回True,注意:一個類被認為是其自身的子類,classinfo可以是類對象組成的元組,只要class是其中任何一個候選的子類,則返回True。所有類默認繼承自object。isinstance(object,classinfo)
用來檢查一個實例對象是否屬于一個類,第一個參數是實例對象,第二個參數類,同樣第二個參數也可以是元組,元組里面有多個類,屬于則返回True否則返回Falsehasattr(object,name)
用來測試一個對象里面是否有指定的屬性,第一個參數是對象,第二個參數是指定的屬性名,注意:要檢查的屬性名要用字符串括起來,否則編譯器會將其認為變量可能引發異常。getattr(object,name[,default])
用來返回對象指定的屬性值,如果屬性不存在同時又沒有設置default的值,那么她會拋出異常,如果有設置default的值則會打印default的值。setattr(object,name,value)
用來設置對象中指定屬性的值,如果屬性不存在,它會新建這個屬性并且給他賦值,屬性同樣要加單引號。delattr(object,name)
用來刪除對象中指定的屬性,如果屬性不存在則拋出異常。property(fget=None,fset=None,fdel=None,doc=None)
是用來通過屬性設置屬性,返回值是一個屬性。第一個參數是獲得屬性的方法,第二個參數是設置屬性的方法,第三個參數是刪除屬性的方法。使用如下圖:
小甲魚干貨