記得剛開始學習python檔案操作寫檔案的時候有個問題,很奇怪。最後知道了就是位元組數的原因。
我們先來看個例子。
新建個檔案存為utf-8命名為0117utf-8.txt記得去掉bom頭。
我們用r+模式嘗試去修改
>>> fp=open("d:\\pydelete\\0117utf-8.txt","r+")
>>> fp.write("aa")
2>>> fp.close()
>>>
結果如下
亂碼一大坨。
這裡就涉及了位元組數了。
因為utf-8存中文是用3個位元組存乙個,存英文是用1個位元組存乙個英文本元。
如果寫入「aaa」就可以了。
所以切入正題,看看位元組數和字元個數。
1.fp.read(arg),fp.write()後返回的數字是字元個數。
我們用剛才寫過的檔案讀一下看看。
>>> fp=open("d:\\pydelete\\0117utf-8.txt","r+",encoding="utf-8")
>>> fp.read(1)
'a'>>> fp.read(1)
'a'>>> fp.read(1)
'a'>>> fp.read(1)#可以看到這裡的數字應該是字元個數,意思乙個字元。
'國'>>> fp.read(1)
'話'>>> fp.read(1)
''>>>
我們再來寫入一些內容。
>>> fp.seek(0.0) #將游標切回行首
0.0>>> fp.write("新寫入2x")
5#可以看到這裡也是字元個數。表示寫入5個字元。
>>>fp.flush()
我們算乙個結果之前檔案內容是「aaa國話」我們寫入「新寫入2x」 之前的檔案位元組數是9,現在寫入11 r+模式會從頭開始覆蓋所以現在檔案內容為「新寫入2x」
如果寫入的位元組數小於之前的有可能出現亂碼(如果原檔案有中文存在)
2.fp.tell(),fp.seek(0,0) 是位元組數
我們加游標切回行首,再來讀下。
>>> fp.seek(0,0)
0>>> fp.read(1)
'新'>>> fp.tell()
3#可以看出tell是返回的位元組數,也就是游標現在應該在新字後邊。
>>>
由此我們試著改變游標位置。
>>> fp.seek(0,0)
0>>> fp.seek(6,0) #seek的第乙個引數也是位元組數,那現在游標在哪我如果讀乙個字元應該是什麼? 游標應該在寫字後如果讀乙個字元應該是「入」
>>> fp.read(1)
'入'3.fp.truncate(size)
把檔案裁成規定的大小,預設是裁到當前檔案操作標記的位置。如果size 比檔案的大小還要,依據系統的不同可能是不改變檔案,
也能是用0把檔案補到相應的大小,也可能是以一些隨機的內容加上去。引數也是位元組數。
我們來嘗試一下
>>> fp.seek(0,0)
0>>> fp.truncate(6)
6>>>
此時檔案內容應該只剩下「新寫」2字。
知道這些我們在寫檔案的時候,就能很清楚效果了。
關於位元組數可以參考:
python關於檔案的操作
1.判斷檔案 資料夾 是否存在 from pathlib import path if path test.txt is file 判斷test.txt是否存在 if path img path is dir 判斷img path是否是資料夾2.建立資料夾 import os os.makedirs...
Python 關於檔案的操作
python中對open 函式的說明 definition open name mode buffering type function of builtin module open name mode buffering file object 一 如何獲取當前目前下的特定字尾的檔名?需求 有時我...
關於python檔案操作
總是記不住api。昨晚寫的時候用到了這些,但是沒記住,於是就索性整理一下吧 python中對檔案 資料夾 檔案操作函式 的操作需要涉及到os模組和shutil模組。得到當前工作目錄,即當前python指令碼工作的目錄路徑 os.getcwd 返回指定目錄下的所有檔案和目錄名 os.listdir 函...