游標的移動,檔案的概念,函式簡介
阿新 • • 發佈:2022-03-15
檔案內游標的移動(瞭解)
引言: with open (r'a.txt','r',encoding = 'utf8') as f: print(f.read(3)) print(f.read(3)) # read在文字模式下,括號內的數字表示的是讀取指定的字元個數,輸入的字元如果超過指定的文字,則輸出全部文字結束列印 a.txt的內容為: 你吃飯不 tony jason jerry with open(r'a.txt','rb') as f: print (f.read(9).decode('utf8')) # 你吃飯 print (f.read(1).decode('utf8')) # 報錯 # 'utf-8' codec can't decode byte 0xe4 in position 0: unexpected end of data 這是因為read在二進位制模式下,括號內的數字表示的是讀取指定的位元組數,按bytes來提取資料,utf8的中文是三個位元組,括號內寫了1,相當於把一個漢字給劈開了,那能不報錯嗎 unicode所有的字元都是用2bytes起步來表示 utf8中文用3bytes來表示,英文用1bytes來表示
控制游標的移動
# seek方法可以控制游標的移動,在文字模式下移動的單位也是位元組數
結構:seek(offset,whence)
offset:控制移動的字元數
whence:控制模式
-
控制模式的分類
0模式:相對於檔案的開頭(讓游標先移動到檔案開頭),支援文字模式和二進位制模式
with open(r'a.txt','r',encoding='utf8') as f: f.seek(6,0) print(f.read()) # 輸出結果: ''' 飯不 tony jason jerry '''
1模式:先對於當前位置(讓游標先停留在當前位置)只支援二進位制模式
with open(r'a.txt','rb') as f: f.seek(3) f.seek(6,1) print # 輸出結果: ''' 不 tony jason jerry '''
2模式:相對於檔案結尾(讓游標先移動到檔案末尾),只支援二進位制模式
with open(r'a.txt','rb') as f: f.seek(3,2) print(f.read().decode('utf8')) # 輸出結果為空,因為游標在末尾,後面沒有可以列印的東西 with open(r'a.txt','rb') as f: f.seek(-3,2) print(f.read().decode('utf8')) # erry 2模式的位元組數可以用負數取值,就是讓游標往前移了幾個位元組數 # 2模式可以用來實時檢測檔案內是否有新增的內容並打印出來(沒有太多的實際意義) with open('access.log', mode='rb') as f: f.seek(0, 2) while True: line = f.readline() if len(line) == 0: # 沒有內容 pass else: print(line.decode('utf-8'), end='')
-
tell獲取基於檔案開頭的位元組數
with open(r'a.txt', 'rb') as f: f.seek(3, 1) # 基於當前位置 繼續往後移動三個位元組 print(f.tell()) # 3
檔案的修改
引言:
硬碟上的資料有兩個狀態:佔有態與自由態
刪除硬碟的資料就是將佔有態轉換成了自由態,之後如果有新的資料來了並且落到了自由態位置,那麼直接覆蓋
檔案資料在硬碟上其實是刻上去的,不可能從中間再新增新的內容,只能將老的內容轉換成自由態,再重新刻新的
"""
實現思路:已讀的方式開啟原檔案,以寫的方式開啟一個臨時檔案,一行行讀取原檔案內容,修改完寫入臨時檔案
刪除原檔案
優點:不會佔用過多的記憶體
缺點:在檔案修改過程中同一份資料存了兩份
import os # 模組
"""
import os
with open(r'a.txt','r',encoding='utf8') as read_f, open(r'.a.txt.swap','w',encoding='utf8') as write_w:
for line in read_f:
write_w.write(line.replace('你吃飯不','tuzi'))
os.remove('a.txt') # 刪除檔案
os.rename('.a.txt.swap','a.txt') # 重新命名檔案
函式簡介
# ctrl + 左鍵點選 >>> 如何檢視內部原始碼
函式就是將一個寫好的功能,可以拿來重複使用的一個工具
"""
沒函式的情況
類似於修理工在修理汽車的時候需要用扳手,只能先打造出來扳手,螺絲刀什麼的才能修車,下次使用還得重新打造
有函式的情況
修理工只需要提前準備好一個工具箱,裡面提前準備好相應的工具之前就可以反覆使用
"""
函式又分為內建函式和自定義函式
內建函式就是python直譯器提前給我們寫好的,像之前我們使用的內建方法,關鍵字等都屬於內建函式
自定義函式就是我們自己寫的函式
函式的語法結構
def 函式名 (引數1,引數2):
'''函式的註釋'''
函式體程式碼
return 返回值
解釋:
# 使用方法:使用函式時需要使用函式名加括號
1.def:是定義函式的關鍵字
2.函式名:函式名類似於是變數名,指代函式體程式碼,命名與變數名一致
3.括號:定義函式的時候,函式名肯定要先寫括號
4.引數:類似於使用函式的時候,給函式內部傳遞的資料,可以不寫或者單個、多個
5.冒號:定義函式也需要有縮排的程式碼塊
6.函式的註釋:用於解釋函式的主要功能、使用方法等說明性文字
7.函式體程式碼:函式的核心功能,也是我們將來編寫的核心
8.return:後面跟什麼,那麼執行完函式就會返回什麼
拓展:
'''
定義函式需要使用的def關鍵字
定義函式的過程不會執行函式體程式碼,只會檢測語法
def index():
askjfhakldsgl 定義的時候不會報錯
def index()
if(後面不寫東西了) 這種語法結構的錯誤在定義的時候就會報錯
'''
函式使用例子:
s = 'kjsgfblkdsjblfiflkjgbdlxkjbndfb'
def mylen():
# 用於計算s字串內有多少個元素
n = 0
for i in s:
n += 1
print('字串中的個數為%s' % n)
mylen()