從零開始學Python(七):文件存儲I/O流和異常捕捉

這兩天在搞小程序開發,耽擱了一下更新的進度,今天補上.一個完整的前端程序確定離不開數據存儲和網絡兩個模塊,今天咱們就先來說講python中的一種常見數據存儲:文件存儲!~!前端

文件存儲(I/O操做)

何爲I/O?

I/O分別對應着英文input和output的縮寫,表明着輸入和輸出.分別對應着咱們文件的讀和寫的過程,java

當咱們對一個文件進行讀取的操做的時候,程序會以咱們要讀取的文件爲目標,經過輸入流操做,將文字讀取到緩存區,以便之後調用.python

當咱們對一個文件進行寫的操做的時候,程序會將咱們存在緩衝區中的數據經過輸出流寫到咱們的目標文件裏.小程序

Python的鍵盤輸入

python中等待鍵盤的函數有兩個,raw_input和input,二者做用效果相同,記錄鍵盤的輸入並返回結果.緩存

s=raw_input('請輸入任意內容:\n')

print '輸出:'+s

>>>請輸入任意內容:
	hello
	輸出:hello
複製代碼

raw_input函數返回的是一個字符串對象,咱們能夠直接打印出輸入結果.網絡

s=input('請輸入任意內容:\n')

print '輸出:',s

>>>請輸入任意內容:
	5*6
	輸出: 30
複製代碼

input函數返回的是一個對象,他和raw_input的根本區別是能夠輸入表達式,而且返回表達式的結果.多線程

Python文件操做

Python的文件操做都是由file對象處理.函數

open函數

file object = open(file_name [, access_mode][, buffering])
複製代碼

Python提供了內置函數open來獲取file對象,這裏咱們仔細的講解一下相關此參數的做用.學習

  • file_name 文件路徑.表明着咱們要寫入的文件名或者咱們要讀取的文件,注意:這裏的路徑是相對路徑,相對於咱們程序所在目錄的路徑
  • access_mode 打開文件的模式.可不填,默認爲只讀.也可根據需求改變,如下是所有的模式.
模式 說明
r 以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。
rb 以二進制格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是默認模式。
r+ 打開一個文件用於讀寫。文件指針將會放在文件的開頭。
rb+ 以二進制格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。
w 打開一個文件只用於寫入。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。
wb 以二進制格式打開一個文件只用於寫入。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。
w+ 打開一個文件用於讀寫。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。
wb+ 以二進制格式打開一個文件用於讀寫。若是該文件已存在則將其覆蓋。若是該文件不存在,建立新文件。
a 打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容以後。若是該文件不存在,建立新文件進行寫入。
ab 以二進制格式打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容以後。若是該文件不存在,建立新文件進行寫入。
a+ 打開一個文件用於讀寫。若是該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。若是該文件不存在,建立新文件用於讀寫。
ab+ 以二進制格式打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。若是該文件不存在,建立新文件用於讀寫。
  • buffering 用於設置緩存策略 在二進制模式下,使用0來切換緩衝;在文本模式下,經過1表示行緩衝(固定大小的緩衝區)。 在不給參數的時候,二進制文件的緩衝區大小由底層設備決定,能夠經過io.DEFAULT_BUFFER_SIZE獲取,一般爲4096或8192字節

咱們簡單的舉個例子:(test.py文件代碼)編碼

test.py文件代碼,f/b

f=open('f/b.txt')   #咱們讀取本模塊目錄下的f文件夾中的b.txt文件,其餘兩個參數默認
print f
prin io.DEFAULT_BUFFER_SIZE
>>> <open file 'f/b.txt', mode 'r' at 0x1028581e0>  #能夠發現文件對象默認模式是r
	8192   #設備默認緩衝區爲8192字節(注意,這裏須要導入io模塊纔可以使用io函數)
複製代碼

File對象相關函數

經過Python的open函數咱們能夠獲得File對象,而文件存儲的操做就是針對file對象來進行的. file對象有幾個經常使用的函數,下面咱們來一一講解:

close函數

close函數的做用是刷新緩衝區.並關閉file對象的操做流,此後便不能再進行讀寫操做了.當這個file對象再指定到新的文件對象時,file對象會先關閉之前的文件對象.因此,當咱們對一個文件操做完畢以後,應當養成良好的關閉習慣,也就是調用close函數

f=open('f/b.txt')
f.close()
複製代碼
write函數

write函數是file對象的數據寫入函數,經過該函數能夠將咱們的字符串數據或者二進制數據寫入到文件夾中.須要注意的是,若是咱們須要數據換行,要另外寫入換行符. 該函數須要有文件的寫權限

f=open('f/b.txt','a+')  #這裏咱們制定了文件模式是讀寫模式(具體可參考上面的表),而且指針放在末尾

f.write('我是一個小小的python愛好者,我在學習python') 
f.write('雖然學習之路艱辛\n但我不放棄')  #注意這裏咱們中間加了一個換行符
f.close()  #操做完畢關閉對象
複製代碼

執行以上代碼以後,你能夠去相關目錄打開b.txt文件查看內容:(但我不放棄這句由於換行單獨成一行了)

我是一個小小的python愛好者,我在學習python雖然學習之路艱辛
但我不放棄
複製代碼
read函數
f.read(n)  #參數n表示讀取的文件長度,這裏的長度是字節長度,參數不填的時候默認爲默認緩衝區大小,上面咱們打印過,是8192個字節長度
複製代碼

Tips:一個gbk編碼的漢字佔二個字節,一個utf-8編碼的漢字佔三個字節.(因此要想輸出一個完整的utf-8的字符,最少長度要爲3)

read是從一個打開的文件對象中讀取數據.

f=open('f/b.txt','a+')
f.seek(0)    #seek是定位函數,因爲咱們使用了a+文件模式,致使文件操做指針永遠在最後面,而最後面是沒有數據的,因此咱們將光標恢復到開頭,這樣咱們就可能讀取到數據了.
str=f.read()  #
f.close()
print str

>>> 我是一個小小的python愛好者,我在學習python雖然學習之路艱辛
	但我不放棄
複製代碼

其實read函數還有幾個衍生的方法,好比readline,讀取一行,你們能夠本身試試.

seek和tell函數

seek()和tell()是兩個文件定位函數,一個是設置文件的操做位置,一個是獲取文件的操做位置(注意:咱們日常的文件讀寫操做都是會改變文件的操做位置的),有時候咱們可能須要在某一段字符串的中間插入一端字符串,這時咱們就能夠利用定位函數來達到咱們的需求.

f=open('f/b.txt','r+')
f.seek(0)    #設置光標從0開始讀
str=f.read(27)  
print str   
f.seek(27)   #設置從位置27字節開始寫
f.write('哈哈哈')
f.close()

>>> 我是一個小小的python哈哈哈,我在學習python雖然學習之路艱辛
	但我不放棄
複製代碼

上面的例子中,咱們直接在中間插入了'哈哈哈'字符

文件刪除

文件刪除咱們須要用到python的os模塊,使用時須要導入該模塊.

使用os模塊的remove方法開始刪除

os.remove(filepath)    #參數傳咱們須要刪除的文件路徑
複製代碼

以上就是咱們文件操做,從建立,讀寫,到刪除的整個過程,固然咱們由於是入門篇,只是介紹了最基本的用法,不過萬事不變其宗,基礎牢固了,咱們才能更好的向外拓展!學習之路慢慢其修遠兮!

Python異常

什麼是異常

異常便是一個事件,該事件會在程序執行過程當中發生,影響了程序的正常執行。 通常狀況下,在Python沒法正常處理程序時就會發生一個異常。 異常是Python對象,表示一個錯誤。 當Python腳本發生異常時咱們須要捕獲處理它,不然程序會終止執行。

當咱們的程序出現錯誤的時候,編譯器都會告訴咱們錯誤的地方,但是當咱們程序上線以後,一旦遇到錯誤,程序便會宕機,這是咱們不能容忍的,這時候就須要用到異常處理了.

python標準異常

首先咱們來看個表,裏面基本羅列了python中咱們全部會遇到的異常(不用一一記住,腦殼過一遍就能夠了):

異常名稱 異常描述
BaseException 全部異常的基類
SystemExit 解釋器請求退出
KeyboardInterrupt 用戶中斷執行(一般是輸入^C)
Exception 常規錯誤的基類
StopIteration 迭代器沒有更多的值
GeneratorExit 生成器(generator)發生異常來通知退出
StandardError 全部的內建標準異常的基類
ArithmeticError 全部數值計算錯誤的基類
FloatingPointError 浮點計算錯誤
OverflowError 數值運算超出最大限制
ZeroDivisionError 除(或取模)零 (全部數據類型)
AssertionError 斷言語句失敗
AttributeError 對象沒有這個屬性
EOFError 沒有內建輸入,到達EOF 標記
EnvironmentError 操做系統錯誤的基類
IOError 輸入/輸出操做失敗
OSError 操做系統錯誤
WindowsError 系統調用失敗
ImportError 導入模塊/對象失敗
LookupError 無效數據查詢的基類
IndexError 序列中沒有此索引(index)
KeyError 映射中沒有這個鍵
MemoryError 內存溢出錯誤(對於Python 解釋器不是致命的)
NameError 未聲明/初始化對象 (沒有屬性)
UnboundLocalError 訪問未初始化的本地變量
ReferenceError 弱引用(Weak reference)試圖訪問已經垃圾回收了的對象
RuntimeError 通常的運行時錯誤
NotImplementedError 還沒有實現的方法
SyntaxError Python 語法錯誤
IndentationError 縮進錯誤
TabError Tab 和空格混用
SystemError 通常的解釋器系統錯誤
TypeError 對類型無效的操做
ValueError 傳入無效的參數
UnicodeError Unicode 相關的錯誤
UnicodeDecodeError Unicode 解碼時的錯誤
UnicodeEncodeError Unicode 編碼時錯誤
UnicodeTranslateError Unicode 轉換時錯誤
Warning 警告的基類
DeprecationWarning 關於被棄用的特徵的警告
FutureWarning 關於構造未來語義會有改變的警告
OverflowWarning 舊的關於自動提高爲長整型(long)的警告
PendingDeprecationWarning 關於特性將會被廢棄的警告
RuntimeWarning 可疑的運行時行爲(runtime behavior)的警告
SyntaxWarning 可疑的語法的警告
UserWarning 用戶代碼生成的警告

異常的捕捉和處理

python中的異常捕捉處理和java或者oc差很少.都是一個代碼塊:

try:
	#可能會出現異常的代碼
except Exception as e:
	#出現異常的信息,這裏咱們能夠將錯誤信息上傳
else:
	#若是沒有異常發生
finally:
	#這裏的代碼無論出不出現異常都會調用,能夠用來作一些文件關閉,索引關閉的操做
複製代碼

咱們來作個簡單的異常捕捉的例子:

f=None
try:
	f = open('f/b.txt', 'r+')  #這裏咱們打開一個f目錄下的b.txt文件,其實這個文件是不存在的,應該會發生異常
except Exception as e:   #這裏咱們使用的是異常的基類,能夠先刪除全部異常,畢竟有時候咱們也不知道到底發生的異常是屬於哪一個類(固然,精確點老是更好的)
	print e   #咱們將異常打印出來

finally:
	if f:
    	f.close()    #無論發沒發生異常,咱們都但願f對象存在的時候要關閉操做
    	
>>>  [Errno 2] No such file or directory: 'f/b.txt'   #確實發生了文件或者目錄找不到的異常
複製代碼

以上就是異常的的經常使用用法,是否是很簡單,平常開發中,咱們可能會遇到不少異常處理,咱們須要根據本身的需求對代碼塊進行更改,以便以咱們的代碼能夠抗拒任何惡劣的環境.

Q&A

到這裏,咱們這一章就講完了.到了這裏,咱們已經算是入門了,基本的python語法,對象,函數,寫法,咱們都已經學會了,下一章開始,咱們學習一點更加深一點的東西,多線程

相關文章
相關標籤/搜索