我的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)