Python 學習筆記(3)

Python 文件I/O

 

讀取鍵盤輸入:

Python提供了兩個內置函數從標準輸入讀入一行文本,默認的標準輸入是鍵盤:

1. raw_input

#函數從標準輸入讀取一個行,並返回一個字元串(去掉結尾的換行符)
str = raw_input("請輸入:")
print ("你輸入的內容是: ", str)

#結果:
請輸入:Hello Python!
你輸入的內容是:  Hello Python!

 

註:python3以後的版本就將該函數刪除了(可能是和input太像了,input完全可以替代它)

2.input

input([prompt]) 函數和 raw_input([prompt]) 函數基本類似
str = input("請輸入:")
print "你輸入的內容是: ", str

# input 可以接收一個Python表達式作為輸入,並將運算結果返回
#結果:
請輸入:[x*5 for x in range(2,10,2)]
你輸入的內容是:  [10, 20, 30, 40]

 

把數據輸入到文件中

fp = open('text.txt', 'a+')
print("helloWorld", file=fp)
fp.close()
注意:要寫成file=fp 如果只寫fp會創建新文件,但不會再文件內輸入內容

參數類型:

b : 二進位模式

+ :打開一個文件進行更新(可讀可寫)

r :以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式

w:打開一個文件只用於寫入。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件

a:打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入

 

write()方法

write()方法不會在字元串的結尾添加換行符('\n'):

# 打開一個文件
fo = open("foo.txt", "w")
fo.write( "www.runoob.com!\nVery good site!\n")
 
# 關閉打開的文件
fo.close()


$ cat foo.txt 
www.runoob.com!
Very good site!

 

read()方法

#在這裡,被傳遞的參數是要從已打開文件中讀取的位元組計數。該方法從文件的開頭開始讀入,
#如果沒有傳入count,它會嘗試儘可能多地讀取更多的內容,很可能是直到文件的末尾。
fo = open("foo.txt", "r+") str = fo.read(10) print "讀取的字元串是 : ", str 讀取的字元串是 : www.runoob

 

文件定位

tell():方法告訴你文件內的當前位置, 換句話說,下一次的讀寫會發生在文件開頭這麼多位元組之後

seek(offset [,from]):

offset:要移動的位元組數

from:指定開始移動位元組的參考位置 0:文件的開頭  1: 當前的位置 2: 文件的末尾

# 打開一個文件
fo = open("foo.txt", "r+")
str = fo.read(10)
print "讀取的字元串是 : ", str
 
# 查找當前位置
position = fo.tell()
print "當前文件位置 : ", position
 
# 把指針再次重新定位到文件開頭
position = fo.seek(0, 0)
str = fo.read(10)
print "重新讀取字元串 : ", str
# 關閉打開的文件
fo.close()


讀取的字元串是 :  www.runoob
當前文件位置 :  10
重新讀取字元串 :  www.runoob

 

python 異常處理

語法:

try:
<語句>        #運行別的程式碼
except <名字>:
<語句>        #如果在try部份引發了'name'異常
except <名字>,<數據>:
<語句>        #如果引發了'name'異常,獲得附加的數據
else:
<語句>        #如果沒有異常發生

try的工作原理是,當開始一個try語句後,python就在當前程式的上下文中作標記,這樣當異常出現時就可以回到這裡,try子句先執行,接下來會發生什麼依賴於執行時是否出現異常。

例如:

try:
    fh = open("testfile", "w")
    fh.write("這是一個測試文件,用於測試異常!!")
except IOError:
    print "Error: 沒有找到文件或讀取文件失敗"
else:
    print "內容寫入文件成功"
    fh.close()

 

使用exception不帶任何異常類型

此時try-except語句捕獲所有發生的異常。

但這不是一個很好的方式,我們不能通過該程式識別出具體的異常資訊。

try-fnally語句

try-finally 語句無論是否發生異常都將執行最後的程式碼

try:
    fh = open("testfile", "w")
    fh.write("這是一個測試文件,用於測試異常!!")
finally:
    print "Error: 沒有找到文件或讀取文件失敗"

 

異常的參數

一個異常可以帶上參數,可作為輸出的異常資訊參數。

# 定義函數
def temp_convert(var):
    try:
        return int(var)
    except ValueError, Argument:
        print "參數沒有包含數字\n", Argument

# 調用函數
temp_convert("xyz");

$ python test.py 
參數沒有包含數字
invalid literal for int() with base 10: 'xyz'

 

觸發異常

raise [Exception [, args [, traceback]]]

語句中 Exception 是異常的類型(例如,NameError)參數標準異常中任一種,args 是自已提供的異常參數。

最後一個參數是可選的(在實踐中很少使用),如果存在,是跟蹤異常對象

# 定義函數
def mye( level ):
    if level < 1:
        raise Exception,"Invalid level!"
        # 觸發異常後,後面的程式碼就不會再執行
try:
    mye(0)            # 觸發異常
except Exception,err:
    print 1,err
else:
    print 2


$ python test.py 
1 Invalid level!

 

自定義異常

異常應該是典型的繼承自Exception類,通過直接或間接的方式。

class Networkerror(Exception):
    def __init__(self, arg):
        self.args = arg


try:
    raise Networkerror("bad hostname")
except Networkerror as e : #e 是用於創建Networkerror類的實例 註:3.9版本後都改用as,之前版本可以用逗號,
    print(e.args)