Python檔案和異常

2021-09-24 20:28:43 字數 4610 閱讀 2052

程式和執行時資料是在記憶體中駐留的,涉及到資料交換的地方,通常是磁碟、網路等,因此需要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 檔案和異常

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...

Python檔案和異常

程式和執行時資料是在記憶體中駐留的,涉及到資料交換的地方,通常是磁碟 網路等,因此需要io介面。io程式設計中,stream 流 是乙個很重要的概念,可以把流想象成乙個水管,資料就是水管裡的水,但是只能單向流動。input stream就是資料從外面 磁碟 網路 流進記憶體,output strea...