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

python的檔案操作

python的檔案操作

1、什麼是檔案
    檔案是操作提供給使用者/應用程式存取硬碟的一種機制

2、為何要用檔案
    永久儲存資料

3、程式碼如何操作檔案
	關鍵字open()
    三步走:
    	1.利用關鍵字open開啟檔案
        2.利用其它方法操作檔案
        3.關閉檔案

檔案路徑

相對路徑與絕對路徑
所謂相對路徑,就是相對於自己的目標檔案位置。

相對路徑:

絕對路徑:

路徑中出現了字母與斜槓的組合產生了特殊含義如何取消?
在路徑字串前面加一個r
r'D:\pycharm\測試\a.txt'

其中如果開啟一個檔案,需要這三個引數:


open(檔案路徑,讀寫模式,字元編碼)
檔案路徑與讀寫模式是必須的
字元編碼是可選的(有些模式需要編碼)
res = open('a.txt', 'r', encoding='utf8')
檔案執行的流程是這樣的。

開啟檔案,由應用程式向作業系統發起系統呼叫open(...),作業系統開啟該檔案,對應一塊硬碟空間,並返回一個檔案物件賦值給一個變數 res


print(res.read()) 呼叫檔案物件下的讀/寫方法,會被作業系統轉換為讀/寫硬碟的操作

res.close() 向作業系統發起關閉檔案的請求,回收系統資源

開啟一個檔案包含兩部分資源:
應用程式的變數res和作業系統開啟的檔案。在操作完畢一個檔案時,必須把與該檔案的這兩部分資源全部回收
,回收方法為:

1、res.close() #回收作業系統開啟的檔案資源
2、del res #回收應用程式級的變數

其中 del res一定要發生在res.close()之後,否則就會導致作業系統開啟的檔案無法關閉,白白佔用資源。
而python自動的垃圾回收機制決定了我們無需考慮del res,這就要求我們,在操作完畢檔案後,一定要記住res.close(),但是大多數人還是會不由自主的忘記res.close,考慮到這一點,python提供了關鍵字with

1、在執行完子程式碼塊後,with 會自動執行f.close()

with open('a.txt','w') as res:
pass

其中,pass只是為了補全語法結構,沒有實際意義。

2、可用用with同時開啟多個檔案,用逗號分隔開即可

with open('a.txt','r') as read_res,open('b.txt','w') as write_res:
data = read_res.read()
write_res.write(data)

指定操作文字檔案的字元編碼

f = open(...)是由作業系統開啟檔案,如果開啟的是文字檔案,會涉及到字元編碼問題,如果沒有為open指定編碼,那麼開啟文字檔案的預設編碼很明顯是作業系統說了算了,作業系統會用自己的預設編碼去開啟檔案,在windows下是gbk,在linux下是utf-8。

這就用到了上節課講的字元編碼的知識:若要保證不亂碼,檔案以什麼方式存的,就要以什麼方式開啟。

f = open('a.txt','r',encoding='utf-8')

控制檔案讀寫操作的模式

只需要記住3個①. 'r'(預設的):只讀 ②.'w':只寫 ③.'a':只追加寫
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')

執行之前
執行

執行之後直接被清空重新寫入hello world!

a 只追加模式(追加內容)

#路徑不存在:自動建立
# a模式  只追加模式
with open(r'a.txt','a',encoding='utf8') as f:
 pass
路徑存在:不會清空檔案 在檔案末尾新增內容
with open(r'a.txt', 'a', encoding='utf8') as f:
 f.write('\n今天週四了 馬上又要放假了 好開心!')


執行五次之後
小總結
我們所使用的r w a讀寫模式都只能操作文字檔案

檔案操作方法

# 檔案操作方法
# 1.讀系列
with open(r'a.txt', 'r', encoding='utf8') as f:
    # print(f.read())  # 一次性讀取檔案內所有的內容
    # print(f.readline())  # 每次只讀檔案一行內容
    # print(f.readlines())  # 讀取檔案所有的內容 組織成列表 每個元素是檔案的每行內容
    # print(f.readable())  # 判斷當前檔案是否具備讀的能力


# 2.寫系列
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迴圈讀取'''