一、open() 函數
Python open() 函數用於打開一個文件,並返回文件對象,在對文件進行處理過程都需要使用到這個函數,如果該文件無法被打開,會拋出 OSError。
注意:使用 open() 函數一定要保證關閉文件對象,即調用 close() 函數。
open() 函數常用形式是接收兩個參數:文件名(file)和模式(mode)。
open(file, mode='r')
完整的語法格式爲:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
參數說明:
- file: 必需,文件路徑(相對或者絕對路徑)。
- mode: 可選,文件打開模式
- buffering: 設置緩衝
- encoding: 一般使用utf8
- errors: 報錯級別
- newline: 區分換行符
- closefd: 傳入的file參數類型
- opener:
mode 參數有:
模式 | 描述 |
---|---|
t | 文本模式 (默認)。 |
x | 寫模式,新建一個文件,如果該文件已存在則會報錯。 |
b | 二進制模式。 |
+ | 打開一個文件進行更新(可讀可寫)。 |
U | 通用換行模式(不推薦)。 |
r | 以只讀方式打開文件。文件的指針將會放在文件的開頭。這是默認模式。 |
rb | 以二進制格式打開一個文件用於只讀。文件指針將會放在文件的開頭。這是默認模式。一般用於非文本文件如圖片等。 |
r+ | 打開一個文件用於讀寫。文件指針將會放在文件的開頭。 |
rb+ | 以二進制格式打開一個文件用於讀寫。文件指針將會放在文件的開頭。一般用於非文本文件如圖片等。 |
w | 打開一個文件只用於寫入。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。 |
wb | 以二進制格式打開一個文件只用於寫入。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。一般用於非文本文件如圖片等。 |
w+ | 打開一個文件用於讀寫。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。 |
wb+ | 以二進制格式打開一個文件用於讀寫。如果該文件已存在則打開文件,並從開頭開始編輯,即原有內容會被刪除。如果該文件不存在,創建新文件。一般用於非文本文件如圖片等。 |
a | 打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。 |
ab | 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。也就是說,新的內容將會被寫入到已有內容之後。如果該文件不存在,創建新文件進行寫入。 |
a+ | 打開一個文件用於讀寫。如果該文件已存在,文件指針將會放在文件的結尾。文件打開時會是追加模式。如果該文件不存在,創建新文件用於讀寫。 |
ab+ | 以二進制格式打開一個文件用於追加。如果該文件已存在,文件指針將會放在文件的結尾。如果該文件不存在,創建新文件用於讀寫。 |
默認爲文本模式,如果要以二進制模式打開,加上 b
。
1、寫入和讀取文件
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自動化運維
分析一下
2、追加文件內容
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 你好
分析一下
3、讀取圖片和視頻(二進制)
(1)圖片
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)
可查看到讀取圖片
(2)視頻
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)
可查看到讀取視頻(需在文件路徑中查看)
點開即可查看視頻
二、文件的異常
1、什麼是異常?
異常即是一個事件,該事件會在程序執行過程中發生,影響了程序的正常執行。
一般情況下,在Python無法正常處理程序時就會發生一個異常。
異常是Python對象,表示一個錯誤。
當Python腳本發生異常時我們需要捕獲處理它,否則程序會終止執行。
2、異常處理
捕捉異常可以使用try/except語句。
try/except語句用來檢測try語句塊中的錯誤,從而讓except語句捕獲異常信息並處理。
如果你不想在異常發生時結束你的程序,只需在try裏捕獲它。
語法:
以下爲簡單的try....except...else的語法:
try:
<語句> #運行別的代碼
except <名字>:
<語句> #如果在try部份引發了'name'異常
except <名字>,<數據>:
<語句> #如果引發了'name'異常,獲得附加的數據
else:
<語句> #如果沒有異常發生
try的工作原理是,當開始一個try語句後,python就在當前程序的上下文中作標記,這樣當異常出現時就可以回到這裏,try子句先執行,接下來會發生什麼依賴於執行時是否出現異常。
- 如果當try後的語句執行時發生異常,python就跳回到try並執行第一個匹配該異常的except子句,異常處理完畢,控制流就通過整個try語句(除非在處理異常時又引發新的異常)。
- 如果在try後的語句裏發生了異常,卻沒有匹配的except子句,異常將被遞交到上層的try,或者到程序的最上層(這樣將結束程序,並打印默認的出錯信息)。
- 如果在try子句執行時沒有發生異常,python將執行else語句後的語句(如果有else的話),然後控制流通過整個try語句。
(1)異常處理
你可以不帶任何異常類型使用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('文件路徑錯誤')
輸出結果:
文件路徑錯誤
(2)0做除數的錯誤
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不能做除數 需不能做除數!
(3)索引溢出的錯誤
使用except而帶多種異常類型
你也可以使用相同的except語句來處理多個異常信息,如下所示:
try:
正常的操作
......................
except(Exception1[, Exception2[,...ExceptionN]]]):
發生以上多個異常中的一個,執行這塊代碼
......................
else:
如果沒有異常執行這塊代碼
實例
try:
num = input('請輸入數字')
print (num+str(10))
except BaseException:
print('輸入類型錯誤! ')
else:
print('hello')
輸出結果:
請輸入數字11 1110 hello
(4)try-finally 語句
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塊代碼。
參數的內容不同於異常。
(5)拋出異常
Python 使用 raise 語句拋出一個指定的異常。
raise語法格式如下:
raise [Exception [, args [, traceback]]]
以下實例如果 x 大於 5 就觸發異常:
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
3、異常類型
一個異常可以帶上參數,可作爲輸出的異常信息參數。
你可以通過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 | 用戶代碼生成的警告 |
(1)實例
以下爲單個異常的實例:
#!/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'
(2)觸發異常
我們可以使用raise語句自己觸發異常
raise語法格式如下:
raise [Exception [, args [, traceback]]]
語句中 Exception 是異常的類型(例如,NameError)參數標準異常中任一種,args 是自已提供的異常參數。
最後一個參數是可選的(在實踐中很少使用),如果存在,是跟蹤異常對象。
(3)實例
一個異常可以是一個字符串,類或對象。 Python的內核提供的異常,大多數都是實例化的類,這是一個類的實例的參數。
定義一個異常非常簡單,如下所示:
def functionName( level ):
if level < 1:
raise Exception("Invalid level!", level)
# 觸發異常後,後面的代碼就不會再執行
注意:爲了能夠捕獲異常,"except"語句必須有用相同的異常來拋出類對象或者字符串。
例如我們捕獲以上異常,"except"語句如下所示:
try:
正常邏輯
except Exception,err:
觸發自定義異常
else:
其餘代碼
(4)實例
#!/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!
4、用戶自定義異常
通過創建一個新的異常類,程序可以命名它們自己的異常。異常應該是典型的繼承自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
5、文件和異常的總結
(1)network文件寫入
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')
(2)network_error寫入
class NetWorkError(RuntimeError):
def __init__(self,arg):
self.arg=arg
三、json庫存儲數據
JSON (JavaScript Object Notation) 是一種輕量級的數據交換格式。它基於ECMAScript的一個子集。
Python3 中可以使用 json 模塊來對 JSON 數據進行編解碼,它包含了兩個函數:
- json.dumps(): 對數據進行編碼。
- json.loads(): 對數據進行解碼。
在json的編解碼過程中,python 的原始類型與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 |
(1)存入數據到user.json
import json
username = input('請輸入用戶名:')
filename = 'user.json'
with open(filename,'w') as f:
json.dump(username,f)
print('您輸入的用戶名已保存到json文件中。')
執行結果:
請輸入用戶名:xgp 您輸入的用戶名已保存到json文件中。
(2)引用json庫數據
import json
filename = 'user.json'
with open(filename) as f:
username = json.load(f)
print('歡迎'+username+".")
執行結果:
歡迎xgp.
(3)存入---指定數據---到---num.json
import json
numbers = [1,2,3,4,5]
filename = 'num.json'
with open(filename,'w') as f:
json.dump(numbers,f)
1、son.dumps 與 json.loads 實例
以下實例演示了 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)