python中的IO流使用解讀
什么是IO流
input output stream , 主要指的是計算機輸入和輸出的操作;
一般來說是內(nèi)存與磁盤之間的輸入輸 出(俠義);
IO流操作是一種持久化操作,是將數(shù)據(jù)持久化在磁盤上。
Python中操作IO流的方法
通過open全局函數(shù)( 主要作用是打開本地的文件)
open函數(shù)解析:第一個參數(shù):file (打開的文件的文件名或者路徑)
第二個參數(shù): mode 打開的模式( 默認(rèn)的是字符輸入流(r) )
r
:read表示輸入流w
:write表示輸出流t
:表示字符流b
:表示字節(jié)流a
:表示追加輸出
注意:一定要關(guān)流:f.close()
IO流的分類
1、根據(jù)數(shù)據(jù)流動方向分類
(1)輸入流:相對于內(nèi)存而言,例如從磁盤、投影儀、網(wǎng)絡(luò)中讀取數(shù)據(jù)。
>>> f = open("aa.txt","r") >>> f <_io.TextIOWrapper name='aa.txt' mode='r' encoding='cp936'> >>> f.read() '我愛學(xué)習(xí),學(xué)習(xí)使我快樂!' >>> f.close()
上面的代碼:mode = "r" 表示輸入流,讀取當(dāng)前路徑下名為aa.txt的文檔的內(nèi)容
(2)輸出流:相對于內(nèi)存而言,例如向磁盤、投影儀、網(wǎng)絡(luò)等顯示設(shè)備中寫入數(shù)據(jù)。
>>> f = open("aa.txt",mode="w") >>> f <_io.TextIOWrapper name='aa.txt' mode='w' encoding='cp936'> >>> f.write("阿文今天很開心!OVO") 11 >>> f.close()
上面的代碼:mode = "w" 表示輸出流,將內(nèi)容保存在aa.txt的文檔之中,并且會覆蓋之前的內(nèi)容;f.write("")之后返回的是寫入字符的個數(shù)。
注意每次結(jié)束操作之后都要關(guān)流:f.close(),這樣才能寫入需要寫入的東西;也有不關(guān)流寫入內(nèi)容的方法:f.flush()。
2、根據(jù)數(shù)據(jù)類型分類
字節(jié)流:mode = “b” 表示使用字節(jié)來操作IO流(如視圖、音頻、圖片可執(zhí)行文件等);字節(jié)流操作較大數(shù)據(jù)時,不建議一次性讀取。
#讀取圖片視頻或者音頻等 def copy_file(src,dest): f = open(src,"rb") f1 = open(dest,"wb") f1.write(f.read()) f.close() f1.close() if __name__ == '__main__': copy_file("D:\\PYcharm\\哈哈\\1.jpg","C:\\Users\\QWQ\\Desktop\\1.jpg")
上面的代碼:f是輸入流,f1是輸出流,將f讀取的字節(jié)流數(shù)據(jù)寫入f1中,實現(xiàn)了將圖片1.jpg復(fù)制到桌面上的操作。
字符流:mode = “t” 表示使用字符操作IO流
#讀取文檔數(shù)據(jù) def io_test(url1,url2): f1 = open(url1,"rt",encoding='UTF-8') f2 = open(url2,"wt",encoding='UTF-8') msg = f1.read() f2.write(msg) f1.close() f2.close() io_test("C:\\Users\\QWQ\\Desktop\\第一天\\a.txt","C:\\Users\\QWQ\\Desktop\\第一天\\b.txt")
上面的代碼:將文檔a.txt的字符流內(nèi)容寫入文檔b.txt之中。
注意的編碼格式,如果編碼格式不一致,會報錯或者亂碼,處理數(shù)據(jù)時轉(zhuǎn)碼:encoding='UTF-8'。
注意:
(1)本質(zhì) Mode = "r" "w" ------“rt" "wt" --------- t text 字符流; b ------- binary mode, mode = "b" ------- 操作字節(jié)數(shù)據(jù)(圖片、音頻、視頻等)。
(2)字節(jié)可以操作任何數(shù)據(jù),字符只能操作字符數(shù)據(jù)。
(3)IO流一定要及時關(guān)閉,避免資源的占用以及避免出現(xiàn)異常。
(3)拷貝數(shù)據(jù)時,為了避免因為目標(biāo)文件過大而導(dǎo)致電腦死機,應(yīng)使用read參數(shù)來控制每次拷貝數(shù)據(jù)的多少,也可以使用循環(huán)來做。
(5)字節(jié)流操作大數(shù)據(jù)的時候,不建議一次性讀取;字符流,我們一般不用考慮內(nèi)存不夠用問題(如500W字約10M左右)。
(6) 出現(xiàn)名字相同的文件進(jìn)行備份的時候,會覆蓋掉原本的內(nèi)容,可使用參數(shù) a:表示追加輸出 ;這樣需要保存的數(shù)據(jù)會保存在原來數(shù)據(jù)的后面。
編寫一個程序:將某個文件備份到需要保存的路徑
from os import path import uuid def copy_file(): src = input("請輸入源文件的路徑:") dest = input("請輸入你的保存路徑:") f = open(src,"rb") filename = src[src.rfind("\\")+1:] random_uuid = uuid.uuid4().hex filename = random_uuid + filename print(filename) f1 = open(path.join(dest,filename),"wb") while True: #以M單位進(jìn)行讀取 data = f.read(1024*1024) #字符流讀到最后會返回"" if data == b"": print("數(shù)據(jù)讀取完成") break else: f1.write(data) f.close() f1.close() if __name__ == '__main__': copy_file()
對象序列化
列表、字典、集合和元組都是抽象的概念,需要把對象持久化操作,所以需要序列化;
是把對象這種抽象的概念持久化到磁盤上,換句話說就是將對象轉(zhuǎn)為字節(jié)和字符。
pickle(可以將對象轉(zhuǎn)換為字節(jié)數(shù)據(jù))
dumps
------ 將對象序列化為字節(jié)數(shù)據(jù)loads
------ 將字節(jié)數(shù)據(jù)反序列化為對象dump
------ 將對象序列化為字節(jié)數(shù)據(jù)并且保存到 file 中load
-------- 將 file 字節(jié)數(shù)據(jù)反序列化為對象
json(可以將對象轉(zhuǎn)換為字符數(shù)據(jù))
dump
------ 將對象序列化成為字符數(shù)據(jù),并且保存到file中dumps
------ 將對象序列化成為字符數(shù)據(jù)load
------ 將一個file對象反序列化為對象loads
------ 將一個字符串據(jù)反序列化為對象
注意:
json這個模塊一般用來序列化字典對象,或者轉(zhuǎn)換json數(shù)據(jù),但是其他對象也是可以的
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python使用mediapiple+opencv識別視頻人臉的實現(xiàn)
本文主要介紹了python使用mediapiple+opencv識別視頻人臉,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03python圖形用戶界面tkinter之標(biāo)簽Label的使用說明
這篇文章主要介紹了python圖形用戶界面tkinter之標(biāo)簽Label的使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06一文掌握6種Python中常用數(shù)據(jù)庫操作及代碼
在數(shù)據(jù)處理和管理領(lǐng)域,Python作為一種高效、易用的編程語言,擁有豐富的數(shù)據(jù)庫操作模塊,可以輕松實現(xiàn)對關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)操作,本文將介紹六種常見的Python數(shù)據(jù)庫操作模塊,需要的可以參考下2023-12-12Python實現(xiàn)準(zhǔn)確獲取PDF文件中的標(biāo)題
想要在PDF文件中,解析獲取全部的標(biāo)題,是一件比較麻煩的事情,這篇文章將介紹一種較為準(zhǔn)確的提取標(biāo)題的方式,感興趣的小伙伴可以了解一下2024-02-02python 常用日期處理-- datetime 模塊的使用
這篇文章主要介紹了python 如何對日期進(jìn)行處理,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-09-09解決python gdal投影坐標(biāo)系轉(zhuǎn)換的問題
今天小編就為大家分享一篇解決python gdal投影坐標(biāo)系轉(zhuǎn)換的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01python?中collections的?deque使用詳解
這篇文章主要介紹了python中collections的deque使用詳解,deque是一個雙端隊列,如果要經(jīng)常從兩端append的數(shù)據(jù),選擇這個數(shù)據(jù)結(jié)構(gòu)就比較好了,更多相關(guān)內(nèi)容,需要的小伙伴可以參考下面文章內(nèi)容2022-09-09