摘要:文件的基本操作編碼不同編碼之間的二進(jìn)制是不能互相識(shí)別的。返回值有幾種情況分別是沒有返回值返回一個(gè)值返回多個(gè)值。函數(shù)定義計(jì)算的長度函數(shù)調(diào)用因?yàn)闆]有返回值,此時(shí)的為只寫,后面不寫其他內(nèi)容,也會(huì)返回,但是遇到會(huì)終止整個(gè)函數(shù)。
文件的基本操作 編碼
1.不同編碼之間的二進(jìn)制是不能互相識(shí)別的。
2.對(duì)于文件的存儲(chǔ),及傳輸 不能是unicode的編碼。
bytes:內(nèi)部編碼格式(非unicode) str:內(nèi)部編碼格式(unicode)文件的基本操作流程
計(jì)算機(jī)系統(tǒng)分為:計(jì)算機(jī)硬件,操作系統(tǒng),應(yīng)用程序三部分。
我們用python或其他語言編寫的應(yīng)用程序若想要把數(shù)據(jù)永久保存下來,必須要保存于硬盤中,這就涉及到應(yīng)用程序要操作硬件,眾所周知,應(yīng)用程序是無法直接操作硬件的,這就用到了操作系統(tǒng)。操作系統(tǒng)把復(fù)雜的硬件操作封裝成簡單的接口給用戶/應(yīng)用程序使用,其中文件就是操作系統(tǒng)提供給應(yīng)用程序來操作硬盤虛擬概念,用戶或應(yīng)用程序通過操作文件,可以將自己的數(shù)據(jù)永久保存下來。
有了文件的概念,我們無需再去考慮操作硬盤的細(xì)節(jié),只需要關(guān)注操作文件的流程:
#1. 打開文件,得到文件句柄并賦值給一個(gè)變量 f=open("a.txt","r",encoding="utf-8") #默認(rèn)打開模式就為r #2. 通過句柄對(duì)文件進(jìn)行操作 data=f.read() #3. 關(guān)閉文件 f.close()
打開一個(gè)文件包含兩部分資源:操作系統(tǒng)級(jí)打開的文件+應(yīng)用程序的變量。在操作完畢一個(gè)文件時(shí),必須把與該文件的這兩部分資源一個(gè)不落地回收,回收方法為:
f.close() #回收操作系統(tǒng)級(jí)打開的文件文件編碼
f=open(...)是由操作系統(tǒng)打開文件,那么如果我們沒有為open指定編碼,那么打開文件的默認(rèn)編碼很明顯是操作系統(tǒng)說了算了,操作系統(tǒng)會(huì)用自己的默認(rèn)編碼去打開文件,在windows下是gbk,在linux下是utf-8。
#這就用到了上節(jié)課講的字符編碼的知識(shí):若要保證不亂碼,文件以什么方式存的,就要以什么方式打開 f=open("a.txt","r",encoding="utf-8")文件的打開方式
文件句柄 = open(‘文件路徑’,‘模式’)
#1. 打開文件的模式有(默認(rèn)為文本模式): r ,只讀模式[默認(rèn)模式,文件必須存在,不存在則拋出異常] w,只寫模式[不可讀;不存在則創(chuàng)建;存在則清空內(nèi)容] a, 只追加寫模式[不可讀;不存在則創(chuàng)建;存在則只追加內(nèi)容] #2. 對(duì)于非文本文件,我們只能使用b模式,"b"表示以字節(jié)的方式操作(而所有文件也都是以字節(jié)的形式存儲(chǔ)的,使用這種模式無需考慮文本文件的字符編碼、圖片文件的jgp格式、視頻文件的avi格式) rb wb ab 注:以b方式打開時(shí),讀取到的內(nèi)容是字節(jié)類型,寫入時(shí)也需要提供字節(jié)類型,不能指定編碼 #3,‘+’模式(就是增加了一個(gè)功能) r+, 讀寫[可讀,可寫] w+,寫讀[可寫,可讀] a+, 寫讀[可寫,可讀] #4,以bytes類型操作的讀寫,寫讀,寫讀模式 r+b, 讀寫[可讀,可寫] w+b,寫讀[可寫,可讀] a+b, 寫讀[可寫,可讀]文件的操作方法
read(3):
1. 文件打開方式為文本模式時(shí),代表讀取3個(gè)字符
2. 文件打開方式為b模式時(shí),代表讀取3個(gè)字節(jié)
其余的文件內(nèi)光標(biāo)移動(dòng)都是以字節(jié)為單位的如:seek,tell,truncate 注意:
1. seek有三種移動(dòng)方式0,1,2,其中1和2必須在b模式下進(jìn)行,但無論哪種模式,都是以bytes為單位移動(dòng)的
2. truncate是截?cái)辔募晕募拇蜷_方式必須可寫,但是不能用w或w+等方式打開,因?yàn)槟菢又苯忧蹇瘴募?,所以truncate要在r+或a或a+等模式下測(cè)試效果。
其他方法:
def readable(self, *args, **kwargs): # real signature unknown 是否可讀 pass def readline(self, *args, **kwargs): # real signature unknown 僅讀取一行數(shù)據(jù) pass def seek(self, *args, **kwargs): # real signature unknown 指定文件中指針位置 pass def flush(self, *args, **kwargs): # real signature unknown 刷新文件內(nèi)部緩沖區(qū) pass
for循環(huán):循環(huán)文件句柄,可以保證內(nèi)存中每次只有一行
with open("userinfo",encoding="utf-8",mode="r") as f: for line in f:文件的修改
文件的數(shù)據(jù)是存放于硬盤上的,因而只存在覆蓋、不存在修改這么一說,我們平時(shí)看到的修改文件,都是模擬出來的效果,具體的說有兩種實(shí)現(xiàn)方式:
方式一:將硬盤存放的該文件的內(nèi)容全部加載到內(nèi)存,在內(nèi)存中是可以修改的,修改完畢后,再由內(nèi)存覆蓋到硬盤(word,vim,nodpad++等編輯器)
全部讀入內(nèi)存,如果文件很大,會(huì)很卡
import os # 調(diào)用系統(tǒng)模塊 with open("a.txt") as read_f,open(".a.txt.swap","w") as write_f: data=read_f.read() #全部讀入內(nèi)存,如果文件很大,會(huì)很卡 data=data.replace("alex","SB") #在內(nèi)存中完成修改 write_f.write(data) #一次性寫入新文件 os.remove("a.txt") #刪除原文件 os.rename(".a.txt.swap","a.txt") #將新建的文件重命名為原文件
循環(huán)文件句柄,可以保證內(nèi)存中每次只有一行
import os with open("a.txt") as read_f,open(".a.txt.swap","w") as write_f: for line in read_f: line=line.replace("alex","SB") write_f.write(line) os.remove("a.txt") os.rename(".a.txt.swap","a.txt")初識(shí)函數(shù)
函數(shù)的定義:
函數(shù)是組織好的,可重復(fù)使用的,用來實(shí)現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段。
函數(shù)能提高應(yīng)用的模塊性,和代碼的重復(fù)利用率。你已經(jīng)知道Python提供了許多內(nèi)建函數(shù),比如print(),len()等。但你也可以自己創(chuàng)建函數(shù),這被叫做用戶自定義函數(shù)。
第一個(gè)函數(shù):
#函數(shù)定義 def mylen(): """計(jì)算s1的長度""" s1 = "hello world" length = 0 for i in s1: length = length+1 print(length) #函數(shù)調(diào)用 mylen()
格式:
定義:def 關(guān)鍵詞開頭,空格之后接函數(shù)名稱和圓括號(hào)(),最后還有一個(gè)":"。 def 是固定的,不能變,他就是定義函數(shù)的關(guān)鍵字。 空格 為了將def關(guān)鍵字和函數(shù)名分開,必須空(四聲),當(dāng)然你可以空2格、3格或者你想空多少都行,但正常人還是空1格。 函數(shù)名:函數(shù)名只能包含字符串、下劃線和數(shù)字且不能以數(shù)字開頭。雖然函數(shù)名可以隨便起,但我們給函數(shù)起名字還是要盡量簡短,并能表達(dá)函數(shù)功能 括號(hào):是必須加的,先別問為啥要有括號(hào),總之加上括號(hào)就對(duì)了! 注釋:每一個(gè)函數(shù)都應(yīng)該對(duì)功能和參數(shù)進(jìn)行相應(yīng)的說明,應(yīng)該寫在函數(shù)下面第一行。以增強(qiáng)代碼的可讀性。 調(diào)用:就是 函數(shù)名() 要記得加上括號(hào)函數(shù)的返回值return
咱們用len()方法時(shí),得到的結(jié)果會(huì)賦值給一個(gè)變量,然后得到結(jié)果:
str_len = len("hello,world") print(str_len)
但是咱們寫的這個(gè)函數(shù),并不會(huì)得到這樣的結(jié)果,如何讓他和len函數(shù)一樣,有返回值呢?
那就是在函數(shù)的最后加上一個(gè)return,return 后面寫你需要的返回值就可以了。
#函數(shù)定義 def mylen(): """計(jì)算s1的長度""" s1 = "hello world" length = 0 for i in s1: length = length+1 return length #函數(shù)調(diào)用 str_len = mylen() print("str_len : %s"%str_len)
return關(guān)鍵字的作用:
1.return 是一個(gè)關(guān)鍵字。
2.返回值有幾種情況:分別是沒有返回值、返回一個(gè)值、返回多個(gè)值。
沒有返回值None
不寫return的情況下,會(huì)默認(rèn)返回一個(gè)None。
#函數(shù)定義 def mylen(): """計(jì)算s1的長度""" s1 = "hello world" length = 0 for i in s1: length = length+1 print(length) #函數(shù)調(diào)用 str_len = mylen() #因?yàn)闆]有返回值,此時(shí)的str_len為None print("str_len : %s"%str_len)
只寫return,后面不寫其他內(nèi)容,也會(huì)返回None,但是遇到return會(huì)終止整個(gè)函數(shù)。
def ret_demo(): print(111) return #只寫return print(222) ret = ret_demo() print(ret)
返回一個(gè)值,只需要在return寫上內(nèi)容
#函數(shù)定義 def mylen(): """計(jì)算s1的長度""" s1 = "hello world" length = 0 for i in s1: length = length+1 return length #函數(shù)調(diào)用 str_len = mylen() print("str_len : %s"%str_len)
返回多個(gè)值,可以是任意多個(gè)數(shù)據(jù)類型的值。返回的多個(gè)值會(huì)被組織成元組被返回,也可以用多個(gè)值來接收。
def ret_demo1(): """返回多個(gè)值""" return 1,2,3,4 def ret_demo2(): """返回多個(gè)任意類型的值""" return 1,["a","b"],3,4 #返回多個(gè)值 ret1 = ret_demo1() print(ret1) ret2 = ret_demo2() print(ret2)函數(shù)的參數(shù)
實(shí)參和形參
實(shí)參,*在執(zhí)行的時(shí)候代表打散
1.位置參數(shù),按照順序一一對(duì)應(yīng)
2.關(guān)鍵字參數(shù),不用按照順序,一一對(duì)應(yīng)
3.混合參數(shù)(包括關(guān)鍵字參數(shù),和位置參數(shù)),關(guān)鍵字參數(shù)的位置必須在位置參數(shù)的后邊,一一對(duì)應(yīng)
形參
1.位置參數(shù),按照順序
2.默認(rèn)參數(shù),默認(rèn)參數(shù)必須在位置參數(shù)的后邊
3.動(dòng)態(tài)參數(shù),又叫萬能參數(shù),*在函數(shù)定義的時(shí)候聚合
*args:接收的所有位置參數(shù),放到一個(gè)元組里 **kwargs:接收的所有關(guān)鍵字參數(shù),放到一個(gè)字典里
形參的順序:位置參數(shù)--->args--->默認(rèn)參數(shù)---->*kargs
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41753.html
摘要:上一篇文章實(shí)戰(zhàn)安裝下一篇文章實(shí)戰(zhàn)第一章初識(shí)第二節(jié)數(shù)據(jù)結(jié)構(gòu)簡介是一個(gè)遠(yuǎn)程內(nèi)存數(shù)據(jù)庫,它不僅性能強(qiáng)勁,而且還具有復(fù)制特性以及為解決問題而生的獨(dú)一無二的數(shù)據(jù)模型,是一個(gè)速度非??斓姆顷P(guān)系數(shù)據(jù)庫。 上一篇文章:Pyhton--Redis實(shí)戰(zhàn):Mac brew安裝redis下一篇文章:Python--Redis實(shí)戰(zhàn):第一章:初識(shí)Redis:第二節(jié):Redis數(shù)據(jù)結(jié)構(gòu)簡介 Redis是一個(gè)遠(yuǎn)程內(nèi)...
摘要:并于年月在許可證下發(fā)布??刂破魇菍⒛P秃鸵晥D隔離,并成為二者之間的聯(lián)系紐帶。該層處理與表現(xiàn)相關(guān)的決定如何在頁面或其他類型文檔中進(jìn)行顯示。會(huì)話用戶登錄與權(quán)限檢查,快速開發(fā)用戶會(huì)話功能。 1.介紹Django 1.1 Django的來源 Django是一個(gè)開放源代碼的Web應(yīng)用框架,由Python寫成。采用了MVC的框架模式,即模型M,視圖V和控制器C。它最初是被開發(fā)來用于管理勞倫斯出版集...
摘要:上面需要了解的是這倆個(gè)版本都是破蛹成蝶的版本世界挑戰(zhàn)榜咋才前三還沒擠進(jìn)去呀,你想想世界上有幾千中編程語言,在其中脫穎出來,可以說是天之嬌子,鳳毛麟角了。支持正版圖靈上面買吧,如果沒錢買盜版吧學(xué)完以后買本正版支持一下,創(chuàng)作不易是吧 ...
閱讀 2120·2021-11-24 09:39
閱讀 1503·2019-08-30 15:44
閱讀 1954·2019-08-29 17:06
閱讀 3406·2019-08-29 16:32
閱讀 3552·2019-08-29 16:26
閱讀 2662·2019-08-29 15:35
閱讀 3033·2019-08-29 12:50
閱讀 1646·2019-08-29 11:15