1. 程式人生 > >關於檔案的讀寫

關於檔案的讀寫

檔案的作用

就是把一些儲存存放起來,可以讓程式下一次執行的時候直接使用,而不必重新制作一份,省時省力

檔案的基礎操作

開啟檔案

Python內建了一個open()方法,用於對檔案進行讀寫操作。使用open()方法操作檔案就像把大象塞進冰箱一樣,可以分三步走,一是開啟檔案,二是操作檔案,三是關閉檔案。

open()方法的返回值是一個file物件,可以將它賦值給一個變數(檔案控制代碼)。其基本語法格式為:

f = open(filename, mode)

filename 檔名稱

mode 開啟模式

開啟模式常用的有 r(讀模式,檔案必須存在) w(寫模式),當然還有一些其他方式
檔案開啟模式

文字檔案和二進位制檔案的區別

文字和二進位制的區別

檔案的關閉

f.close() 

編碼問題

要讀取非UTF-8編碼的檔案,需要給open()函式傳入encoding引數,例如,讀取GBK編碼的檔案:

 f = open('gbk.txt', 'r', encoding='gbk')
 f.read()
'GBK'

遇到有些編碼不規範的檔案,可能會丟擲UnicodeDecodeError異常,這表示在檔案中可能夾雜了一些非法編碼的字元。遇到這種情況,可以提供errors引數,表示如果遇到編碼錯誤後如何處理。

f = open('gbk.txt', 'r', encoding='gbk', errors='ignore')

檔案物件操作

每當我們用open方法開啟一個檔案時,將返回一個檔案物件。這個物件內建了很多操作方法。下面假設,已經打開了一個f檔案物件。

f.read(size)

讀取一定大小的資料, 然後作為字串或位元組物件返回。size是一個可選的數字型別的引數,用於指定讀取的資料量。當size被忽略了或者為負值,那麼該檔案的所有內容都將被讀取並且返回。

f = open("1.txt", "r")
str = f.read()
print(str)

str = f.read()
print(str)

str = f.read(1)
print(str)

f.close()

f.readline()

從檔案中讀取一行n內容。換行符為’\n’。如果返回一個空字串,說明已經已經讀取到最後一行。這種方法,通常是讀一行,處理一行,並且不能回頭,只能前進,讀過的行不能再讀了。

f = open("1.txt", "r")
str = f.readline()
print(str)
f.close()

f.readlines()

將檔案中所有的行,一行一行全部讀入一個列表內,按順序一個一個作為列表的元素,並返回這個列表。readlines方法會一次性將檔案全部讀入記憶體,所以也存在一定的風險。但是它有個好處,每行都儲存在列表裡,可以隨意存取。

f = open("1.txt", "r")
a = f.readlines()
print(a)
f.close()

f.write()

將字串或bytes型別的資料寫入檔案內。write()動作可以多次重複進行,其實都是在記憶體中的操作,並不會立刻寫回硬碟,直到執行close()方法後,才會將所有的寫入操作反映到硬碟上

開啟一個檔案

f = open("foo.txt", "w")
f.write("人生苦短我用Python!\n")

關閉開啟的檔案

f.close()

讀取大檔案的處理方式

比如一個檔案很大,比如5G,怎麼把檔案的資料讀取到記憶體然後進行處理呢?

while True:
	content = filename.read(1024)	#每次讀取1024個位元組
	if len(content)==0:           #如果讀取內容長度等於0,意味著檔案讀取完畢
	break

檔案的定位讀寫- f.seek()

f = open(filename)
第一個引數    開始的偏移量,也就是代表需要移動偏移的位元組數
第二個引數    0 從檔案開始讀取    1 從當前位置去讀    2 從檔案末尾開始讀取
f.seek(2,0)
cont = f.readline()		打印出來的結果是從filename第二個位元組開始的
print(cont)	
con = f.read()
print(con)				列印的剩下的所有內容

f.tell()

返回檔案讀寫指標當前所處的位置,它是從檔案開頭開始算起的位元組數。一定要注意了,是位元組數,不是字元數。

f.close()

關閉檔案物件。當處理完一個檔案後,呼叫f.close()來關閉檔案並釋放系統的資源。檔案關閉後,如果嘗試再次呼叫該檔案物件,則會丟擲異常。

with關鍵字

with關鍵字用於Python的上下文管理器機制。為了防止諸如open這一類檔案開啟方法在操作過程出現異常或錯誤,或者最後忘了執行close方法,檔案非正常關閉等可能導致檔案洩露、破壞的問題 。Python提供了with這個上下文管理器機制,保證檔案會被正常關閉。在它的管理下,不需要再寫close語句。注意縮排。

with open('test.txt', 'w') as f:
    f.write('Hello, world!')
with支援同時開啟多個檔案:  
with open('log1') as obj1, open('log2','w') as obj2:
    s=obj1.read()
    obj2.write(s)

檔案的相關操作

修改檔名稱

import os
os.rename(filename,newfilename)

刪除檔案

os.remove(filename)

建立資料夾

os.mkdir(dirname)

獲取當前目錄

os.getcwd()

改變預設路徑

os.chdir("../")

刪除資料夾

os.rmdir(dirname)

案例: 製作檔案的備份

思路:
	獲取要複製的檔名
	開啟這個檔案
	新建一個檔案
	讀取舊檔案
	往新檔案寫
	關閉兩個檔案
filename = input("請輸入要複製的檔名稱:")
f = open(filename,'r')
content = f.read()
position = filename.rfind(".")
newfile = filename[:position]+ '(復件)' + filename[position:]
r = open(newfile,'w')
r.write(content)
f.close()
r.close()

案例:批量重新命名檔名稱

import os
# 獲取重新命名的資料夾 名稱
dir_name = input("請輸入要重新命名的資料夾:")
# 獲取資料夾中的所有檔名稱
filenames = os.listdir(dir_name)
# 切換目錄      如果不切換目錄要在下面連線
os.chdir(dir_name)
for name in filenames:
    # os.rename(dir_name+'/'+name,dir_name+'/'+"[居然]"+name)
    os.rename(name,"[居然]"+name)