1. 程式人生 > >我的Python成長之路---Day9-檔案處理的補充和Python中的函式基礎使用

我的Python成長之路---Day9-檔案處理的補充和Python中的函式基礎使用

=============================================檔案處理補充============================================

一、檔案內指標的移動

大前提:檔案內指標的移動是Bytes為單位的,唯獨t模式下的read讀取內容個數是以字元為單位

f.read(3)          read的t模式下是以字元為單位進行讀取的,這裡3表示只讀取3個字元

                   比如輸出為:你a我
with open('a.txt',mode='rt',encoding='utf-8') as f:
    data=f.read(3)
    print(data)

with open('a.txt',mode='rb') as f:        rb模式下read裡邊的數字表示讀取三個位元組,在這裡即讀 
                                          取'你'所佔的三個位元組,讀取出來之後為二進位制,使用decode 
                                          解碼之後,輸出為:你
    data=f.read(3)
    print(data.decode('utf-8'))

f.seek(指標移動的位元組數,模式控制): (seek裡邊的兩個引數)控制檔案指標的移動模式控制:0: 預設的模式,該模式代表指標移動的位元組數是以檔案開頭為參照的1: 該模式代表指標移動的位元組數是以當前所在的位置為參照的2: 該模式代表指標移動的位元組數是以檔案末尾的位置為參照的 強調:其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用

f.tell()檢視檔案指標當前距離檔案開頭的位置,輸出時會給一個數字返回值,表示當前指標距離檔案開頭的位元組數

0模式詳解 with open('a.txt',mode='rt',encoding='utf-8') as f:     f.seek(4,0)                print(f.tell())                           比如這裡會給一個返回值4  表示指標距離檔案開頭為4個位元組的距離     print(f.read())

with open('a.txt',mode='rb') as f:     # f.seek(4,0)     f.seek(2,0)                                             在UTF-8編碼模式下,改行操作會進行報錯,因為在utf-8模式下,漢子是以3個位元組為單位的,在這裡                                                             輸入兩個位元組不能完成讀取一個漢字佔用的位元組.使用b模式開啟某個檔案時,如果輸出結果會進行報錯     print(f.tell())     print(f.read().decode('utf-8'))

with open('a.txt',mode='rt',encoding='utf-8') as f:     f.seek(5,0)     print(f.read())

1模式詳解 with open('a.txt',mode='rb') as f:     f.seek(3,1)     print(f.tell())     f.seek(4,1)     print(f.tell())     print(f.read().decode('utf-8'))2模式詳解

須知一: 硬碟空間無法修改,硬碟中的資料更新都是用新的內容覆蓋舊的內容 記憶體控制可以修改 with open('a.txt','r+t',encoding='utf-8') as f:     f.seek(4,0)     print(f.tell())     f.write('我擦嘞')

須知二: 檔案對應的是硬碟空間,硬碟不能修改應為檔案本質也不能修改, 我們看到檔案的內容可以修改,是如何實現的呢?大致的思路:將硬碟中檔案內容讀入記憶體,然後在記憶體中修改完畢後再覆蓋回硬碟具體的實現方式分為兩種:1. 將檔案內容一次性全部讀入記憶體,然後在記憶體中修改完畢後再覆蓋寫回原檔案優點: 在檔案修改過程中同一份資料只有一份缺點: 會過多地佔用記憶體

with open('db.txt',mode='rt',encoding='utf-8') as f:
    data=f.read()                 開啟檔案並將檔案內容讀取到記憶體

with open('db.txt',mode='wt',encoding='utf-8') as f:
    f.write(data.replace('kevin','SB'))  開啟檔案(這時在使用w命令寫入檔案雖然會清空原來的檔案
                                       但是上一步已經把所有檔案內容全部讀取出來了,所以除了要修改 
                                     的部分其他部分不會發生變化)並使用replace指令修改指定的內容

2. 以讀的方式開啟原檔案,以寫的方式開啟一個臨時檔案,一行行讀取原檔案內容,修改完後寫入臨時檔案...,刪掉原檔案,將臨時檔案重新命名原檔名優點: 不會佔用過多的記憶體缺點: 在檔案修改過程中同一份資料存了兩份

import os      import:呼叫或者是使用別人封裝好的功能介面

with open('db.txt',mode='rt',encoding='utf-8') as read_f,\   (開啟原檔案)
        open('.db.txt.swap',mode='wt',encoding='utf-8') as wrife_f:  (開啟臨時檔案)
    for line in read_f:
        wrife_f.write(line.replace('SB','kevin'))     從原檔案中取內容並寫入臨時檔案

os.remove('db.txt')                     將原檔案刪除                   
os.rename('.db.txt.swap','db.txt')      將臨時檔案重新命名

===========================================函式的基本使用===============================================

1. 什麼是函式

    具備某一功能的工具->函式     事先準備工具的過程--->函式的定義     遇到應用場景,拿來就用---->函式的呼叫

    函式分類兩大類:         1. 內建函式         2. 自定義函式

2. 為何要用函式

    1. 程式碼冗餘     2. 可讀性差     3. 可擴充套件性差

3. 如何用函式

    原則:必須先定義,再呼叫

    定義函式的語法:         def(definition) 函式名(引數1,引數2,...):                   自定義函式時,函式名後邊的引數可設定可不設定,根據函式的具體功能,如果需要外                                                                                          界給定值的話,就需要設定引數了             """文件註釋"""                                                      文件註釋需要對自定義的函式進行描述,包括函式的功能,函式引數代表的意義等等             code1             code2             code3             ....             return 返回值                                                      函式的返回值表示函式執行的結果,如果需要這個結果來做進一步的使用,就需要設                                                                                           置返回值,如果不需要這個結果來做進一步的使用,就不需要設定返回值

                                                                                       返回值的使用:直接將函式當做一個判斷條件或者一個值使用,比如下面的使用者登入程式,登陸成功可以返回一個True,失敗返回一個False,需要用來做進一步的判斷的時候,直接使用if login():  就可以進行判斷;再比如下邊的比較大小的函式,     呼叫函式的語法:         函式名(值1,值2,...)

def login():     uname=input('請輸入使用者名稱>>: ').strip()     pwd=input('password>>: ').strip()     if uname == 'egon' and pwd == '123':         print('login successfull')         return True     else:         print('user or password error')         return False

# print(login) login() login()

def max2(x,y):     # x=10     # y=20     if x > y:         return x     else:         return y

res=max2(3.1,2.3) print(res*12)