天天看點

檔案的操作與處理

目錄

  • 檔案操作
    • 1.什麼是檔案?
    • 2.代碼如何操作檔案
    • 3. 檔案讀、寫、追加三模式
    • 4. 檔案操作方法
      • 1. 讀系列
      • 2.寫系列
    • 5. 檔案優化操作
    • 6. 檔案操作模式
    • 二進制模式讀寫操作
    • 檔案内光标的移動(了解)
    • 檔案的内容修改(了解)

檔案其實是作業系統暴露給使用者操作硬碟的快捷方式(接口)

關鍵字open()

三步走:
        1.利用關鍵字open打開檔案
        2.利用其它方法操作檔案
        3.關閉檔案 
檔案路徑
        相對路徑與絕對路徑
        路徑中出現了字母與斜杠的組合産生了特殊含義如何取消
        在路徑字元串前面加一個r
        eg:r'D:\py20\day08\a.txt'
格式:
open(檔案路徑,讀寫模式,字元編碼)
    檔案路徑與讀寫模式是必須的
    字元編碼是可選的(有些模式需要編碼)
 res = open('a.txt', 'r', encoding='utf8')
 print(res.read())
 res.close()  # 關閉檔案釋放資源


# with上下文管理(能夠自動幫你close())
with open(r'a.txt','r',encoding='utf8') as f1:  # f1=open() f1.close()
    print(f1.read())
"""以後代碼操作檔案 推薦使用with文法"""
           

r 隻讀模式(隻能看不能改)

# 路徑不存在:直接報錯
with open(r'b.txt', 'r', encoding='utf8') as f:
         pass
# 路徑存在
with open(r'a.txt', 'r', encoding='utf8') as f:
    print(f.read())  # 讀取檔案内所有的内容
    f.write('123')  # 寫檔案内容
           
檔案的操作與處理

w 隻寫模式(隻能寫不能看)

# 路徑不存在:路徑不存在自動建立
     with open(r'b.txt', 'w', encoding='utf8') as f:
         pass

    # 路徑存在:1.會先清空檔案内容  2.再執行寫入操作
    with open(r'a.txt', 'w', encoding='utf8') as f:
        f.read()
        f.write('hello world!\n')
        f.write('hello world!\n')
        f.write('hello world!\n')
           
檔案的操作與處理

a 隻追加模式(追加内容, 同樣不能讀)

# 路徑不存在, 建立一個新的檔案,可以寫入内容但不可以讀
with open(r'money.txt', 'a', encoding='utf8') as f1:
    # f1.read()  # 報錯
    f1.write('insist study')

# 路徑存在, 在檔案内容的尾部追加新的寫入内容
with open(r'money.txt', 'a', encoding='utf8') as f2:
    f2.write('graduation from Oldboy')
           
檔案的操作與處理

小總結:

我們所學習的r w a讀寫模式都隻能操作文本檔案

with open(r'a.txt', 'r', encoding='utf8') as f:
     print(f.read())  # 一次性讀取檔案内所有的内容
     print(f.readline())  # 每次隻讀檔案一行内容
     print(f.readlines())  # 讀取檔案所有的内容 組織成清單 每個元素是檔案的每行内容
     print(f.readable())  # 判斷目前檔案是否具備讀的能力
           

with open(r'a.txt','w',encoding='utf8') as f:
     f.write('克服一切困難 奧利給!')  # 往檔案内寫入文本内容
     f.write(123)  # 寫入的内容必須是字元串類型
     f.writelines(['jason','kevin','tony'])  # 可以将清單中多個字元串元素全部寫入
     print(f.writable())  # True
     print(f.readable())  # False
   	f.flush()  # 直接将記憶體内檔案資料刷到硬碟 相當于ctrl+s
           

with open(r'a.txt', 'r', encoding='utf8') as f:
    # print(f.read())  # 一次性讀取檔案内所有的内容
    # print(f.read())  # 一次性讀取檔案内所有的内容
    # print(f.read())  # 一次性讀取檔案内所有的内容
    """
    1.一次性讀完之後 光标停留在了檔案末尾 無法再次讀取内容
    2.該方法在讀取大檔案的時候 可能會造成記憶體溢出的情況
        解決上述問題的政策就是逐行讀取檔案内容
    """
    # for line in f:  # 檔案變量名f支援for循環  相當于一行行讀取檔案内容
    #     line
    '''以後涉及到多行檔案内容的情況一般都是采用for循環讀取'''
           

t	文本模式
	1.預設的模式
    	r w a  >>> rt wt at
    2.該模式所有操作都是以字元串基本機關(文本)
    3.該模式必須要指定encoding參數
    4.該模式隻能操作文本檔案
    
b   二進制模式
	1.該模式可以操作任意類型的檔案
    2.該模式所有操作都是以bytes類型(二進制)基本機關
    3.該模式不需要指定encoding參數
    	rb wb ab
           
檔案的操作與處理

with open(r'a.txt','rb') as f:
     # print(f.read())
     print(f.read(5).decode('utf8'))


 with open(r'a.txt','r',encoding='utf8') as f:
     print(f.read())
     print(f.read(4))

"""
read()  括号内可以放數字
    在t模式下表示字元個數
    在b模式下表示位元組個數
英文字元統一使用一個bytes來表示
中文字元統一使用三個bytes來表示
"""
           
檔案的操作與處理

with open(r'b.txt', 'rb') as f:
     print(f.read(4).decode('utf8'))
     print(f.tell())  # 檢視光标移動了多少個位元組
     f.seek(3, 1)
     print(f.read().decode('utf8'))
"""
控制檔案内光标的移動  f.seek()
f.seek(offset,whence)
    offset表示位移量
        始終是以位元組為最小機關
            正數從左往右移動
            負數從右往左移動
    whence表示模式
        0:以檔案開頭為參考系(支援tb兩種模式)
        1:隻支援b模式 以目前位置為參考系
        2:隻支援b模式 以檔案末尾為參考系
"""
           

# 方式1 覆寫
 with open(r'c.txt','r',encoding='utf8') as f:
     data = f.read()
      print(type(data))
 with open(r'c.txt','w',encoding='utf8') as f1:
     new_data = data.replace('tony','jason')
     f1.write(new_data)

# 方式2 建立
import os
with open('c.txt', mode='rt', encoding='utf-8') as read_f, \
        open('c.txt.swap', mode='wt', encoding='utf-8') as write_f:
    for line in read_f:
        write_f.write(line.replace('SB', 'kevin'))
os.remove('c.txt')  # 删除原檔案
os.rename('c.txt.swap', 'c.txt')  # 重命名檔案

"""
方式1:優點   在檔案修改過程中同一份資料隻有一份   缺點   如果檔案過大記憶體會出現溢出進而崩潰
方式2: 優點   是記憶體不會出現溢出   缺點   在檔案修改過程中同一份資料存了兩份
"""