python——檔案處理

來源:互聯網
上載者:User

標籤:cat   ble   encoding   網路傳輸   是什麼   形式   code   val   來講   

1.檔案處理
f = open(file="file01.txt", mode="r", encoding="utf-8") #python3預設編碼格式為utf-8data = f.read()print(data)print(type(data)) # <class ‘str‘>f.close()

如果報錯

#UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xcc in position 0: invalid continuation byte

說明編碼不對。

按正常邏輯來講,檔案是以什麼方式存的,就應該用什麼方式去讀取,比如以gb2312存的,就應該以gb2312去讀。檔案是以utf-8存的,就用utf-8的編碼格式去讀。

2.檔案處理-二進位模式

檔案在電腦中是以二進位儲存的,我們可以不理會編碼,直接以二進位的形式讀取檔案內容

f = open(file="file01.txt", mode="rb")data = f.read()print(data)f.close()

以二進位方式讀取,mode = "rb" ,得到的結果也是二進位。

在讀取視頻、圖片等內容和網路傳輸的時候,會使用二進位方式讀取。

 #列印結果 b‘\xef\xbb\xbf\xe7\x94\xb0\xe7\xbb\xb4\xe9\x80\x9a\t12001\t10\r\n\xe5\xbc\xa0\xe5\xae\xb6\xe9\x93\xad\t12002\t11\r\n\xe8\x88\x92\xe5\xa8\x85\t12003\t12\r\n\xe5\xad\x99\xe7\x8e\x89\xe5\x80\xa9\t12004\t13\r\n\xe5\xbc\xa0\xe8\xb6\x85\t12005\t14\r\n\xe7\x8e\x8b\xe4\xba\xac\t12006\t15\r\n\xe5\xbb\x96\xe6\x9e\x97\xe8\x8b\xb1\t12007\t16\r\n\xe5\xbe\x90\xe6\x99\x93\xe8\x8e\x89\t12008\t17\r\n\xe9\x87\x91\xe5\x98\x89\xe7\xa5\xba\t12009\t18\r\n\xe5\x8f\x8a\xe6\xa0\xbc\t12010\t19\r\n\xe4\xba\x8e\xe5\x87\xaf\xe9\x98\xb3\t12011\t20\r\n\xe6\x9d\x8e\xe4\xbf\x8a\xe7\xba\xa2\t12012\t21\r\n\xe5\x88\x98\xe5\x86\xac\t12013\t22\r\n‘
3.檔案處理-智能檢測編碼的工具
import chardetf = open(‘file01.txt‘, mode="rb")data = f.read()print(chardet.detect(data))#列印結果:#{‘encoding‘: ‘UTF-8-SIG‘, ‘confidence‘: 1.0, ‘language‘: ‘‘}#confidence,表示 encoding 為 UTF-8-SIG 的機率為 1.0

然後,當我們知道目標檔案是什麼格式後,data.decode("utf-8") 一下,就可以列印出我們需要的內容

4. 迴圈讀取逐條讀取檔案
f = open(‘file01.txt‘, ‘r‘, encoding=‘utf-8‘)for line in f:    print(line, end="") # end = "" 表示,列印的時候以什麼結尾,此處可以去掉print預設的分行符號 \nf.close()

列印結果:

# 田維通   12001   10# 張家銘   12002   11# 舒婭    12003   12# 孫玉倩   12004   13# 張超    12005   14# 王京    12006   15# 廖林英   12007   16# 徐曉莉   12008   17 ...
5.寫檔案
#以 gbk 格式建立一個檔案,寫入內容“將進酒”f = open(file=‘file02.txt‘, mode=‘w‘, encoding=‘gbk‘)f.write(‘將進酒‘)f.close()

如果這個時候再寫一遍,即

f = open(file=‘file02.txt‘, mode=‘w‘, encoding=‘gbk‘) f.write(‘杯莫停‘)f.close()

得到的結果是:將原來的 file02.txt 檔案覆蓋掉了

6.寫檔案——追加

寫入內容追加的已有內容後面

f = open(‘file02.txt‘, ‘ab‘)  #mode 為 ab 或 a,表示追加f.write(‘\n人生得意須盡歡‘.encode(‘gbk‘))f.close()

7.檔案處理-讀寫混合操作檔案
f = open(‘file02.txt‘, ‘r+‘, encoding=‘gbk‘)data = f.read()print("content:", data)f.write("\n鋤禾日當午")f.write("\n汗滴禾下土")f.write("\n離離原上草")f.write("\n一歲一枯榮")f.close()   

結果:

8.檔案操作的其他功能(1)flush()
f = open(‘f_flush.txt‘, ‘w‘, encoding=‘utf-8‘)f.write(‘奇門遁甲‘) # 在f.close() 之前,寫入的內容是在記憶體中的,而且可能此時txt檔案裡是沒有內容的,所以可以加一句 f.flush(),把檔案強制從記憶體buffer裡重新整理到硬碟#一般記憶體裡的buffer滿了會自動重新整理到硬碟,但是使用 f.flush() 可控制強制重新整理到硬碟f.close()
(2)tell() seek()
# 常值內容: hello world!>>> f = open(‘file03.txt‘, ‘r‘, encoding=‘gbk‘)>>> f.tell() #返回當前檔案操作游標位置 0>>> f.seek(1) # 把操作檔案的游標移到指定位置1>>> f.read()‘ello world!‘

注意:tell(), seek()找的都是位元組,長度都是按位元組算的。另外,每個字元在不同編碼格式下所佔的位元組長度不一樣,gbk 一個中文佔2個位元組,utf-8 一個中文佔3個位元組

以中文為例:

# 檔案內容:技高一籌>>> f = open("file03.txt",‘r‘,encoding=‘gbk‘)>>> f.read()‘技高一籌‘>>> f.tell()8>>> f.seek(0) #把檔案游標移動到起點 00>>> f.seek(4) #把檔案游標移動到 4,此時,gbk 下,一個漢字佔2個位元組,此時游標的位置在 技高和一籌之間4>>> f.read() # 所以,讀取結果為 後兩個字‘一籌‘>>>#----------------------------------------------------------------------------->>> f.seek(1) #把檔案游標移動到 1,“半個字”,此時讀取內容不出問題,因為他只拿到了 技 字的一部分位元組,列印會報錯1>>> f.tell()1>>> f.read()Traceback (most recent call last):  File "<stdin>", line 1, in <module>UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xef in position 6: incomplete multibyte sequence
(3)seekable() 判斷檔案是否可進行seek操作,readable() 判斷檔案是否可讀,writable()判斷檔案是否可寫(4) truncate() 按指定長度截斷檔案
#檔案內容: 技高一籌>>> f = open("file03.txt",‘r+‘,encoding=‘gbk‘)>>> f.seek(2)2>>> f.truncate()2>>> f.read() #檔案內容 只剩一個 “技” 字

truncate(4)指定長度的話,就從檔案開頭開始截斷指定長度,不指定長度的話,就從當前位置到檔案尾部的內容全去掉。

#檔案內容: 技高一籌>>> f = open("file03.txt",‘r+‘,encoding=‘gbk‘)>>> f.tell()0>>> f.truncate(4)  #檔案內容 只剩一個 “技高” 字
9. 實現檔案內容的修改
import osf = open(‘file05.txt‘, ‘r+‘, encoding=‘gbk‘) #開啟file05.txt 檔案f_new = open(‘file05_new.txt‘, ‘w‘, encoding=‘gbk‘) # 建立一個新檔案old_str = ‘李四‘new_str = ‘李雲龍‘for line in f:    if old_str in line: #逐行讀取        line = line.replace(old_str, new_str)  #修改檔案中的內容    f_new.write(line) # 逐行讀取的內容寫到新建立的檔案中f.close() f_new.close()os.replace(‘file05_new.txt‘, ‘file05.txt‘) # 替換,以達到修改檔案內容的目的(window用os.replace()可實現,但是使用os.rename()不可以,會報錯,提示 file05.txt 已存在,無法建立)

python——檔案處理

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.