成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用Python實現磁盤IO操作全攻略,讓數據流動起來!

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

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

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

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

 

01 文件讀寫

1. 打開文件

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

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

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

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

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

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

如果文件不存在,將會看到一個類似下面的異?;厮荩?/p>

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

2. 文件模式

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

  • 'r':讀模式
  • 'w':寫模式
  • 'a':追加模式
  • 'b':二進制模式(可添加到其他模式中使用)
  • '+':讀/寫模式(可添加到其他模式中使用)

這里主要是提醒一下'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類型的對象:

  1. >>> f.read() 
  2. "qiye" 

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

  1. >>> f.close() 

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

  1. try: 
  2.     f = open(r'c:\text\qiye.txt','r'
  3.     print f.read() 
  4. finally: 
  5.     if f: 
  6.         f.close() 

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

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

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

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

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

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

5. 文件寫入

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

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

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

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

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

02 操作文件和目錄

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

  • 獲得當前Python腳本工作的目錄路徑:

os.getcwd()。

  • 返回指定目錄下的所有文件和目錄名:

os.listdir()。例如返回C盤下的文件:os.listdir("C:\\")

  • 刪除一個文件:

os.remove(filepath)。

  • 刪除多個空目錄:

os.removedirs(r"d:\python")。

  • 檢驗給出的路徑是否是一個文件:

os.path.isfile(filepath)。

  • 檢驗給出的路徑是否是一個目錄:

os.path.isdir(filepath)。

  • 判斷是否是絕對路徑:

os.path.isabs()。

  • 檢驗路徑是否真的存在:

os.path.exists()。例如檢測D盤下是否有Python文件夾:os.path.exists(r"d:\python")

  • 分離一個路徑的目錄名和文件名:

os.path.split()。例如:os.path.split(r"/home/qiye/qiye.txt"),返回結果是一個元組:('/home/qiye', 'qiye.txt')。

  • 分離擴展名:

os.path.splitext()。例如os.path.splitext(r"/home/qiye/qiye.txt"),返回結果是一個元組:('/home/qiye/qiye', '.txt')。

  • 獲取路徑名:

os.path.dirname(filetpah)。

  • 獲取文件名:

os.path.basename(filepath)。

  • 讀取和設置環境變量:

os.getenv()與os.putenv()。

  • 給出當前平臺使用的行終止符:

os.linesep。Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'。

  • 指示你正在使用的平臺:

os.name。對于Windows,它是'nt',而對于Linux/Unix用戶,它是'posix'。

  • 重命名文件或者目錄:

os.rename(old,new)。

  • 創建多級目錄:

os.makedirs(r"c:\python\test")。

  • 創建單個目錄:

os.mkdir("test")。

  • 獲取文件屬性:

os.stat(file)。

  • 修改文件權限與時間戳:

os.chmod(file)。

  • 獲取文件大?。?/strong>

os.path.getsize(filename)。

  • 復制文件夾:

shutil.copytree("olddir","newdir")。olddir和newdir都只能是目錄,且newdir必須不存在。

  • 復制文件:

shutil.copyfile("oldfile","newfile"),oldfile和newfile都只能是文件;shutil. copy("oldfile","newfile"),oldfile只能是文件,newfile可以是文件,也可以是目標目錄。

  • 移動文件(目錄):

shutil.move("oldpos","newpos")。

  • 刪除目錄:

os.rmdir("dir"),只能刪除空目錄;shutil.rmtree("dir"),空目錄、有內容的目錄都可以刪。

 

03 序列化操作

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

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

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

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

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

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

  1. try: 
  2.     import cPickle as pickle 
  3. except ImportError: 
  4.     import pickle 

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

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

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

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

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

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

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

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

作者:范傳輝

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

內容摘編自《Python爬蟲開發與項目實戰》一書

 

首發于微信公眾號大數據(ID:hzdashuju)

責任編輯:武曉燕 來源: 大數據
相關推薦

2020-11-16 11:50:21

Python代碼命令

2009-06-19 11:18:51

Factory BeaSpring配置

2022-06-07 09:00:32

PythonAI靜態圖片

2016-11-15 15:10:07

2010-04-23 14:04:23

Oracle日期操作

2013-05-27 15:35:18

用友UAP移動應用移動平臺

2022-02-24 08:30:24

操作系統CPU程序

2011-06-01 14:51:54

jQuery

2012-09-03 09:21:51

2021-09-26 09:23:01

GC算法垃圾

2010-09-08 09:48:56

Gif播放教程Android

2024-05-07 09:01:21

Queue 模塊Python線程安全隊列

2019-05-21 14:18:09

PygamePython編程語言

2021-01-29 17:40:00

Flyme安卓手機安全

2010-05-21 11:03:51

統一通信系統

2011-09-15 17:36:29

Android應用Call Cartoo動畫

2018-07-26 13:53:27

2014-03-21 09:52:29

jQuery動畫插件

2021-04-12 11:47:21

人工智能知識圖譜

2015-03-04 13:53:33

MySQL數據庫優化SQL優化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九一视频在线播放 | 久久亚洲一区二区三 | 久久久久久久成人 | 成人在线视 | 久久久入口 | 91精品国产欧美一区二区成人 | 成人在线精品 | 91精品国产色综合久久 | 免费观看色 | 天堂在线91| 91免费入口| 国产高清免费 | 97国产一区二区精品久久呦 | 午夜视频在线观看网址 | 国产一区免费 | 日韩中文字幕在线观看 | 日韩在线不卡 | 在线观看h视频 | 少妇久久久 | 国产超碰人人爽人人做人人爱 | 欧美视频三区 | 亚洲综合伊人 | 国产大学生情侣呻吟视频 | www.国产一区 | 日韩免费av一区二区 | 黄色网络在线观看 | 影音先锋久久 | 日本成人在线网址 | 亚洲一区二区三区久久 | www.久草| 国产乱码精品1区2区3区 | 黄色毛片在线看 | 黄网站涩免费蜜桃网站 | 日韩在线视频网址 | 香蕉视频黄色 | 久久久精品一区 | 久久久久亚洲精品 | 久久伊| 性欧美精品一区二区三区在线播放 | 精品一区国产 | 91精品国产91久久综合桃花 |