python開發第三篇--文件的基本操做和初識函數

文件的基本操做

編碼

1.不一樣編碼之間的二進制是不能互相識別的。
2.對於文件的存儲,及傳輸 不能是unicode的編碼。python

bytes:內部編碼格式(非unicode)
str:內部編碼格式(unicode)

文件的基本操做流程

  • 計算機系統分爲:計算機硬件,操做系統,應用程序三部分。
  • 咱們用python或其餘語言編寫的應用程序若想要把數據永久保存下來,必需要保存於硬盤中,這就涉及到應用程序要操做硬件,衆所周知,應用程序是沒法直接操做硬件的,這就用到了操做系統。操做系統把複雜的硬件操做封裝成簡單的接口給用戶/應用程序使用,其中文件就是操做系統提供給應用程序來操做硬盤虛擬概念,用戶或應用程序經過操做文件,能夠將本身的數據永久保存下來。
  • 有了文件的概念,咱們無需再去考慮操做硬盤的細節,只須要關注操做文件的流程:
#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')

文件的打開方式

  • 文件句柄 = open(‘文件路徑’,‘模式’)
#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, 寫讀[可寫,可讀]

文件的操做方法

  • read(3):

  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
  • for循環:循環文件句柄,能夠保證內存中每次只有一行
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格。

   函數名:函數名只能包含字符串、下劃線和數字且不能以數字開頭。雖然函數名能夠隨便起,但咱們給函數起名字仍是要儘可能簡短,並能表達函數功能

   括號:是必須加的,先別問爲啥要有括號,總之加上括號就對了!

註釋:每個函數都應該對功能和參數進行相應的說明,應該寫在函數下面第一行。以加強代碼的可讀性。

調用:就是 函數名() 要記得加上括號

函數的返回值return

我們用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關鍵字的做用:
    1.return 是一個關鍵字。
    2.返回值有幾種狀況:分別是沒有返回值、返回一個值、返回多個值。
  • 沒有返回值None

不寫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)
  • 只寫return,後面不寫其餘內容,也會返回None,可是遇到return會終止整個函數。
def ret_demo():
    print(111)
    return #只寫return
    print(222)

ret = ret_demo()
print(ret)
  • 返回一個值,只須要在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)
  • 返回多個值,能夠是任意多個數據類型的值。返回的多個值會被組織成元組被返回,也能夠用多個值來接收。
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

相關文章
相關標籤/搜索