1. 程式人生 > 其它 >python之 檔案的操作

python之 檔案的操作

本章內容

  • 檔案內游標的移動
  • 檔案資料修改
  • 函式簡介
  • 函式的語法結構

檔案內游標的移動

# 1. 檔案內容的讀取,游標移動 eg:
    with open(r'1.txt','r',encoding='utf8') as f:
        print(f.read(3))
        print(f.read(3))
# 在文字模式下,括號內的數字表示的是讀取指定的字元個數
"""
如下圖所示:
	綠色的箭頭表示第一個print輸出後游標所在的位置
	紅色的箭頭表示第二個print輸出後游標所在的位置
"""        
# 在二進位制模式下,read括號內的數字表示的是讀取指定的位元組數
eg:
    with open(r'1.txt', 'rb') as f:
    print(f.read(9).decode('utf8'))
    print(f.read(3).decode('utf8'))

# unicode 中所有的字元都是用2bytes來起步表示
# utf8中,中文用3bytes來表示 英文用1bytes來表示

# 2. 控制游標的移動
    with open(r'1.txt', 'r',encoding='utf8') as f:
        print(f.read(2))
        f.seek(3, 0)
        print(f.read(2))	
# 錯誤示例 
    # with open(r'a.txt', 'rb') as f:
    #     print(f.read(3).decode('utf8'))
    #     # f.seek(3, 1)  # 基於當前位置 繼續往後移動三個位元組
    #     f.seek(-3, 2)  # 基於檔案末尾 往前移動三個位元組
    #     print(f.tell())  # 獲取游標基於檔案開頭的位元組數
    #     print(f.read().decode('utf8'))
"""記得文字檔案用b模式的時候要注意文字內容的末尾是否有空格和空行,不然可能查詢不到"""
# 正確示例:
# 錯誤示例:
"""
	seek方法可以控制游標的移動 在文字模式下移動的單位也是位元組數
    	模板:    seek(offset,whence)
    		offset (控制偏移的位元組數)
    		whence (控制模式(0, 1, 2))
    	0: 相對於檔案開頭(讓游標先移動到檔案開頭)
                支援文字模式和二進位制模式
        1:相對於當前位置(讓游標先停留在當前位置)
                只支援二進位制模式
        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='')

檔案資料修改

"""
檔案資料在硬碟上其實是刻死 不可能從中間再新增新的內容
只能將老內容移除 刻新的
"""

檔案修改方式一:

# 實現思路:將檔案內容發一次性全部讀入記憶體,然後在記憶體中修改完畢後再覆蓋寫回原檔案
# 優點: 在檔案修改過程中同一份資料只有一份
# 缺點: 會過多地佔用記憶體
eg:
    with open('a.txt', mode='rt', encoding='utf-8') as f:
    	data = f.read()
	with open('a.txt', mode='wt', encoding='utf-8') as f:
    	f.write(data.replace('張一蛋', 'SB'))

檔案修改方式二:

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

函式簡介

函式的使用必須遵循’先定義,後呼叫’的原則。函式的定義就相當於事先將函式體程式碼儲存起來,然後將記憶體地址賦值給函式名,函式名就是對這段程式碼的引用,這和變數的定義是相似的。
沒有事先定義函式而直接呼叫,就相當於在引用一個不存在的’變數名’。

函式的語法結構

def 函式名(引數1,引數二...):
	'''文件描述'''
    函式體程式碼
    return 返回值

# 1. def: 定義函式的關鍵字;
# 2. 函式名:函式名指向函式記憶體地址,是對函式體程式碼的引用。函式的命名應該反映出函式的功能;
# 3. 括號:括號內定義引數,引數是可有可無的,且無需指定引數的型別;
# 4. 冒號:括號後要加冒號,然後在下一行開始縮排編寫函式體的程式碼;
# 5. """文件描述""": 描述函式功能,引數介紹等資訊的文件,非必要,但是建議加上,從而增強函式的可讀性;
# 6. 函式體:由語句和表示式組成;
# 7. return 值:定義函式的返回值,return是可有可無的。

注意事項

"""
定義函式需要使用def關鍵字
	定義函式的過程不會執行函式體程式碼 只會檢測語法
                def s(x, y):
                    if      語法錯誤定義的時候就會報錯
		def s():
		    abcdef哈哈哈  定義的時候不會報錯
呼叫函式需要使用函式名加括號
"""