python文件操作的一般步骤_Python基础之文件操作
? 應用程序運行過程中產生的數據最先都是存放于內存中的,若想永久保存下來,必須要保存于硬盤中。應用程序若想操作硬件必須通過操作系統,而文件就是操作系統提供給應用程序來操作硬盤的虛擬概念,用戶或應用程序對文件的操作,就是向操作系統發起調用,然后由操作系統完成對硬盤的具體操作。
文件操作的基本流程
#1. 打開文件,由應用程序向操作系統發起系統調用open(...),操作系統打開該文件,對應一塊硬盤空間,并返回一個文件對象賦值給一個變量f
f=open('a.txt','r',encoding='utf-8') #默認打開模式就為r
#2. 調用文件對象下的讀/寫方法,會被操作系統轉換為讀/寫硬盤的操作
data=f.read()#3. 向操作系統發起關閉文件的請求,回收系統資源
f.close()
打開一個文件包含兩部分資源:應用程序的變量f和操作系統打開的文件。在操作完畢一個文件時,必須把與該文件的這兩部分資源全部回收,回收方法為:
1、f.close() #回收操作系統打開的文件資源
2、del f #回收應用程序級的變量
其中del f一定要發生在f.close()之后,否則就會導致操作系統打開的文件無法關閉,白白占用資源, 而python自動的垃圾回收機制決定了我們無需考慮del f,這就要求我們,在操作完畢文件后,一定要記住f.close(),雖然我們如此強調,但是大多數讀者還是會不由自主地忘記f.close(),考慮到這一點,python提供了with關鍵字來幫我們管理上下文
#1、在執行完子代碼塊后,with 會自動執行f.close()
with open('a.txt','w') as f:pass
#2、可用用with同時打開多個文件,用逗號分隔開即可
with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
data=read_f.read()
write_f.write(data)
文件操作模式
只讀模式
r模式
只能進行讀不能進行別的操作
f = open('a.txt',mode='r',encoding='utf-8')
content=f.read()print(content)
f.close()#open中第一個參數放入的是要打開的文件名字,第二個參數是要對這個文件進行的操作,第三參數是用什么編碼方式打開文件中的內容
f 可寫成任意變量等,它被稱作:文件句柄,文件操作符,或者文件操作對象等。
open 是Python調用的操作系統(windows,linux,等)的功能,而windows的默認編碼方式為gbk,linux默認編碼方式為utf-8,所以你的文件用什么編碼保存的,就用什么方法打開,一般都是用utf-8。
mode為打開方式:常見的有r,w,a,r+,w+,a+.rb,wb,ab,等,默認不寫是r。
流程就是打開文件,產生一個文件句柄,對文件句柄進行相應操作,關閉文件。
rb模式
rb只讀字節的模式
f = open('b.jpg',mode='rb')
content=f.read()print(content)
f.close()
rb 讀出來的數據是bytes類型,在rb模式下,不能encoding字符集
rb的作用:在讀取非文本文件的時候,比如要讀取mp3,圖像,視頻等信息的時候就需要用到rb,因為這種數據是沒辦法直接顯示出來的
這個字節的模式是用于傳輸和存儲
寫模式
覆蓋寫模式:
在寫文件的時候我們要養成一個寫完文件就刷新的習慣. 刷新flush()
f = open('aaa.txt',mode='w',encoding='utf-8')
f.write('aaa')
f.flush()
f.close()
當我選擇使用w模式的時候,在打開文件的時候就就會把文件中的所有內容都清空,然后在操作
注意:如果文件不存在使用w模式會創建文件,文件存在w模式是覆蓋寫,在打開文件時會把文件中所有的內容清空.
wb模式下,不可以指定打開文件的編輯,但是寫文件的時候必須將字符串轉換成utf-8的bytes數據
f = open('aaa.txt',mode='wb')
msg= '你好'.encode('utf-8')
f.write(msg)
f.flush()#刷新
f.close()
追加
只要是a或者ab,a+都是在文件的末尾寫入,不論光標在任何位置.
在追加模式下,我們寫入的內容后追加在文件的末尾
a模式如果文件不存在就會創建一個新文件
f1 = open('aaa.txt',mode='a',encoding='utf-8')
msg= f1.write('bbb')
讀寫模式
對于讀寫模式,必須是先讀后寫,因為光標默認在開頭位置,當讀完了以后再進行寫入.
r+模式
#正常的讀取內容, 寫在文件末尾
f1 = open('aaa.txt',mode='r+',encoding='utf-8')
msg=f1.read()
f1.write('哈哈哈')
f1.flush()
f1.close()print(msg)#錯誤的讀取內容, 寫在文件開頭, 并且只讀取之后的內容
f1 = open('aaa.txt',mode='r+',encoding='utf-8')
f1.write('bbb')
msg=f1.read()
f1.flush()
f1.close()print(msg)
寫讀模式
先將所有的內容清空,然后寫入.最后讀取.但是讀取的內容是空的,不常用
f1 = open('bbb.txt',mode='w+',encoding='utf-8')
f1.write('bbb')
msg=f1.read()
f1.flush()
f1.close()print(msg)
追加讀(a+,a+b)
a+模式下,不論是先讀還是后讀,都是讀不到數據的
f = open('ccc.txt',mode='a+',encoding='utf-8')
f.write('ccc')
f.flush()
msg=f.read()
f.close()print(msg)
文件的相關操作
read()
read()是將文件中所有的內容都讀取
f = open('aaa.txt',mode='r',encoding='utf-8')
msg=f.read()
f.close()print(msg)
read()可以指定我們想要讀取的內容數量
f = open('aaa.txt',mode='r',encoding='utf-8')
msg= f.read(3) #讀取三個字符
msg1 = f.read() #后邊在讀就會繼續向后讀取
f.close()print(msg)print(msg1)
如果使用rb模式讀取出來的就是字節
f = open('bbb.txt',mode='rb')
msg= f.read(3)
msg1=f.read()
f.close()print(msg)print(msg1)
read()的弊端就是當文件很大的時候,將文件中的內容全部讀取,存放在內存中這樣會導致內存奔潰
readline()
readline()讀取每次只讀取一行,注意點:readline()讀取出來的數據在后面都有一個\n
f = open('aaa.txt',mode='r',encoding='utf-8')
msg1=f.readline()
msg2=f.readline()
msg3=f.readline()
msg4=f.readline()
f.close()print(msg1)print(msg2)print(msg3)print(msg4
readlines()
readlines() 將每一行形成一個元素,放到一個列表中,將所有的內容全部讀出來,如果文件很大,占內存,容易崩盤。
f = open('log',encoding='utf-8')print(f.readlines())
f.close()
如果有個較大的文件我們進行讀取不推薦使用以下方法:
f = open('aaa',mode='r',encoding='utf-8')print(f.read()) #這樣就是將文件一次性全部讀取到內存中,內存容易奔潰
推薦使用的是這種方法:
f = open('aaa',mode='r',encoding='utf-8')for line inf:print(line) #這種方式就是在一行一行的進行讀取,它就執行了下邊的功能
print(f.readline())print(f.readline())print(f.readline())print(f.readline())
f.close()
注意:讀完的文件句柄一定要關閉
seek()
seek(n)光標移動到n位置,注意: 移動單位是byte,所有如果是utf-8的中文部分要是3的倍數
通常我們使用seek都是移動到開頭或者結尾
移動到開頭:seek(0,0) 可以看做成seek(0)
seek(6)這種如果是單數并且不是0的就是按照字節來移動光標
移動到結尾:seek(0,2) seek的第二個參數表示的是從哪個位置進行偏移,默認是0,表示開頭,1表示當前位置,2表示結尾
f = open("aaa", mode="r+", encoding="utf-8")
f.seek(0)#光標移動到開頭
content = f.read() #讀取內容, 此時光標移動到結尾
print(content)
f.seek(0)#再次將光標移動到開頭
f.seek(0, 2) #將光標移動到結尾
content2 = f.read() #讀取內容. 什么都沒有
print(content2)
f.seek(0)#移動到開頭
f.write("張國榮") #寫入信息. 此時光標在9 中文3 * 3個 = 9
f.flush()
f.close()
tell()
tell()
使用tell()可以幫我們獲取當前光標在什么位置
f = open("aaa", mode="r+", encoding="utf-8")
f.seek(0)#光標移動到開頭
content = f.read() #讀取內容, 此時光標移動到結尾
print(content)
f.seek(0)#再次將光標移動到開頭
f.seek(0, 2) #將光標移動到結尾
content2 = f.read() #讀取內容. 什么都沒有
print(content2)
f.seek(0)#移動到開頭
f.write("張國榮") #寫入信息. 此時光標在9 中?文3 * 3個 = 9
print(f.tell()) #光標位置9
f.flush()
f.close()
修改文件
文件修改: 只能將文件中的內容讀取到內存中, 將信息修改完畢, 然后將源文件刪除, 將新文件的名字改成老文件的名字.
importos
with open("aaa", mode="r", encoding="utf-8") as f1,\
open("aaa_new", mode="w", encoding="UTF-8") as f2:
content=f1.read()
new_content= content.replace("冰糖葫蘆", "?白梨")
f2.write(new_content)
os.remove("aaa") #刪除源文件
os.rename("aaa_new", "aaa") #重命名新文件
弊端: ?次將所有內容進行讀取. 內存溢出. 解決方案: 一行一行的讀取和操作
importos
with open("aaa", mode="r", encoding="utf-8") as f1,\
open("aaa_new", mode="w", encoding="UTF-8") as f2:for line inf1:
new_line= line.replace("大白梨", "冰糖葫蘆")
f2.write(new_line)
os.remove("aaa") #刪除源?文件
os.rename("aaa_new", "aaa") #重命名新文件
總結
以上是生活随笔為你收集整理的python文件操作的一般步骤_Python基础之文件操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Costa咖啡英国员工将涨薪 网友:建议
- 下一篇: python grpc 并发_在Pyth