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

