python中的IO流使用解讀
什么是IO流
input output stream , 主要指的是計算機輸入和輸出的操作;
一般來說是內存與磁盤之間的輸入輸 出(俠義);
IO流操作是一種持久化操作,是將數(shù)據(jù)持久化在磁盤上。
Python中操作IO流的方法
通過open全局函數(shù)( 主要作用是打開本地的文件)
open函數(shù)解析:第一個參數(shù):file (打開的文件的文件名或者路徑)
第二個參數(shù): mode 打開的模式( 默認的是字符輸入流(r) )
r:read表示輸入流w:write表示輸出流t:表示字符流b:表示字節(jié)流a:表示追加輸出
注意:一定要關流:f.close()
IO流的分類
1、根據(jù)數(shù)據(jù)流動方向分類
(1)輸入流:相對于內存而言,例如從磁盤、投影儀、網(wǎng)絡中讀取數(shù)據(jù)。
>>> f = open("aa.txt","r")
>>> f
<_io.TextIOWrapper name='aa.txt' mode='r' encoding='cp936'>
>>> f.read()
'我愛學習,學習使我快樂!'
>>> f.close()上面的代碼:mode = "r" 表示輸入流,讀取當前路徑下名為aa.txt的文檔的內容
(2)輸出流:相對于內存而言,例如向磁盤、投影儀、網(wǎng)絡等顯示設備中寫入數(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" 表示輸出流,將內容保存在aa.txt的文檔之中,并且會覆蓋之前的內容;f.write("")之后返回的是寫入字符的個數(shù)。
注意每次結束操作之后都要關流:f.close(),這樣才能寫入需要寫入的東西;也有不關流寫入內容的方法: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復制到桌面上的操作。
字符流: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的字符流內容寫入文檔b.txt之中。
注意的編碼格式,如果編碼格式不一致,會報錯或者亂碼,處理數(shù)據(jù)時轉碼:encoding='UTF-8'。
注意:
(1)本質 Mode = "r" "w" ------“rt" "wt" --------- t text 字符流; b ------- binary mode, mode = "b" ------- 操作字節(jié)數(shù)據(jù)(圖片、音頻、視頻等)。
(2)字節(jié)可以操作任何數(shù)據(jù),字符只能操作字符數(shù)據(jù)。
(3)IO流一定要及時關閉,避免資源的占用以及避免出現(xiàn)異常。
(3)拷貝數(shù)據(jù)時,為了避免因為目標文件過大而導致電腦死機,應使用read參數(shù)來控制每次拷貝數(shù)據(jù)的多少,也可以使用循環(huán)來做。
(5)字節(jié)流操作大數(shù)據(jù)的時候,不建議一次性讀取;字符流,我們一般不用考慮內存不夠用問題(如500W字約10M左右)。
(6) 出現(xiàn)名字相同的文件進行備份的時候,會覆蓋掉原本的內容,可使用參數(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單位進行讀取
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()對象序列化
列表、字典、集合和元組都是抽象的概念,需要把對象持久化操作,所以需要序列化;
是把對象這種抽象的概念持久化到磁盤上,換句話說就是將對象轉為字節(jié)和字符。
pickle(可以將對象轉換為字節(jié)數(shù)據(jù))
dumps------ 將對象序列化為字節(jié)數(shù)據(jù)loads------ 將字節(jié)數(shù)據(jù)反序列化為對象dump------ 將對象序列化為字節(jié)數(shù)據(jù)并且保存到 file 中load-------- 將 file 字節(jié)數(shù)據(jù)反序列化為對象
json(可以將對象轉換為字符數(shù)據(jù))
dump------ 將對象序列化成為字符數(shù)據(jù),并且保存到file中dumps------ 將對象序列化成為字符數(shù)據(jù)load------ 將一個file對象反序列化為對象loads------ 將一個字符串據(jù)反序列化為對象
注意:
json這個模塊一般用來序列化字典對象,或者轉換json數(shù)據(jù),但是其他對象也是可以的
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
python使用mediapiple+opencv識別視頻人臉的實現(xiàn)
本文主要介紹了python使用mediapiple+opencv識別視頻人臉,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
python圖形用戶界面tkinter之標簽Label的使用說明
這篇文章主要介紹了python圖形用戶界面tkinter之標簽Label的使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
一文掌握6種Python中常用數(shù)據(jù)庫操作及代碼
在數(shù)據(jù)處理和管理領域,Python作為一種高效、易用的編程語言,擁有豐富的數(shù)據(jù)庫操作模塊,可以輕松實現(xiàn)對關系型數(shù)據(jù)庫的數(shù)據(jù)操作,本文將介紹六種常見的Python數(shù)據(jù)庫操作模塊,需要的可以參考下2023-12-12
python 常用日期處理-- datetime 模塊的使用
這篇文章主要介紹了python 如何對日期進行處理,幫助大家更好的理解和學習python,感興趣的朋友可以了解下2020-09-09
python?中collections的?deque使用詳解
這篇文章主要介紹了python中collections的deque使用詳解,deque是一個雙端隊列,如果要經(jīng)常從兩端append的數(shù)據(jù),選擇這個數(shù)據(jù)結構就比較好了,更多相關內容,需要的小伙伴可以參考下面文章內容2022-09-09

