程式和執行時資料是在記憶體中駐留的,涉及到資料交換的地方,通常是磁碟、網路等,因此需要io介面。
io程式設計中,stream(流)是乙個很重要的概念,可以把流想象成乙個水管,資料就是水管裡的水,但是只能單向流動。input stream就是資料從外面(磁碟、網路)流進記憶體,output stream就是資料從記憶體流到外面去。
cpu和記憶體的速度遠遠高於外設的速度。
操作io的能力都是由作業系統提供的,每一種程式語言都會把作業系統提供的低階c介面封裝起來方便使用。
try:
f = open(r'c:\users\84745\desktop\test.txt', 'r')
print(f.read())
finally:
if f:
f.close() # 關閉檔案
由於反斜槓在python中被視為轉義標記,為在windows中確保萬無一失,應以原始字串的方式指定路徑,即在開頭的單引號前加上r。
檔案使用完畢後必須關閉,因為檔案物件會占用作業系統的資源,並且作業系統同一時間能開啟的檔案數量也是有限的。
python引入了with
語句來自動幫我們呼叫close()
方法。
with open(r'c:\users\84745\desktop\test.txt') as f:
contents = f.read()
print(contents)
# 逐行讀取
filename = 'pi_digits.txt'
with open(filename) as f:
for line in f:
print(line)
# 在with**塊外訪問檔案的內容
filename = 'pi_digits.txt'
with open(filename) as f:
lines = f.readlines()
for line in lines:
print(line.rstrip())
3.1415926535
8979323846
2643383279
寫檔案和讀檔案的唯一區別是呼叫open()
函式時,傳入識別符號'w'
或者'wb'
表示寫文字檔案或寫二進位制檔案。
當我們寫檔案時,作業系統往往不會立刻把資料寫入磁碟,而是放到記憶體快取起來,空閒的時候再慢慢寫入。只有呼叫close()
方法時,作業系統才保證把沒有寫入的資料全部寫入磁碟。忘記呼叫close()
的後果是資料可能只寫了一部分到磁碟,剩下的丟失了。
filename = 'programming.txt'
with open(filename, 'w') as f:
f.write("i love programming.")
我們把變數從記憶體中變成可儲存或傳輸的過程稱之為序列化。
把變數內容從序列化的物件重新讀到記憶體裡稱之為反序列化。
python提供了pickle
模組來實現序列化。
>>> d = dict(name='bob', age=20, score=88)
>>> f = open('dump.txt', 'wb')
>>> pickle.dump(d, f)
>>> f.close()
>>> f = open('dump.txt', 'rb')
>>> d = pickle.load(f)
>>> f.close()
>>> d
1.3.1 json
如果我們要在不同的程式語言之間傳遞物件,就必須把物件序列化為標準格式,比如xml,但更好的方法是序列化為json,因為json表示出來就是乙個字串,可以被所有語言讀取,也可以方便地儲存到磁碟或者通過網路傳輸。
python內建的json模組提供了非常完善的python物件到json格式的轉換。
>>> import json
>>> d = dict(name='bob', age=20, score=88)
>>> json.dumps(d)
''>>> json_str = ''
>>> json.loads(json_str)
import json
class student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
def student2dict(std):
return
s = student('bob', 20, 88)
print(json.dumps(s, default=student2dict))
#
通常class的例項都有乙個__dict__
屬性,它就是乙個字典,用來儲存例項變數。
import json
class student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
s = student('bob', 20, 88)
print(json.dumps(s, default=lambda obj: obj.__dict__))
#
# 把json反序列化為乙個student物件例項。
import json
class student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
def dict2student(d):
return student(d['name'], d['age'], d['score'])
json_str = ''
print(json.loads(json_str, object_hook=dict2student))
# <__main__.student object at 0x00bbaa30>
python使用被稱為異常的特殊物件來管理程式執行期間發生的錯誤。
如果你編寫了處理該異常的**,程式將繼續執行;如果你未對異常進行處理,程式將停止,並顯示乙個traceback,其中包含有關異常的報告。
異常是使用try-except**塊處理的。
try:
print(5/0)
except zerodivisionerror:
print("you can't divide by zero!")
# you can't divide by zero!
乙個try
語句可能包含多個except
子句,分別來處理不同的特定的異常。最多只有乙個分支會被執行。
乙個except
子句可以同時處理多個異常,這些異常將被放在乙個括號裡成為乙個元組。
最後乙個except
子句可以忽略異常的名稱,它將被當作萬用字元使用。你可以使用這種方法列印乙個錯誤資訊,然後再次把異常丟擲。
try-except語句還有乙個可選的else
子句,如果使用這個子句,那麼必須放在所有的except
子句之後。這個子句將在try
子句沒有發生任何異常的時候執行。
python使用raise
語句丟擲乙個指定的異常。
raise
唯一的乙個引數指定了要被丟擲的異常。它必須是乙個異常的例項或者是異常的類(即exception
的子類)。
Python 檔案和異常
關鍵字with 在不再需要訪問檔案後將其關閉。我們使用方法read 讀取這個檔案的全部內容,並將其作為乙個長長的字串儲存在變數contents中.還可以將檔案在計算機中的準確位置告訴python,這樣就不用關心當前執行的程式儲存在什麼地方了。這稱為絕對檔案路徑 file path c users e...
Python檔案和異常
程式和執行時資料是在記憶體中駐留的,涉及到資料交換的地方,通常是磁碟 網路等,因此需要io介面。io程式設計中,stream 流 是乙個很重要的概念,可以把流想象成乙個水管,資料就是水管裡的水,但是只能單向流動。input stream就是資料從外面 磁碟 網路 流進記憶體,output strea...
Python 檔案和異常
usr bin env python with open pi as file object contents file object.read print contents 3.1415926 5212533 2324255 1 逐行讀取 usr bin env python filename p...