Python open() 函數用於打開一個文件,並返回文件對象,在對文件進行處理過程都須要使用到這個函數,若是該文件沒法被打開,會拋出 OSError。python
注意:使用 open() 函數必定要保證關閉文件對象,即調用 close() 函數。json
open() 函數經常使用形式是接收兩個參數:文件名(file)和模式(mode)。數據結構
open(file, mode='r')
完整的語法格式爲:app
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
參數說明:運維
mode 參數有:ide
模式 | 描述 |
---|---|
t | 文本模式 (默認)。 |
x | 寫模式,新建一個文件,若是該文件已存在則會報錯。 |
b | 二進制模式。 |
+ | 打開一個文件進行更新(可讀可寫)。 |
U | 通用換行模式(不推薦)。 |
r | 以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。 |
rb | 以二進制格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是默認模式。通常用於非文本文件如圖片等。 |
r+ | 打開一個文件用於讀寫。文件指針將會放在文件的開頭。 |
rb+ | 以二進制格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。通常用於非文本文件如圖片等。 |
w | 打開一個文件只用於寫入。若是該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。若是該文件不存在,建立新文件。 |
wb | 以二進制格式打開一個文件只用於寫入。若是該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。若是該文件不存在,建立新文件。通常用於非文本文件如圖片等。 |
w+ | 打開一個文件用於讀寫。若是該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。若是該文件不存在,建立新文件。 |
wb+ | 以二進制格式打開一個文件用於讀寫。若是該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。若是該文件不存在,建立新文件。通常用於非文本文件如圖片等。 |
a | 打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容以後。若是該文件不存在,建立新文件進行寫入。 |
ab | 以二進制格式打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容以後。若是該文件不存在,建立新文件進行寫入。 |
a+ | 打開一個文件用於讀寫。若是該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。若是該文件不存在,建立新文件用於讀寫。 |
ab+ | 以二進制格式打開一個文件用於追加。若是該文件已存在,文件指針將會放在文件的結尾。若是該文件不存在,建立新文件用於讀寫。 |
默認爲文本模式,若是要以二進制模式打開,加上 b
。函數
content = 'Python與Linux自動化運維' with open('read.txt',mode='w',encoding='utf-8') as f: f.write(content) with open('read.txt',mode='r',encoding='utf-8') as f: print(f.read())
Python與Linux自動化運維
with open('read.txt',mode='a',encoding='utf-8') as f: f.write('\nhello word\t你好') with open('read.txt',mode='r',encoding='utf-8') as f: print(f.read())
Python與Linux自動化運維 hello word 你好
img = '' with open(r"E:\軟件\360壁紙\323244.jpg",mode='rb') as f: img = f.read() with open('11.jpg',mode='wb') as f1: f1.write(img)
with open(r'C:\Users\huawei\Desktop\11.ts',mode='rb') as f: video = f.read() with open('11.ts',mode='wb') as f1: f1.write(video)
點開便可查看視頻測試
異常便是一個事件,該事件會在程序執行過程當中發生,影響了程序的正常執行。編碼
通常狀況下,在Python沒法正常處理程序時就會發生一個異常。url
異常是Python對象,表示一個錯誤。
當Python腳本發生異常時咱們須要捕獲處理它,不然程序會終止執行。
捕捉異常可使用try/except語句。
try/except語句用來檢測try語句塊中的錯誤,從而讓except語句捕獲異常信息並處理。
若是你不想在異常發生時結束你的程序,只需在try裏捕獲它。
如下爲簡單的try....except...else的語法:
try: <語句> #運行別的代碼 except <名字>: <語句> #若是在try部份引起了'name'異常 except <名字>,<數據>: <語句> #若是引起了'name'異常,得到附加的數據 else: <語句> #若是沒有異常發生
try的工做原理是,當開始一個try語句後,python就在當前程序的上下文中做標記,這樣當異常出現時就能夠回到這裏,try子句先執行,接下來會發生什麼依賴於執行時是否出現異常。
你能夠不帶任何異常類型使用except,以下實例:
try: 正常的操做 ...................... except: 發生異常,執行這塊代碼 ...................... else: 若是沒有異常執行這塊代碼
以上方式try-except語句捕獲全部發生的異常。但這不是一個很好的方式,咱們不能經過該程序識別出具體的異常信息。由於它捕獲全部的異常。
try: #正常的代碼 with open(r'E:\軟件\360壁紙\32324.jpg',mode='rb') as f: img = f.read() with open('b.jpg',mode='wb') as f1: f1.write(img) except FileNotFoundError: #出現錯誤後執行的代碼 print('文件路徑錯誤')
文件路徑錯誤
try: # 根據運算符號肯定運算規則 if opt == '+': result = one + two elif opt == '-': result = one - two elif opt == '*': result = one * two elif opt == '/': if two ==0: print('0不能作除數') result = one /two print(result) except ZeroDivisionError: print('需不能作除數!')
請輸入第一個數:1 請輸入運算符號:/ 請輸入第二個數:0 0不能作除數 需不能作除數!
使用except而帶多種異常類型
你也可使用相同的except語句來處理多個異常信息,以下所示:
try: 正常的操做 ...................... except(Exception1[, Exception2[,...ExceptionN]]]): 發生以上多個異常中的一個,執行這塊代碼 ...................... else: 若是沒有異常執行這塊代碼
try: num = input('請輸入數字') print (num+str(10)) except BaseException: print('輸入類型錯誤! ') else: print('hello')
請輸入數字11 1110 hello
try-finally 語句不管是否發生異常都將執行最後的代碼。
try: <語句> finally: <語句> #退出try時總會執行 raise
try: fh = open("testfile", "w") fh.write("這是一個測試文件,用於測試異常!!") finally: print "Error: 沒有找到文件或讀取文件失敗"
$ python test.py Error: 沒有找到文件或讀取文件失敗
try: fh = open("testfile", "w") try: fh.write("這是一個測試文件,用於測試異常!!") finally: print "關閉文件" fh.close() except IOError: print "Error: 沒有找到文件或讀取文件失敗"
當在try塊中拋出一個異常,當即執行finally塊代碼。
finally塊中的全部語句執行後,異常被再次觸發,並執行except塊代碼。
參數的內容不一樣於異常。
Python 使用 raise 語句拋出一個指定的異常。
raise語法格式以下:
raise [Exception [, args [, traceback]]]
x = 10 if x > 5: raise Exception('x 不能大於 5。x 的值爲: {}'.format(x))
Traceback (most recent call last): File "test.py", line 3, in <module> raise Exception('x 不能大於 5。x 的值爲: {}'.format(x)) Exception: x 不能大於 5。x 的值爲: 10
raise 惟一的一個參數指定了要被拋出的異常。它必須是一個異常的實例或者是異常的類(也就是 Exception 的子類)。
若是你只想知道這是否拋出了一個異常,並不想去處理它,那麼一個簡單的 raise 語句就能夠再次把它拋出。
>>>try: raise NameError('HiThere') except NameError: print('An exception flew by!') raise An exception flew by! Traceback (most recent call last): File "<stdin>", line 2, in ? NameError: HiThere
一個異常能夠帶上參數,可做爲輸出的異常信息參數。
你能夠經過except語句來捕獲異常的參數,以下所示:
try: 正常的操做 ...................... except ExceptionType, Argument: 你能夠在這輸出 Argument 的值...
變量接收的異常值一般包含在異常的語句中。在元組的表單中變量能夠接收一個或者多個值。
元組一般包含錯誤字符串,錯誤數字,錯誤位置。
異常名稱 | 描述 |
---|---|
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 | 用戶代碼生成的警告 |
如下爲單個異常的實例:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 定義函數 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語句本身觸發異常
raise語法格式以下:
raise [Exception [, args [, traceback]]]
語句中 Exception 是異常的類型(例如,NameError)參數標準異常中任一種,args 是自已提供的異常參數。
最後一個參數是可選的(在實踐中不多使用),若是存在,是跟蹤異常對象。
一個異常能夠是一個字符串,類或對象。 Python的內核提供的異常,大多數都是實例化的類,這是一個類的實例的參數。
定義一個異常很是簡單,以下所示:
def functionName( level ): if level < 1: raise Exception("Invalid level!", level) # 觸發異常後,後面的代碼就不會再執行
注意:爲了可以捕獲異常,"except"語句必須有用相同的異常來拋出類對象或者字符串。
例如咱們捕獲以上異常,"except"語句以下所示:
try: 正常邏輯 except Exception,err: 觸發自定義異常 else: 其他代碼
#!/usr/bin/python # -*- coding: UTF-8 -*- # 定義函數 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類,經過直接或間接的方式。
如下爲與RuntimeError相關的實例,實例中建立了一個類,基類爲RuntimeError,用於在異常觸發時輸出更多的信息。
在try語句塊中,用戶自定義的異常後執行except塊語句,變量 e 是用於建立Networkerror類的實例。
class Networkerror(RuntimeError): def __init__(self, arg): self.args = arg
在你定義以上類後,你能夠觸發該異常,以下所示:
try: raise Networkerror("Bad hostname") except Networkerror,e: print e.args
from 文件和異常.總結.network_error import NetWorkError try: with open(r"E:\軟件\360壁紙\323244.jpg", mode='rb') as f: img = f.read() with open('b.jpg', mode='wb') as f1: f1.write(img) except (FileNotFoundError,IndexError, ValueError): print('except') raise NetWorkError('application bad ...') else: print('else') finally: print('finally')
class NetWorkError(RuntimeError): def __init__(self,arg): self.arg=arg
JSON (JavaScript Object Notation) 是一種輕量級的數據交換格式。它基於ECMAScript的一個子集。
Python3 中可使用 json 模塊來對 JSON 數據進行編解碼,它包含了兩個函數:
在json的編解碼過程當中,python 的原始類型與json類型會相互轉換,具體的轉化對照以下:
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str | string |
int, float, int- & float-derived Enums | number |
True | true |
False | false |
None | null |
import json username = input('請輸入用戶名:') filename = 'user.json' with open(filename,'w') as f: json.dump(username,f) print('您輸入的用戶名已保存到json文件中。')
請輸入用戶名:xgp 您輸入的用戶名已保存到json文件中。
import json filename = 'user.json' with open(filename) as f: username = json.load(f) print('歡迎'+username+".")
歡迎xgp.
import json numbers = [1,2,3,4,5] filename = 'num.json' with open(filename,'w') as f: json.dump(numbers,f)
如下實例演示了 Python 數據結構轉換爲JSON:
import json # Python 字典類型轉換爲 JSON 對象 data = { 'no' : 1, 'name' : 'Runoob', 'url' : 'http://www.runoob.com' } json_str = json.dumps(data) print ("Python 原始數據:", repr(data)) print ("JSON 對象:", json_str)
Python 原始數據: {'url': 'http://www.runoob.com', 'no': 1, 'name': 'Runoob'} JSON 對象: {"url": "http://www.runoob.com", "no": 1, "name": "Runoob"}
經過輸出的結果能夠看出,簡單類型經過編碼後跟其原始的repr()輸出結果很是類似。
接着以上實例,咱們能夠將一個JSON編碼的字符串轉換回一個Python數據結構:
import json # Python 字典類型轉換爲 JSON 對象 data1 = { 'no' : 1, 'name' : 'Runoob', 'url' : 'http://www.runoob.com' } json_str = json.dumps(data1) print ("Python 原始數據:", repr(data1)) print ("JSON 對象:", json_str) # 將 JSON 對象轉換爲 Python 字典 data2 = json.loads(json_str) print ("data2['name']: ", data2['name']) print ("data2['url']: ", data2['url'])
Python 原始數據: {'name': 'Runoob', 'no': 1, 'url': 'http://www.runoob.com'} JSON 對象: {"name": "Runoob", "no": 1, "url": "http://www.runoob.com"} data2['name']: Runoob data2['url']: http://www.runoob.com
若是你要處理的是文件而不是字符串,你可使用 json.dump()
和 json.load()
來編碼和解碼JSON數據。例如:
# 寫入 JSON 數據 with open('data.json', 'w') as f: json.dump(data, f) # 讀取數據 with open('data.json', 'r') as f: data = json.load(f)