日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

用Python实现磁盘IO操作全攻略,让数据流动起来!

發布時間:2025/3/15 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用Python实现磁盘IO操作全攻略,让数据流动起来! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


導讀:IO在計算機中指的是Input/Output,也就是輸入輸出。凡是用到數據交換的地方,都會涉及IO編程,例如磁盤、網絡的數據傳輸。


在IO編程中,Stream(流)是一種重要的概念,分為輸入流(Input Stream)和輸出流(Output Stream)。我們可以把流理解為一個水管,數據相當于水管中的水,但是只能單向流動,所以數據傳輸過程中需要架設兩個水管,一個負責輸入,一個負責輸出,這樣讀寫就可以實現同步。


本文主要講解磁盤IO操作。


作者:范傳輝

如需轉載請聯系大數據(ID:hzdashuju)




01 文件讀寫


1. 打開文件


讀寫文件是最常見的IO操作。Python內置了讀寫文件的函數,方便了文件的IO操作。


文件讀寫之前需要打開文件,確定文件的讀寫模式。open函數用來打開文件,語法如下:


open(name[.mode[.buffering]])


open函數使用一個文件名作為唯一的強制參數,然后返回一個文件對象。模式(mode)和緩沖區(buffering)參數都是可選的,默認模式是讀模式,默認緩沖區是無。


假設有個名為qiye.txt的文本文件,其存儲路徑是c:\text(或者是在Linux下的~/text),那么可以像下面這樣打開文件。在交互式環境的提示符“>>>”下,輸入如下內容:


>>>?f?=?open(r'c:\text\qiye.txt')


如果文件不存在,將會看到一個類似下面的異常回溯:


Traceback?(most?recent?call?last):????File?"<stdin>",?line?1,?in?<module>IOError:?[Errno?2]?No?such?file?or?directory:?'C:\\qiye.txt'"<stdin>",?line?1,?in?<module>
IOError:?[Errno?2]?No?such?file?or?directory:?'C:\\qiye.txt'


2. 文件模式


下面主要說一下open函數中的mode參數,通過改變mode參數可以實現對文件的不同操作。



這里主要是提醒一下'b'參數的使用,一般處理文本文件時,是用不到'b'參數的,但處理一些其他類型的文件(二進制文件),比如mp3音樂或者圖像,那么應該在模式參數中增加'b',這在爬蟲中處理媒體文件很常用。參數'rb'可以用來讀取一個二進制文件。


3. 文件緩沖區


open函數中第三個可選參數buffering控制著文件的緩沖。


如果參數是0,I/O操作就是無緩沖的,直接將數據寫到硬盤上;如果參數是1,I/O操作就是有緩沖的,數據先寫到內存里,只有使用flush函數或者close函數才會將數據更新到硬盤;如果參數為大于1的數字則代表緩沖區的大小(單位是字節),-1(或者是任何負數)代表使用默認緩沖區的大小。


4. 文件讀取


文件讀取主要是分為按字節讀取和按行進行讀取,經常用到的方法有read()、readlines()、close()。


在“>>>”輸入f = open(r'c:\text\qiye.txt')后,如果成功打開文本文件,接下來調用read()方法則可以一次性將文件內容全部讀到內存中,最后返回的是str類型的對象:


>>>?f.read()"qiye""qiye"


最后一步調用close(),可以關閉對文件的引用。文件使用完畢后必須關閉,因為文件對象會占用操作系統資源,影響系統的IO操作。


>>>?f.close()


由于文件操作可能會出現IO異常,一旦出現IO異常,后面的close()方法就不會調用。所以為了保證程序的健壯性,我們需要使用try ... finally來實現。


try:????f?=?open(r'c:\text\qiye.txt','r')????print?f.read()finally:????if?f:????????f.close()
????f?=?open(r'c:\text\qiye.txt','r')
????print?f.read()
finally:
????if?f:
????????f.close()


上面的代碼略長,Python提供了一種簡單的寫法,使用with語句來替代try ... finally代碼塊和close()方法,如下所示:


with?open(r'c:\text\qiye.txt','r')?as?fileReader:????print?fileReader.read()r'c:\text\qiye.txt','r')?as?fileReader:
????print?fileReader.read()


調用read()一次將文件內容讀到內存,但是如果文件過大,將會出現內存不足的問題。一般對于大文件,可以反復調用read(size)方法,一次最多讀取size個字節。如果文件是文本文件,Python提供了更加合理的做法,調用readline()可以每次讀取一行內容,調用readlines()一次讀取所有內容并按行返回列表。


大家可以根據自己的具體需求采取不同的讀取方式,例如小文件可以直接采取read()方法讀到內存,大文件更加安全的方式是連續調用read(size),而對于配置文件等文本文件,使用readline()方法更加合理。


將上面的代碼進行修改,采用readline()的方式實現如下所示:


with?open(r'c:\text\qiye.txt','r')?as?fileReader:????for?line?in?fileReader.readlines():????????print?line.strip()r'c:\text\qiye.txt','r')?as?fileReader:
????for?line?in?fileReader.readlines():
????????print?line.strip()


5. 文件寫入


寫文件和讀文件是一樣的,唯一的區別是在調用open方法時,傳入標識符'w'或者'wb'表示寫入文本文件或者寫入二進制文件,示例如下:


f?=?open(r'c:\text\qiye.txt','w')f.write('qiye')f.close()'w')
f.write('qiye')
f.close()


我們可以反復調用write()方法寫入文件,最后必須使用close()方法來關閉文件。使用write()方法的時候,操作系統不是立即將數據寫入文件中的,而是先寫入內存中緩存起來,等到空閑時候再寫入文件中,最后使用close()方法就將數據完整地寫入文件中了。


當然也可以使用f.flush()方法,不斷將數據立即寫入文件中,最后使用close()方法來關閉文件。和讀文件同樣道理,文件操作中可能會出現IO異常,所以還是推薦使用with語句:


with?open(r'c:\text\qiye.txt','w')?as?fileWriter:????fileWriter.write('qiye')r'c:\text\qiye.txt','w')?as?fileWriter:
????fileWriter.write('qiye')



02 操作文件和目錄


在Python中對文件和目錄的操作經常用到os模塊和shutil模塊。接下來主要介紹一些操作文件和目錄的常用方法:





03 序列化操作


對象的序列化在很多高級編程語言中都有相應的實現,Python也不例外。程序運行時,所有的變量都是在內存中的,例如在程序中聲明一個dict對象,里面存儲著爬取的頁面的鏈接、頁面的標題、頁面的摘要等信息:


d?=?dict(url='index.html',title='首頁',content='首頁')'首頁',content='首頁')


在程序運行的過程中爬取的頁面的鏈接會不斷變化,比如把url改成了second.html,但是程序一結束或意外中斷,程序中的內存變量都會被操作系統進行回收。


如果沒有把修改過的url存儲起來,下次運行程序的時候,url被初始化為index.html,又是從首頁開始,這是我們不愿意看到的。所以把內存中的變量變成可存儲或可傳輸的過程,就是序列化。


將內存中的變量序列化之后,可以把序列化后的內容寫入磁盤,或者通過網絡傳輸到別的機器上,實現程序狀態的保存和共享。反過來,把變量內容從序列化的對象重新讀取到內存,稱為反序列化。


在Python中提供了兩個模塊:cPickle和pickle來實現序列化,前者是由C語言編寫的,效率比后者高很多,但是兩個模塊的功能是一樣的。一般編寫程序的時候,采取的方案是先導入cPickle模塊,如果此模塊不存在,再導入pickle模塊。示例如下:


try:????import?cPickle?as?pickleexcept?ImportError:????import?pickle
????import?cPickle?as?pickle
except?ImportError:
????import?pickle


pickle實現序列化主要使用的是dumps方法或dump方法。dumps方法可以將任意對象序列化成一個str,然后可以將這個str寫入文件進行保存。在Python Shell中示例如下:


>>>?import?cPickle?as?pickle>>>?d?=?dict(url='index.html',title='首頁',content='首頁')>>>?pickle.dumps(d)"(dp1\nS'content'\np2\nS'\\xca\\xd7\\xd2\\xb3'\np3\nsS'url'\np4\nS'index.html'\np5\nsS'title'\np6\ng3\ns."as?pickle
>>>?d?=?dict(url='index.html',title='首頁',content='首頁')
>>>?pickle.dumps(d)
"(dp1\nS'content'\np2\nS'\\xca\\xd7\\xd2\\xb3'\np3\nsS'url'\np4\nS'index.html'\np5\nsS'title'\np6\ng3\ns."


如果使用dump方法,可以將序列化后的對象直接寫入文件中:


>>>?f=open(r'D:\dump.txt','wb')>>>?pickle.dump(d,f)>>>?f.close()'wb')
>>>?pickle.dump(d,f)
>>>?f.close()


pickle實現反序列化使用的是loads方法或load方法。把序列化后的文件從磁盤上讀取為一個str,然后使用loads方法將這個str反序列化為對象,或者直接使用load方法將文件直接反序列化為對象,如下所示:


>>>?f=open(r'D:\dump.txt','rb')>>>?d=pickle.load(f)>>>?f.close()>>>?d{'content':?'\xca\xd7\xd2\xb3',?'url':?'index.html',?'title':?'\xca\xd7\xd2\xb3'}'rb')
>>>?d=pickle.load(f)
>>>?f.close()
>>>?d
{'content':?'\xca\xd7\xd2\xb3',?'url':?'index.html',?'title':?'\xca\xd7\xd2\xb3'}


通過反序列化,存儲為文件的dict對象,又重新恢復出來,但是這個變量和原變量沒有什么關系,只是內容一樣。以上就是序列化操作的整個過程。


假如我們想在不同的編程語言之間傳遞對象,把對象序列化為標準格式是關鍵,例如XML,但是現在更加流行的是序列化為JSON格式,既可以被所有的編程語言讀取解析,也可以方便地存儲到磁盤或者通過網絡傳輸。


關于作者:范傳輝,資深網蟲,Python開發者,參與開發了多項網絡應用,在實際開發中積累了豐富的實戰經驗,并善于總結,貢獻了多篇技術文章廣受好評。研究興趣是網絡安全、爬蟲技術、數據分析、驅動開發等技術。

本文摘編自《Python爬蟲開發與項目實戰》,經出版方授權發布。


延伸閱讀《Python爬蟲開發與項目實戰

點擊上圖了解及購買

轉載請聯系微信:DoctorData


推薦語:零基礎學習爬蟲技術,從Python和Web前端基礎開始講起,由淺入深,包含大量案例,實用性強。



520神秘福利,一切隨緣



本次福利由機械工業出版社華章公司贊助



據統計,99%的大咖都完成了這個神操作



更多精彩


在公眾號后臺對話框輸入以下關鍵詞

查看更多優質內容!


PPT?|?報告?|?讀書?|?書單?|?干貨?

大數據?|?揭秘?|?Python?|?可視化

人工智能?|?機器學習?|?深度學習?|?神經網絡

AI?|?1024?|?段子?|?區塊鏈?|?數學


猜你想看


  • 聰明人也會掉進去的5個思維陷阱,你能躲過幾個?

  • 4段簡短代碼教你用Python讀寫Excel

  • 8個應用案例告訴你,機器學習都能做什么?

  • 從計算機視覺到人臉識別:一文看懂顏色模型、信號與噪聲



Q:?IO編程,你搞定了嗎?

歡迎留言與大家分享

覺得不錯,請把這篇文章分享給你的朋友

轉載 / 投稿請聯系:baiyu@hzbook.com

更多精彩,請在后臺點擊“歷史文章”查看

點擊閱讀原文,了解更多

總結

以上是生活随笔為你收集整理的用Python实现磁盘IO操作全攻略,让数据流动起来!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。