1.不一樣編碼之間的二進制是不能互相識別的。
2.對於文件的存儲,及傳輸 不能是unicode的編碼。python
bytes:內部編碼格式(非unicode) str:內部編碼格式(unicode)
#1. 打開文件,獲得文件句柄並賦值給一個變量 f=open('a.txt','r',encoding='utf-8') #默認打開模式就爲r #2. 經過句柄對文件進行操做 data=f.read() #3. 關閉文件 f.close()
打開一個文件包含兩部分資源:操做系統級打開的文件+應用程序的變量。在操做完畢一個文件時,必須把與該文件的這兩部分資源一個不落地回收,回收方法爲:linux
f.close() #回收操做系統級打開的文件
f=open(...)是由操做系統打開文件,那麼若是咱們沒有爲open指定編碼,那麼打開文件的默認編碼很明顯是操做系統說了算了,操做系統會用本身的默認編碼去打開文件,在windows下是gbk,在linux下是utf-8。vim
#這就用到了上節課講的字符編碼的知識:若要保證不亂碼,文件以什麼方式存的,就要以什麼方式打開 f=open('a.txt','r',encoding='utf-8')
#1. 打開文件的模式有(默認爲文本模式): r ,只讀模式[默認模式,文件必須存在,不存在則拋出異常] w,只寫模式[不可讀;不存在則建立;存在則清空內容] a, 只追加寫模式[不可讀;不存在則建立;存在則只追加內容] #2. 對於非文本文件,咱們只能使用b模式,"b"表示以字節的方式操做(而全部文件也都是以字節的形式存儲的,使用這種模式無需考慮文本文件的字符編碼、圖片文件的jgp格式、視頻文件的avi格式) rb wb ab 注:以b方式打開時,讀取到的內容是字節類型,寫入時也須要提供字節類型,不能指定編碼 #3,‘+’模式(就是增長了一個功能) r+, 讀寫[可讀,可寫] w+,寫讀[可寫,可讀] a+, 寫讀[可寫,可讀] #4,以bytes類型操做的讀寫,寫讀,寫讀模式 r+b, 讀寫[可讀,可寫] w+b,寫讀[可寫,可讀] a+b, 寫讀[可寫,可讀]
1. 文件打開方式爲文本模式時,表明讀取3個字符
2. 文件打開方式爲b模式時,表明讀取3個字節windows
其他的文件內光標移動都是以字節爲單位的如:seek,tell,truncate 注意:
1. seek有三種移動方式0,1,2,其中1和2必須在b模式下進行,但不管哪一種模式,都是以bytes爲單位移動的
2. truncate是截斷文件,因此文件的打開方式必須可寫,可是不能用w或w+等方式打開,由於那樣直接清空文件了,因此truncate要在r+或a或a+等模式下測試效果。編輯器
def readable(self, *args, **kwargs): # real signature unknown 是否可讀 pass def readline(self, *args, **kwargs): # real signature unknown 僅讀取一行數據 pass def seek(self, *args, **kwargs): # real signature unknown 指定文件中指針位置 pass def flush(self, *args, **kwargs): # real signature unknown 刷新文件內部緩衝區 pass
with open("userinfo",encoding="utf-8",mode="r") as f: for line in f:
文件的數據是存放於硬盤上的,於是只存在覆蓋、不存在修改這麼一說,咱們平時看到的修改文件,都是模擬出來的效果,具體的說有兩種實現方式:
方式一:將硬盤存放的該文件的內容所有加載到內存,在內存中是能夠修改的,修改完畢後,再由內存覆蓋到硬盤(word,vim,nodpad++等編輯器)函數
import os # 調用系統模塊 with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: data=read_f.read() #所有讀入內存,若是文件很大,會很卡 data=data.replace('alex','SB') #在內存中完成修改 write_f.write(data) #一次性寫入新文件 os.remove('a.txt') #刪除原文件 os.rename('.a.txt.swap','a.txt') #將新建的文件重命名爲原文件
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')
函數是組織好的,可重複使用的,用來實現單一,或相關聯功能的代碼段。
函數能提升應用的模塊性,和代碼的重複利用率。你已經知道Python提供了許多內建函數,好比print(),len()等。但你也能夠本身建立函數,這被叫作用戶自定義函數。測試
第一個函數:編碼
#函數定義 def mylen(): """計算s1的長度""" s1 = "hello world" length = 0 for i in s1: length = length+1 print(length) #函數調用 mylen()
格式:操作系統
定義:def 關鍵詞開頭,空格以後接函數名稱和圓括號(),最後還有一個":"。 def 是固定的,不能變,他就是定義函數的關鍵字。 空格 爲了將def關鍵字和函數名分開,必須空(四聲),固然你能夠空2格、3格或者你想空多少都行,但正常人仍是空1格。 函數名:函數名只能包含字符串、下劃線和數字且不能以數字開頭。雖然函數名能夠隨便起,但咱們給函數起名字仍是要儘可能簡短,並能表達函數功能 括號:是必須加的,先別問爲啥要有括號,總之加上括號就對了! 註釋:每個函數都應該對功能和參數進行相應的說明,應該寫在函數下面第一行。以加強代碼的可讀性。 調用:就是 函數名() 要記得加上括號
我們用len()方法時,獲得的結果會賦值給一個變量,而後獲得結果:指針
str_len = len('hello,world') print(str_len)
可是我們寫的這個函數,並不會獲得這樣的結果,如何讓他和len函數同樣,有返回值呢?
那就是在函數的最後加上一個return,return 後面寫你須要的返回值就能夠了。
#函數定義 def mylen(): """計算s1的長度""" s1 = "hello world" length = 0 for i in s1: length = length+1 return length #函數調用 str_len = mylen() print('str_len : %s'%str_len)
不寫return的狀況下,會默認返回一個None。
#函數定義 def mylen(): """計算s1的長度""" s1 = "hello world" length = 0 for i in s1: length = length+1 print(length) #函數調用 str_len = mylen() #由於沒有返回值,此時的str_len爲None print('str_len : %s'%str_len)
def ret_demo(): print(111) return #只寫return print(222) ret = ret_demo() print(ret)
#函數定義 def mylen(): """計算s1的長度""" s1 = "hello world" length = 0 for i in s1: length = length+1 return length #函數調用 str_len = mylen() print('str_len : %s'%str_len)
def ret_demo1(): '''返回多個值''' return 1,2,3,4 def ret_demo2(): '''返回多個任意類型的值''' return 1,['a','b'],3,4 #返回多個值 ret1 = ret_demo1() print(ret1) ret2 = ret_demo2() print(ret2)
實參和形參
實參,*在執行的時候表明打散
1.位置參數,按照順序一一對應
2.關鍵字參數,不用按照順序,一一對應
3.混合參數(包括關鍵字參數,和位置參數),關鍵字參數的位置必須在位置參數的後邊,一一對應
形參
1.位置參數,按照順序
2.默認參數,默認參數必須在位置參數的後邊
3.動態參數,又叫萬能參數,*在函數定義的時候聚合
*args:接收的全部位置參數,放到一個元組裏 **kwargs:接收的全部關鍵字參數,放到一個字典裏
形參的順序:位置參數--->args--->默認參數---->*kargs