1. 程式人生 > >python:檔案處理之TXT

python:檔案處理之TXT

檔案讀寫

1、讀寫檔案是最常見的IO操作。Python內建了讀寫檔案的函式,用法和C是相容的。

2、讀寫檔案前,我們先必須瞭解一下,在磁碟上讀寫檔案的功能都是由作業系統提供的,現代作業系統不允許普通的程式直接操作磁碟,所以,讀寫檔案就是請求作業系統開啟一個檔案物件(通常稱為檔案描述符),然後,通過作業系統提供的介面從這個檔案物件中讀取資料(讀檔案),或者把資料寫入這個檔案物件(寫檔案)。

開啟檔案:

在python中,開啟檔案使用open( )函式。其基本語法如下:

open(name[, mode[, buffering]])

引數說明:

name : 一個包含了你要訪問的檔名稱的字串值(及其路徑)。

mode : mode 決定了開啟檔案的模式:只讀,寫入,追加等。所有可取值見如下的完全列表。這個引數是非強制的,預設檔案訪問模式為只讀(r)。

buffering : 如果 buffering 的值被設為 0,就不會有寄存。如果 buffering 的值取 1,訪問檔案時會寄存行。如果將 buffering 的值設為大於 1 的整數,表明了這就是的寄存區的緩衝大小。如果取負值,寄存區的緩衝大小則為系統預設。

注:使用open函式成功開啟一個檔案後,它會返回一個檔案物件(File)。File物件代表計算機中的一個檔案,是python中的另一種型別的值,就像我們熟悉的列表和字典。拿到這個物件後就可以讀取或修改這個檔案

例1:

TxtDemo = open("G:\\PythonDemo\\demo_2.txt")   #所開啟的檔案不存在時

#上面程式碼的輸出結果為:FileNotFoundError: [Errno 2] No such file or directory: 'G:\\PythonDemo\\demo_2.txt'

例1_1:

try:
    TxtDemo = open("G:\\PythonDemo\\demo.txt")
    print("目標檔案為:",TxtDemo.name)
except FileNotFoundError:
    print("目標檔案不存在")

#上面程式碼的輸出結果為:目標檔案為: G:\PythonDemo\demo.txt

開啟檔案模式:

模式   描述
r     以只讀方式開啟檔案。檔案的指標將會放在檔案的開頭。這是預設模式。
rb  以二進位制格式開啟一個檔案用於只讀。檔案指標將會放在檔案的開頭。這是預設模式。
r+ 開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。
rb+  以二進位制格式開啟一個檔案用於讀寫。檔案指標將會放在檔案的開頭。
開啟一個檔案只用於寫入。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。
wb   以二進位制格式開啟一個檔案只用於寫入。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。
w+  開啟一個檔案用於讀寫。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。
wb+  以二進位制格式開啟一個檔案用於讀寫。如果該檔案已存在則開啟檔案,並從開頭開始編輯,即原有內容會被刪除。如果該檔案不存在,建立新檔案。
開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該檔案不存在,建立新檔案進行寫入。
a+   開啟一個檔案用於讀寫。如果該檔案已存在,檔案指標將會放在檔案的結尾。檔案開啟時會是追加模式。如果該檔案不存在,建立新檔案用於讀寫。
ab+   以二進位制格式開啟一個檔案用於追加。如果該檔案已存在,檔案指標將會放在檔案的結尾。如果該檔案不存在,建立新檔案用於讀寫。

注: 1、b代表以二進位制形式,+表示可讀可寫模式,b與+可以與其他三種模式組合使用(r表示讀,w表示寫,a表示加) 2、如果目標檔案存在時,明確指定讀模式和什麼模式都不指定都是一樣的;如果目標檔案不存在時,最好指定"w+"模式

基本檔案方法:

讀:read()函式

read()方法從一個開啟的檔案中讀取一個字串。需要重點注意的是,Python字串可以是二進位制資料,而不是僅僅是文字。其語法如下:

fileObject.read([count])

1、fileObject為open()函式返回的File物件
2、count引數是要從已開啟檔案中讀取的位元組計數。該方法從檔案的開頭開始讀入,如果沒有傳入count,它會嘗試儘可能多地讀取更多的內容,很可能是直到檔案的末尾。

例2:

path =  "G:\\PythonDemo\\demo.txt"
txtdemo = open(path)
read_result = txtdemo.read(12)

print(read_result)

#上面程式碼的輸出結果為:I am the sex

由上面的執行結果可以看出,如果read()函式後面帶了引數時,就只會讀取指定的位元組數(空格和符號也算);若沒有指定引數時,就會讀取檔案中的全部字串

例3:

file = open("F:\\python\\test_file.txt")

while True:
    str = file.read(1)  #指定每次只讀取一個字元
    if not str:
        break
    print(str)
    
#迴圈讀取檔案中的一個字元,無字元時跳出迴圈(否則會一直迴圈讀取)

寫:write()函式

1、write()方法可將任何字串寫入一個開啟的檔案。需要重點注意的是,Python字串可以是二進位制資料,而不是僅僅是文字。 2、write( )方法不會在字串的結尾新增換行符('\n'),其語法如下:

fileObject.write(string)

例4:

path =  "G:\\PythonDemo\\demo.txt"
txtdemo = open(path,"a+")
string = "On August 29, I met a girl and fell in love with her deeply__to_tutu"

txtdemo.write(string)
print(txtdemo.read())   #未執行該行
txtdemo.close()

例4_1:

path =  "G:\\PythonDemo\\demo.txt"
txtdemo = open(path,"a")
string = "On August 29, I met a girl and fell in love with her deeply__tutu"

txtdemo.write(string)

txtdemo = open(path)
print(txtdemo.read())

#上面程式碼的輸出結果為:On August 29, I met a girl and fell in love with her deeply__tutu

1、若開啟檔案時使用的是讀模式,則此時就不能進行寫入操作,即不能使用下面這種形式操作檔案open(path,"rw")

2、由上面程式碼的執行結果來看只打開一次檔案時不能同時進行讀和寫操作(即使使用了a+模式),若要同時進行讀寫操作時,需要在執行一項後再次開啟檔案並執行下一項

3、使用w(寫)模式時,在寫入字串時會覆蓋檔案內已有的內容;若不想覆蓋已有的內容則可以使用a(加)模式

4、如果開啟的檔案不存在,w模式和a模式就會建立一個新的空檔案,然後執行寫入或追加

換行寫入:

在python中,用\n表示換行,若需要追加的內容在下一行,可以使用\n的方法例5:

path =  "G:\\PythonDemo\\demo.txt"
txtdemo = open(path,"a")
string = "On August 29, I met a girl and fell in love with her deeply__tutu"

txtdemo.write(string + "\n")
txtdemo.write("I"+ "\n")
txtdemo.write("love"+ "\n")
txtdemo.write("you"+ "\n")

備註:若需要讀寫特定編碼方式的文字,則需要給open()函式傳入encoding引數;如需要讀取GBK編碼的檔案時,則前面示例可以改為txtdemo = open(path,"r",encoding = "gbk")

讀寫行:

目前我們對檔案的讀操作是按位元組讀或整個讀取,而寫操作是全部覆寫或追加,這樣的操作在實際應用中不是很實用。python為我們提供了readline( ),readlines( ),writelines( )等方法用於行操作

read()函式:

語法如下:

file.read([size])
從檔案讀取指定的位元組數,size如果未給定或為負則讀取所有。

例6:

file = open("F:\\python\\test_file.txt")

print(file.read(2))
file.close()

readline()函式:

語法如下:

file.readline([size])

1、readline方法會從檔案中單獨讀取一行,換行符為\n。readline方法如果返回一個空字串,說明已經讀取到了最後一行 2、readline方法也可以像read方法一樣傳入數值讀取對應的字元數,傳入小於0的數值表示整行都輸出

例7:

file = open("F:\\python\\test_file.txt")

while True:
    content = file.readline()
    print(content)
    if not content:
        break
file.close()

#依次輸出檔案中的每一行,無內容時跳出迴圈

例7_1:

file = open("F:\\python\\test_file.txt")

content = file.readline()
print(content)

file.close()

#只會輸出檔案中的第一行

例7_2:

file = open("F:\\python\\test_file.txt")

content = file.readline(2)
print(content)

file.close()

#輸出檔案中第一行中的前兩個字元(不會輸出其他內容)

readlines()函式:

語法如下:

file.readlines([sizeint])

1、輸出結果為一個字串的列表。列表中的每個字元就是檔案中的每一行,並且換行符也會被輸出 2、readlines方法可以傳入數值引數,當傳入的數值小於列表中一個字串的長度時,該字串會被讀取;當傳入小於等於0的數值時,所有字串都會被讀取

例8:

file = open("F:\\python\\test_file.txt")

content = file.readlines()  #content為一個字串列表,可以用於迭代
print(content)
for world in content:
    print(world)
file.close()

"""
['大家知道\n', '中國這些,\n', '你說什麼']
大家知道

中國這些,

你說什麼
"""

例8_1:

file = open("F:\\python\\test_file.txt")

content = file.readlines(3)
print(content)
for world in content:
    print(world)
file.close()

"""
['大家知道\n']
大家知道
"""

writelines()函式:

語法如下:

file.writelines()

writelines方法與readlines方法相反,傳給他一個字串列表(任何序列或可迭代物件),它會把所有字串寫入檔案。例9:

file = open("F:\\python\\test_file.txt","a")

str_list = ["\nlove","tutu"]  #在文末換行追加

file.writelines(str_list)

總結: 1、readline()方法:從字面意思可以看出,該方法每次讀出一行內容,所以,讀取時佔用記憶體小,比較適合大檔案,該方法返回一個字串物件。(結合迴圈可實現迴圈讀取所有行) 2、readlines()方法:讀取整個檔案所有行,儲存在一個列表(list)變數中,每行作為一個元素,但讀取大檔案會比較佔記憶體。

關閉檔案:

1、當我們寫檔案時,作業系統往往不會立刻把資料寫入磁碟,而是放到記憶體快取起來,空閒的時候再慢慢寫入。只有呼叫close()方法時,作業系統才保證把沒有寫入的資料全部寫入磁碟。忘記呼叫close()的後果是資料可能只寫了一部分到磁碟,剩下的丟失了。 2、由於檔案讀寫時都有可能產生IOError,一旦出錯,後面的f.close()就不會呼叫。所以,為了保證無論是否出錯都能正確地關閉檔案,我們可以使用try ... finally來實現:例10:

try:
    file = open("F:\\python\\test_file.txt")
    print(file.readline())
finally:
    if file:
        file.close()

print(file.closed)

python中引入了with語句自動幫我們呼叫close()方法。使用with語句可以更簡潔 例10_1:

with open("F:\\python\\test_file.txt") as f:
    file = open("F:\\python\\test_file.txt","r")
    print(file.readline())

檔案迭代器:

從python2.2版本開始後,檔案物件是可迭代的,這意味著可以直接在for迴圈中使用檔案物件,從而進行迭代例11:

file = open("F:\\python\\test_file.txt","r")
for world in file:
    print(world)
    
file.close()
print(file.closed)

#使用for迴圈對檔案進行迭代後需要顯式關閉檔案

拓展:

File物件的屬性:一個檔案被開啟後,你有一個file物件,你可以得到有關該檔案的各種資訊。

以下是和file物件相關的所有屬性的列表:

屬性              描述
file.closed   返回true如果檔案已被關閉,否則返回false。
file.mode   返回被開啟檔案的訪問模式。
file.name 返回檔案的名稱。
file.softspace  如果用print輸出後,必須跟一個空格符,則返回false。否則返回true。

例12:

file = open("F:\\python\\test_file.txt","r")

print(file.closed)
print(file.mode)
print(file.name)

"""
False
r
F:\python\test_file.txt
"""

檔案的讀取和定位:

tell()方法:告訴你檔案內的當前位置, 換句話說,下一次的讀寫會發生在檔案開頭這麼多位元組之後。

seek(offset [,from])方法:改變當前檔案的位置。Offset變量表示要移動的位元組數。From變數指定開始移動位元組的參考位置。

如果from被設為0,這意味著將檔案的開頭作為移動位元組的參考位置。如果設為1,則使用當前的位置作為參考位置。如果它被設為2,那麼該檔案的末尾將作為參考位置。 例13:

file = open("F:\\python\\test_file.txt","r")

str = file.read(2)
print("讀取的字串是 : ", str)

position = file.tell()
print("當前檔案位置 : ", position)

position = file.seek(0, 0) #把指標再次重新定位到檔案開頭
print(file.tell())

string = file.read(3)
print("重新讀取字串 : ", string)

file.close()

"""
讀取的字串是 :  大家
當前檔案位置 :  4
0
重新讀取字串 :  大家知
"""

備註: 1、檔案指標相當於一個"書籤",起到定位的作用 2、一箇中文字元佔用2個位元組的空間,一個英文字母或符號佔用一個位元組

統計檔案中某個字或單詞出現的次數:

1、collections模組包含除內建list,dict,tuple 以外的其它容器資料型別。counter作為一個容器,可以跟蹤相同的值增加了多少次。 2、counter支援三種形式的初始化,用counter的建構函式時可以提供一個元素序列或者一個包含鍵和計數的字典,還可以使用關鍵字引數將字串名對映到計數。

例14:

import collections

file = open("F:\\python\\test_file.txt","r")

world = file.read().split('\n')  #以換行符切片標準

m = collections.Counter(world)

print (world)
print (m)
print (m['lovetutu'])#字元a出現的次數

"""
['大家知道', '中國這些,', '你說什麼', 'lovetutu', 'lovetutu']
Counter({'lovetutu': 2, '大家知道': 1, '中國這些,': 1, '你說什麼': 1})
2
"""