文件操作: 首先要有一個文件作為對象,例‘文件名’.txt 1.文件路徑:例 d:\文件名.txt <1>:絕對路徑:從根目錄往後的路徑 <2>:相對路徑:當前目錄下的路徑有什麼算什麼 2.編碼方式:UTF-8、GBK2312等 3.操作模式:只讀、只寫、追加、寫讀、讀寫等 文件是以什麼變法方式儲存 ...
文件操作:
首先要有一個文件作為對象,例‘文件名’.txt
1.文件路徑:例 d:\文件名.txt
<1>:絕對路徑:從根目錄往後的路徑
<2>:相對路徑:當前目錄下的路徑有什麼算什麼
2.編碼方式:UTF-8、GBK2312等
3.操作模式:只讀、只寫、追加、寫讀、讀寫等
文件是以什麼變法方式儲存就要以什麼編碼方式打開
f = open('目標文件',mode='r',encoding='utf-8') #以UTF-8編碼的文件為例 content = f.read() print(content) f.close()
讀:
1.mode = 'r'文件的預設讀取方式
f.read() 文件打開後將bytes類型轉化為str類型,返回值是str,Python3下的編碼方式是unicode,
f2 = open('f:\目標文件.txt',mode='r',encoding='gbk') #打開的文件編碼是gbk content2 = f2.read() print(content2) #asd123文件 f2.close()
2.mode = 'rb'主要用於非文字類型文件操作,不用寫編碼方式
3.先讀後寫
f = open('目標文件',mode='r+',encoding='utf-8') print(f.read()) #123456789 f.write('abcd123') f.close() #123456789abcd123
在f.write()後添加一個print(f.read()) ,這段代碼並不會執行
在r+模式下進行寫讀,寫了多少就會覆蓋多少
#原文件內容:123456789 f = open('目標文件',mode='r+',encoding='utf-8') f.write('abcdefg') print(f.read()) #89 f.close()
4.mode = 'r+b' 以bytes類型打開
#原文件內容:123456789 f = open('目標文件',mode='r+b') print(f.read()) #b'123456789' f.write('abc'.encode('utf-8')) f.close() #文件更新後:123456789abc 以utf-8編碼
寫:
在寫入一個文件時若沒有就會創建一個新的文件,有則將原文件刪除再添加新的文件
1.只讀 mode = 'w'
#原文件內容:123456789 f = open('目標文件',mode='w',encoding='utf-8') f.write('abcdefg') f.close() #文件更新後:abcdefg
2.mode = 'wb'
#原文件內容:123abc中國 f = open('目標文件',mode='wb') f.write('gbka123'.encode('utf-8')) f.close() #文件更新後:gbka123 編碼方式:utf-8
如果再以gbk編碼方式去讀取這個文件那麼將報錯
3.mode = 'w+' 先寫後讀
#原文件內容:123abc中國 f = open('目標文件',mode='w+',encoding='utf-8') f.write('gbk2312') print(f.read()) f.close() #文件更新後:gbk2312 編碼方式:utf-8
4.mode = 'w+b'
f1 = open('logo-grey.png',mode='rb') content = f1.read() print(content) f1.close() f2 = open('logo-grey2.png',mode='wb') f2.write(content) f2.close()
將原文件以rb形式讀出來再寫入到一個新的文件中去
追加:
1.mode = 'a'
#原文件內容:123abc中國 f = open('目標文件',mode='a',encoding='utf-8') f.write('%%%%') f.close() #文件更新後:123abc中國%%%% 編碼方式:utf-8
2.mdoe = 'a+'
#原文件內容:123abc中國 f = open('目標文件',mode='a+',encoding='utf-8') f.write('%%%%') print(f.read()) f.close() #文件更新後:123abc中國%%%% 編碼方式:utf-8
其他功能:
1.f.read(n)
當文件打開的方式為文本模式時,代表讀取n個字元
#原文件內容:123abc中國 f = open('目標文件',mode='r',encoding='utf-8') content = f.read(6) print(content) f.close() #123abc
當文件打開為b模式時,代表讀取n個位元組
f = open('logo-grey.png',mode='rb') content = f.read(10) print(content) f.close() #b'\x89PNG\r\n\x1a\n\x00\x00'
2.f.seek(游標位置)
seek(n)游標移動到n位置,移動的單位為byte,所有utf-8編碼的中文部分必須是3的倍數
移動到開頭:seek(0)
移動到結尾:seek(0,2) seek最後一個參數表示從哪個位置進行偏移,1表示前位置,2表示結尾
#原文件內容:123abc中國 f = open('目標文件',mode='r+',encoding='utf-8') f.seek(0) #將游標置於開頭 print(f.read()) f.seek(0) #將游標置於開頭 f.seek(0,2) #將游標置於結尾 print(f.read()) #讀到空白 f.seek(0) f.write('隨便') f.flush() #文件更新後:隨便中國 3*2 = 6 byte f.close()
3.f.tell()
告訴我們游標在什麼位置
#原文件內容:123abc中國 f = open('目標文件',mode='r+',encoding='utf-8') f.seek(0) #將游標置於開頭 print(f.tell()) #0 print(f.read()) f.seek(0) #將游標置於開頭 print(f.tell()) #0 f.seek(0,2) #將游標置於結尾 print(f.tell()) #12 print(f.read()) #讀到空白 f.seek(0) print(f.tell()) f.write('隨便') f.flush() #文件更新後:隨便中國 3*2 = 6 byte print(f.tell()) #6 f.close()
4.f.readable()&f.writeable() 判斷是否可讀
#原文件內容:123abc中國 f = open('目標文件',mode='r+',encoding='utf-8') print(f.readable()) print(f.writable()) f.close()
5.f.readline()
每次只讀一行,讀取後的數據都有一個'\n',原文件內容不會發生改變
#原文件內容: # 123 # abc # gb2 # 456 # asd import os li = [] f = open('目標文件',mode='r+',encoding='utf-8') while f.tell() != os.path.getsize('目標文件'): li.append(f.readline().strip()) f.close() print(li) #['123', 'abc', 'gb2', '456', 'asd']
6.f.readlines()
返回一個列表,列表中的元素是原文件的每一行,文件如果過大,占記憶體且容易崩盤
#原文件內容: # 123 # abc # gb2 # 456 # asd f = open('目標文件',mode='r+',encoding='utf-8') print(f.readlines()) #['123\n', 'abc\n', 'gb2\n', '456\n', 'asd'] f.close()
7.f.truncate()
對原文件進行截取數據,0則全刪 以byte為單位截取
#原文件內容:123456abcd f = open('目標文件',mode='r+',encoding='utf-8') f.truncate(4) print(f.read()) #1234 f.close()
8.for迴圈
文件句柄是一個迭代器,每一次的迴圈只在記憶體中占一行數據,非常節省記憶體
#原文件內容: # 123 # abc # gb2 # 456 # asd f = open('目標文件',mode='r+',encoding='utf-8') for i in f: print(i,end = '') f.close() # 列印內容 # 123 # abc # gb2 # 456 # asd
9.修改文件
# 原文件內容: # 123 # abc # gb2 # 456 # asd # 123 with open('目標文件',encoding='utf-8') as f1,open('目標文件.bak','w',encoding='utf-8') as f2: for line in f1: if '123' in line: line = line.replace('123','hello world!') f2.write(line) # 文件修改後內容: # hello world! # abc # gb2 # 456 # asd # hello world! import os os.remove('目標文件') #刪除文件 os.replace('目標文件.bak','目標文件') #重命名
10.文件打開的另一種辦法
with open('目標文件',mode='r',encoding='utf-8') as f: print(f.read())
多個文件操作:
with open('目標文件',mode='r',encoding='utf-8') as f1,\ open('目標文件2',mode='w',encoding='utf-8') as f2: print(f1.read()) f2.write('something')