1. 程式人生 > 其它 >游標的移動,檔案的概念,函式簡介

游標的移動,檔案的概念,函式簡介

檔案內游標的移動(瞭解)

引言:
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:控制模式
  1. 控制模式的分類

    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='')
    
  2. 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()