檔案操作分為讀、寫、改
一.檔案讀取(開啟檔案,r唯讀模式,預設模式,檔案必須存在)
f = open(file='test.txt',mode='r',encoding='utf-8')data = f.read()
f.close()
file='test.txt' 表示檔案路徑
mode='r' 表示唯讀(可以修改為其他)
encoding='utf-8' 表示將硬碟上的 0101010 按照utf-8的規則去「斷句」,再將「斷句」後的每一段0101010轉換成unicode的 01010101,unicode對照表中有01010101和字元的對應關係。
f.read() 表示讀取所有內容,內容是已經轉換完畢的字串。
f.close() 表示關閉檔案
ps: 此處的encoding必須和檔案在儲存時設定的編碼一致,不然「斷句」會不準確從而造成亂碼。
過程:1、由應用程式向作業系統發起系統呼叫open(...)
2、作業系統開啟該檔案,並返回乙個檔案控制代碼給應用程式
3、應用程式將檔案控制代碼賦值給變數f
檔案控制代碼 = open('檔案路徑', '模式','編碼')
迴圈讀取檔案內容
f = open("test.txt",'r',encoding="utf-8")for line in f:
print(line)
f.close()
檔案讀取 rb 二進位制模式讀,檔案必須存在。
f = open(file='test.txt',mode='rb')print(f.read().decode('utf8'))
f.close()
資料讀到記憶體裡直接是bytes格式,看內容,還需要手動decode,因此在檔案開啟階段,不需要指定編碼
二.檔案寫入(w,只寫模式,不可讀,不存在則建立,存在則清空內容)
f = open(file='test.txt',mode='w',encoding='utf-8')f.write('llllll')
f.close()
encoding='utf-8' 將要寫入的unicode字串編碼成utf-8格式
f.write(...) 表示寫入內容,寫入的內容是unicode字串型別,內部會根據encoding轉換為制定編碼的 01101010101,即:位元組型別
檔案寫入wb,二進位制只寫模式,不可讀,不存在則建立,存在則清空內容
f = open('a.txt','wb')print(f.write('hello'.encode('utf8')))
f.close()
追加:把內容追加到檔案尾部(不刪除之前內容)
f = open(file='test.txt',mode='a',encoding='utf-8')f.write('llllll')
f.close()
三.檔案修改
import oswith open('test.txt','r',encoding='utf-8') as read_f,open('tmp','w',encoding='utf-8') as write_f:
data=read_f.read() #全部讀入記憶體,如果檔案很大,會很卡
data=data.replace('aaa','bbb』) #在記憶體中完成修改
write_f.write(data) #一次性寫入新檔案
os.remove('a.txt')
os.rename('tmp','a.txt')
2.將硬碟存放的該檔案的內容一行一行地讀入記憶體,修改完畢就寫入新檔案,最後用新檔案覆蓋原始檔
import oswith open('a.txt','r',encoding='utf-8') as read_f,open('tmp','w',encoding='utf-8') as write_f:
for line in read_f:
line=line.replace('aaa','bbb')
write_f.write(line)
os.remove('a.txt')
os.rename('tmp','a.txt')
四.其他
1.使用with
不用關閉檔案
with open('test.txt','a',encoding='utf-8') as f:con = f.write('000')
print(con)
2.模式總結
文字模式
r,唯讀模式:預設模式,檔案必須存在,不存在則丟擲異常
w,只寫模式:不可讀,不存在則建立,存在則清空內容
a,追加寫模式:不可讀,不存在則建立,存在則只追加內容
rb,二進位制唯讀模式:預設模式,檔案必須存在,不存在則丟擲異常
wb,二進位制只寫模式:不可讀,不存在則建立,存在則清空內容
ab,二進位制追加寫模式:不可讀,不存在則建立,存在則只追加內容
讀寫模式
r+,讀寫:可讀,可寫,從檔案開頭寫入
w+,寫讀:可讀,可寫,清空後再寫
a+,寫讀:可讀,可寫,從檔案末尾寫入
3.操作方法
f.read() #讀取所有內容,游標移動到檔案末尾
f.readline() #讀取一行內容,游標移動到第二行首部
f.readlines() #讀取每一行內容,存放於列表中,返回乙個list
f.write('1111\n222\n') #針對文字模式的寫,需要自己寫換行符
f.write('1111\n222\n'.encode('utf-8')) #針對b模式的寫,需要自己寫換行符
f.writelines(['333\n','444\n']) #檔案模式
f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式
f.flush() #立刻將檔案內容從記憶體刷到硬碟
f.readable() #檔案是否可讀
f.writable() #檔案是否可讀
f.closed #檔案是否關閉
f.encoding #如果檔案開啟模式為b,則沒有該屬性
4.游標操作
f.tell() 讀取指標的位置
f.seek(0) 設定指標的位置(0回到開頭)
truncate是截斷檔案,所以檔案的開啟方式必須可寫,但是不能用w或w+等方式開啟,因為那樣直接清空檔案了,所以truncate要在r+或a或a+等模式下測試效果
read(3) 檔案開啟方式為文字模式時,代表讀取3個字元,檔案開啟方式為b模式時,代表讀取3個位元組
seek,tell,truncate游標移動都是以位元組為單位
seek有三種移動方式0,1,2,其中1和2必須在b模式下進行,但無論哪種模式,都是以bytes為單位移動的
5.不知道檔案編碼的情況
import chardetf = open('log',mode='rb')
data = f.read()
f.close()
result = chardet.detect(open('log',mode='rb').read())
print(result)
輸出:
百分之九十九的可能為 gb2312 python檔案處理
def cal input input.txt output output.txt cal方法為主程式,推薦這樣做而不是python.exe xx.py 預設引數為python目錄的兩個txt,如為其他檔案自己指定。infile file input,r 開啟源資料檔案 outfile file o...
python 檔案處理
1.開啟檔案 open a.txt 當前目錄下的a.txt open root a.txt 開啟某個目錄下的檔案 2.按行顯示檔案 a open a.txt a.readline ni hao n a.readline wo xianzai hen xiang ni n a.readline ni ...
Python檔案處理
open name mode buf read size readline size readlines size 這裡的size是指,io定義的default buffer size為單位大小 iter 迭代器迭代每行 write str writelines sequwence of strin...