Python中檔案處理

2021-08-20 12:09:47 字數 4922 閱讀 1011

一、什麼是檔案?

檔案是計算機中作業系統為使用者或者應用程式提供的乙個讀寫硬碟的虛擬單位,檔案操作的核心就是讀和寫。我們需要進行讀寫操作,就是對作業系統傳送請求,然後由作業系統將使用者或者應用程式對檔案讀寫操作轉換成具體的硬碟指令。

二、為什麼要有檔案?

我們知道,記憶體中的資料是無法永久儲存的,能長期儲存資料需要用到硬碟。操作檔案就可以實現對硬體的操作。

三、python中如何實現對檔案的具體操作?

1.把硬碟中的資料讀到記憶體中

f = open(r'd:\python\a.txt', mode = r)#前面的r指定後面字串的原生路徑。mode = r指的開啟模式為唯讀模式

data = f.read()   #f.read()會一次性將檔案全部內容載入到記憶體中,這裡使用乙個變數接收檔案中的內容

print(data)

f.close  #向作業系統發起請求,要求作業系統關閉檔案,**系統資源。

ps:這裡補充一下檔案的路徑,一般分為兩種:絕對路徑與相對路徑。

絕對路徑:可以理解為從碟符[linux一般從根目錄下]開始,寫乙個完整的路徑(如:d:\python\a.txt   這就是乙個檔案的絕對路徑)

四、python中讀寫檔案的具體模式

1.控制讀寫檔案的內容的結果有兩種,t模式text,b模式byte。這兩種模式均不能單獨使用,都需要與r/w/a 之一一起連用

2.預設的內容格式為:t模式

3.只有文字檔案才用t模式,同樣也只有t模式才有字元編碼的概念。

4.操作檔案的基礎模式有三種:

r 唯讀模式(預設的), w只寫模式,a只追加寫模式

r:read,唯讀模式

注意兩點:只能讀,不能寫; 在檔案不存在時,會報錯,在檔案存在時會將檔案指標移動到檔案起始位置。

f = (r'a.txt', mode = 'rt' , encoding = 'utf-8')#讀取乙個相對路徑下叫『a.txt』的檔案,以rt方式開啟,utf-8字元編碼

data1 = f.read() #一次讀取全部檔案內容並用data1這個變數去接收

print(data1)

f.close()#關閉檔案,釋放系統資源

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

print(f.readable())#一次只讀取一行檔案內容

print(f.readable(), end='')#讀取一行內容,且不換行

print(f.readable(), end='')

lines = f.readlines()

print(lines)

f.close()

w:只寫模式

注意兩點:只能寫,不能讀; 在檔案不存在時自動建立新的空檔案,在檔案存在時,會在寫入的時候將檔案清空。 

f=open(r'b.txt',mode='wt',encoding='utf-8')

print(f.readable)

f.write('this\nis\na\ntest\n')#\n換行,this is a test會分4行顯示,若檔案存在,會在寫入的時候將檔案清空再寫入。

f.write('abcd\n')#在這次寫入的時候會先將檔案清空,再寫入。

lines = ['123\n', '456\n', '789\n',]

for line in lines:

f.write(line)#迴圈將lines列表中的元素寫入檔案中。

f.writelines(lines)#列表中的元素依次迭**入檔案中。

f.close()

a: 只追加寫模式

注意兩點:只能寫,不能讀;在檔案不存在時候會建立新的空檔案並將內容寫入,檔案存在時會將指標移至檔案末尾。

f=open('c.txt',mode='at',encoding='utf-8')

print(f.readable)

f.write('abcd\n')

f.writelines(['123\n', '456\n', '789\n'])#將列表中的元素迭**入檔案中

b:二進位制模式

注意兩點:一定不能指定字元編碼,二進位制資料沒有字元編碼這一說,只有t模式下的文字資料才有字元編碼;b是二進位制模式,是一種通用的檔案讀取模式,因為所有的檔案都是以二進位制形式存放在硬碟中的。

file = open('photo.jpg','rb') #以rb模式開啟乙個

data = file.read()

print(type(data), data)

file.close()

五、迴圈讀取檔案中的內容

我們知道.read()會一次讀取全部檔案內容,假設某個檔案很大,有7g,如果採取這種方式進行讀取,7g的資料一下子載入到記憶體中,會導致機器卡頓(若超過機器記憶體,有可能會卡死),通過迴圈讀取檔案中的內容即可解決。

f = open('d.txt','rt', encoding = 'utf-8')

for line in f:

print(line)

f.close()

f = open('d.txt','rb')

for line in f:

print(line)

f.close()

六、上下文管理

即使一再強調,可能還是會忘記掉關閉開啟的檔案,釋放系統資源。with應運而生。通過with可以在檔案開啟之後自動釋放掉系統資源,由於檔案中的資料由變數名接收並儲存在記憶體中,我們使用的時候只需要呼叫記憶體中的變數就可以了。

with open('e.txt','rb')as f , open('j.txt', 'rb')as f1:

f1.write(f.read())#注意縮排

七、檔案操作的其他模式

r + t(可讀、可寫)

w+ t(可寫、可讀)

with open('b.txt', 'w+t', encoding = 'utf-8')as f:

print(f.readable())

print(f.writeable())

with open('b.txt',mode = 'rb')as f:

data = f.read()

print(data.decode(utf-8))

八、控制檔案指標移動

f.seek(offset, whence)

offset 代表檔案的指標偏移量,單位是位元組bytes

whence表示參照物,有三個取值

0:參照檔案開頭

1:參照當前檔案指標所在位置

2:參照檔案末尾

其中,whence = 1和whence = 2只能在b模式下使用

f = open('c.txt',mode = 'rt', encoding = 'utf-8')

f.seek(9, 0)#參照檔案開頭,指標向又移動9個位元組

print(f.tell())#每次統計的都是從檔案開頭到當前指標所處的位置

print(f.readline())

f.close()

f = open('c.txt', mode = 'rb')

f.readline()

f.seek(6, 1)

print(f.readline().decode('utf-8'))

print(f.tell())

f.close()

f = open('c.txt', mode = 'rb')

f.seek(-9, 2)

print(f.readline().decode('utf-8'))

print(f.tell())

f.close

只有在t模式下read(n), n代表的是字元個數,除此之外涉及到檔案指標移動的都是以位元組為單位

f = open('c.txt', mode = 'rt', encoding='utf-8')

print(f.read(3))

f.close()

f = open('c.txt', mode = 'rb')

print(f.read(3).decode('utf-8'))

f.close()

f=open('b.txt',mode='at',)

f.truncate(9) # 參照物永遠是檔案開頭

f.close()

九、修改檔案

第一種方法:先將原檔案內容一次性全部載入到記憶體中,然後在記憶體中修改完畢後,在覆蓋寫回原檔案。

優點:在修改期間,檔案內容只有乙份

缺點:當檔案過大,會占用過多的記憶體空間

with open('d.txt', 'rt', encoding='utf8')as read_f:

msg = read_f.read()

msg = msg.replace('123', 'abc')

with open('d.txt', 'rt', encoding='utf-8')as write_f:

write_f.write(msg)

以上實現了將原檔案中的『123』替換成『abc』

修改檔案內容的第二種方法:

以讀的方式開啟原檔案,以寫的方式開啟另乙個檔案,從原檔案中迴圈讀取每一行內容修改後寫入新檔案,刪除原檔案 ,將新檔案重新命名為原檔案的名字。

優點:同一時刻只有一行內容存在於記憶體

缺點:在修改期間,檔案內容始終有兩份存在

import os

with open('d.txt', 'rt', encoding='utf-8')as read_f, with open('d.txt.temp', 'wt', encoding = 'utf-8')as write_f:

for line in read_f:

write_f.write(line.replace('abc', '123'))

os.remove('d.txt')#刪除原檔案

os.rename('d.txt.temp', 'd.txt')#將新檔案重新命名為原檔名

python中檔案的處理

二 讀寫文字 import os r 防止字元轉義 path r e downloads 2018 nuclear recognition stage1 train files os.listdir path print len files from os import listdir,path,m...

Python處理中文

用python寫了個從一堆中文微博中抽取電影票房資料的程式,處理中文編碼問題非常麻煩,有以下經驗 1,在正規表示式中的中文應該用 u x的形式,正規表示式字串還要以ur為字首 u表示unicode,r表示raw,即忽略c 形式的轉義字元 2,各種編碼都統一成utf8的時候世界終於清靜了 4,原始碼開...

python中文處理

1.多位元組問題必須要全部轉成unicode再處理,否則就會有問題,比如中文gbk編碼的 和珅 其中的珅的後半位元組和 的一樣的,所以在處理的時候會有問題,如下我們用re.split來分割 用正則分隔某個字串 def split str,patternlist unicodestr str.deco...