日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python基础入门6_文件和异常

發(fā)布時間:2023/12/10 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python基础入门6_文件和异常 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Python 基礎(chǔ)入門前五篇:

  • Python 基礎(chǔ)入門–簡介和環(huán)境配置
  • Python基礎(chǔ)入門_2基礎(chǔ)語法和變量類型
  • Python基礎(chǔ)入門_3條件語句和迭代循環(huán)
  • Python基礎(chǔ)入門_4函數(shù)
  • Python基礎(chǔ)入門_5面向?qū)ο蠡A(chǔ)

這次將介紹有關(guān)文件和異常的處理,包括讀寫文本文件、二進(jìn)制文件、JSON 文件,異常處理,以及 pathlib 模塊的介紹。

本文的目錄如下:


1. 文件

簡介

Python 中讀取、寫入文件,都可以通過方法 open() 實(shí)現(xiàn),該方法用于打開一個文件,然后返回文件對象,如果文件不存在或者無法打開,會報(bào)錯 OSError。

open 方法的語法如下:

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

幾個參數(shù)說明:

  • file:必需,文件路徑,相對或者絕對路徑皆可;
  • mode:可選,文件打開的模式
  • buffering:設(shè)置緩沖
  • encoding:一般采用 utf8
  • errors:報(bào)錯級別
  • newline:區(qū)分換行符
  • closefd:傳入的 file 參數(shù)類型

常用的文件打開模式如下:

操作模式具體含義
r讀取(默認(rèn)文件打開模式)
w寫入(會截?cái)嗲懊娴膬?nèi)容)
x寫入,如果文件已經(jīng)存在會產(chǎn)生異常
a追加,將內(nèi)容寫入到已有文件末尾
b二進(jìn)制模式
t文本模式(默認(rèn))
+更新(既可以讀又可以寫)

其中 r 、 w 、a 是三選一,表明讀取或者寫入,然后可以添加其他幾種模型,即還存在:

  • rb , r+, rb+
  • wb, w+, wb+
  • ab, a+, ab+

對于 open 方法返回的 file 文件對象,它常用函數(shù)有:

  • close():關(guān)閉文件
  • flush():將內(nèi)部緩沖區(qū)數(shù)據(jù)立刻寫入文件
  • read([size]):從文件讀取指定的字節(jié)數(shù),如果沒有或者是負(fù)數(shù)值,則讀取所有
  • readline():讀取整行,包含換行符 \n 字符
  • readlines([sizeint]):讀取所有行并返回列表,若給定 sizeint>0,返回總和大約為 sizeint字節(jié)的行, 實(shí)際讀取值可能比 sizeint 較大, 因?yàn)樾枰畛渚彌_區(qū)。
  • write(str):將字符串寫入文件,返回的是寫入字符的長度
  • writelines(sequence):向文件寫入一個序列字符串列表,如果需要換行,需要自己添加每行的換行符
  • seek(offset[, whence]):設(shè)置文件當(dāng)前位置
  • tell():返回文件當(dāng)前位置。
  • truncate([size]:從文件的首行首字符開始截?cái)?#xff0c;截?cái)辔募?size 個字符,無 size 表示從當(dāng)前位置截?cái)?#xff1b;截?cái)嘀蠛竺娴乃凶址粍h除,其中 Windows 系統(tǒng)下的換行代表 2個字符大小。

讀取文本文件

讀取文本文件,必須傳入文件路徑,然后打開模式指定為 r ,接著就就是通過 encoding 參數(shù)指定編碼,當(dāng)然不設(shè)置這個編碼參數(shù),它默認(rèn)值是 None ,讀取文件將采用操作系統(tǒng)默認(rèn)的編碼,通常如果文件內(nèi)容不帶有中文,這種方法是沒問題的,如果帶有中文內(nèi)容,則必須指定 encoding='utf8' 才能正常打開文件。

以下是一個使用例子:

# 方法1 f = open('test.txt', 'r') print(f.read()) f.close()

輸出結(jié)果:

life is short, I use Python. Machine Learning Computer Vision

這是第一種使用方法,這種方法的問題就是如果忘記調(diào)用 close 方法關(guān)閉文件,會出現(xiàn)錯誤,因此推薦使用上下文語法,通過 with 關(guān)鍵字指定文件對象的上下文環(huán)境并在離開上下文環(huán)境時自動釋放文件資源,此外,讀取文件內(nèi)容,可以直接調(diào)用 read() 方法,也可以采用 for-in 循環(huán)讀取:

# 方法2 with open('test.txt', 'r') as fr:print(fr.read()) # 方法3 讀取文件也可以采用 for-in 循環(huán)逐行讀取 with open('test.txt', 'r') as fr:for line in fr:print(line.strip())

2. 異常

Python 有兩種錯誤很容易辨認(rèn):語法錯誤和異常

語法錯誤也稱為解析錯,比如下面這個例子:

while Trueprint('hello')

會報(bào)錯誤,這里指出語法錯誤的地方,就是缺少非常重要的冒號 :

File "<ipython-input-41-b385275d6655>", line 1while True^ SyntaxError: invalid syntax

而異常,是運(yùn)行期檢測到的錯誤,即解析成功后,開始運(yùn)行時的錯誤,比如執(zhí)行除法操作時候,除數(shù)是 0 的情況;讀取文件的時候,文件路徑錯誤;變量沒有定義的情況等等。

異常處理

異常的處理,就是采用 try-exception 語句,例子如下:

def read_file(file_name):file_contents = Nonetry:with open(file_name, 'r', encoding='utf-8') as f:file_contents = f.read()except FileNotFoundError:print('無法打開指定的文件!')except LookupError:print('指定了未知的編碼!')except UnicodeDecodeError:print('讀取文件時解碼錯誤!')else:print('讀取文件成功')finally:print('程序執(zhí)行完畢')return file_contents

上述代碼中,try 語句是這樣執(zhí)行的:

  • 先執(zhí)行 try 語句,即 try 和 except 之間的句子
  • 如果沒有異常發(fā)生,就忽略 except ,然后按順序執(zhí)行 else 語句,finally 語句
  • 如果發(fā)生異常,那就忽略 try 語句中發(fā)生異常部分后面的代碼,然后執(zhí)行和異常類型一樣的 except 語句,之后執(zhí)行 finally 語句
  • 如果一個異常沒有與任何的 except 匹配,那么這個異常將會傳遞給上層的 try 中。

一個 try 語句可能包含多個 except 子句,分別來處理不同的特定的異常。最多只有一個分支會被執(zhí)行

處理程序?qū)⒅会槍?yīng)的 try 子句中的異常進(jìn)行處理,而不是其他的 try 的處理程序中的異常。

一個 except 子句可以同時處理多個異常,這些異常將被放在一個括號里成為一個元組,例如:

except (FileNotFoundError, LookupError, UnicodeDecodeError) as e:print(e)

上述情況,可以添加一個 except 語句,忽略異常的名稱,它將被當(dāng)作通配符使用。你可以使用這種方法打印一個錯誤信息,然后再次把異常拋出,如下所示:

import sysdef read_file2(file_name):file_contents = Nonetry:with open(file_name, 'r', encoding='utf-8') as f:file_contents = f.read()except (LookupError, UnicodeDecodeError) as e:print(e)except:print('發(fā)生了未知的錯誤', sys.exc_info()[0])else:print('讀取文件成功')finally:print('程序執(zhí)行完畢')return file_contents

不過,其實(shí)還有一種比較偷懶的寫法,直接用 Exception 捕獲所有異常:

import sys def read_file3(file_name):file_contents = Nonetry:with open(file_name, 'r', encoding='utf-8') as f:file_contents = f.read()except Exception as e:print(e)else:print('讀取文件成功')finally:print('程序執(zhí)行完畢')return file_contents

當(dāng)然,推薦的寫法還是前面幾種寫法,這樣可以針對不同異常情況有不同的做法。

另外,這里的 else 語句是 try 語句執(zhí)行成功后,繼續(xù)執(zhí)行的語句,而 finally 則是無論是否發(fā)生異常,都會執(zhí)行的語句,它是定義了無論任何情況都會執(zhí)行的清理行為

有一些方法是有預(yù)定義的清理行為,比如說上述說到的關(guān)鍵詞 with 語句,就定義了無論文件操作如何,都會執(zhí)行關(guān)閉文件對象的行為

這兩個語句是可選擇的,不是使用的語句。

拋出異常

上述的異常處理,在出現(xiàn)異常后,是可以繼續(xù)執(zhí)行后續(xù)的代碼(try-exception 后面的語句),即不會終止程序的執(zhí)行,但如果希望發(fā)生異常就終止程序運(yùn)行,可以采用 raise 關(guān)鍵字,如下代碼所示:

try:with open(file_name, 'r', encoding='utf-8') as f:file_contents = f.read() except Exception as e:print(e)raise

或者如下所示,raise 后面加上指定的異常名稱和參數(shù)

raise NameError('HiThere')

最后,更多異常處理的例子可以查看 《總結(jié):Python中的異常處理》,文章給出了關(guān)于異常的最佳實(shí)踐:

  • 只處理你知道的異常,避免捕獲所有異常然后吞掉它們。
  • 拋出的異常應(yīng)該說明原因,有時候你知道異常類型也猜不出所以然。
  • 避免在 catch 語句塊中干一些沒意義的事情,捕獲異常也是需要成本的
  • 不要使用異常來控制流程,那樣你的程序會無比難懂和難維護(hù)。
  • 如果有需要,切記使用 finally 來釋放資源
  • 如果有需要,請不要忘記在處理異常后做清理工作或者回滾操作
  • 3. 更多文件和異常的例子

    介紹完文件和異常,接下來介紹更多的文件操作,搭配異常處理。

    寫入文件

    寫入文件,只需要設(shè)置文件打開模式是寫入模型,即 w ,代碼例子如下所示,這里實(shí)現(xiàn)讀取一個文件的內(nèi)容,然后寫入到一個新的文件中。

    def save_to_file(input_file, outputfile, write_mode='w'):file_contents = read_file(input_file)try:with open(outputfile, write_mode, encoding='utf-8') as fw:fw.write(file_contents)except IOError as ioerror:print(ioerror)print('寫入文件出錯') input_file = 'test.txt' output_file= 'new_test.txt' save_to_file(input_file, output_file, write_mode='w')

    讀取二進(jìn)制文件

    讀寫文本文件的例子都有了,接下來就是二進(jìn)制文件的讀取和寫入,這里實(shí)現(xiàn)一個復(fù)制圖片文件的功能,如下所示,讀取和保存圖片時候,采用的文件模型分別是 rb 和 wb 。

    def copy_image_file(input_image, output_image):try:with open(input_image, 'rb') as img1:data = img1.read()print(type(data))with open(output_image, 'wb') as out:out.write(data)except FileNotFoundError as e:print('指定的文件無法打開--{}'.format(input_image))except IOError as e:print('讀寫文件出現(xiàn)錯誤')finally:print('程序執(zhí)行結(jié)束')

    使用例子:

    import matplotlib.pyplot as plt from PIL import Image import numpy as np input_image = 'example.jpg' output_image = 'copyed.jpg' copy_image_file(input_image, output_image)

    采用的用于復(fù)制的圖片如下所示:

    這里,在 jupyter notebook 中展示圖片的代碼如下:

    %matplotlib inline img = Image.open(input_image) print(np.asarray(img, dtype=np.uint8).shape) plt.imshow(img);

    這里最好一行代碼 plt.imshow(img),如果不加分號,會輸出圖片變量的信息,即 <matplotlib.image.AxesImage at 0x1d0d1161dd8>,然后再顯示圖片,而加分號,則直接顯示圖片。

    讀寫 JSON 文件

    上述介紹了如何保存文本數(shù)據(jù)和二進(jìn)制數(shù)據(jù)到文件中,但如果我們希望保存的是列表或者字典的數(shù)據(jù),那么可以選擇采用 JSON 格式。

    JSON 是 JavaScript Object Notion 的縮寫,現(xiàn)在廣泛應(yīng)用于跨平臺跨語言的數(shù)據(jù)交換,因?yàn)樗羌兾谋?#xff0c;任何編程語言都可以狐貍純文本。更多關(guān)于它的介紹,可以查看官網(wǎng)–http://json.org/

    JSON 的數(shù)據(jù)類型和 Python 數(shù)據(jù)類型的對應(yīng)關(guān)系分別如下面兩張表所示:

    JSON->Python:

    JSONPython
    objectdict
    arraylist
    stringstr
    number(int / real)int / float
    true / falseTrue / False
    nullNone

    Python->JSON

    PythonJSON
    dictobject
    list, tuplearray
    strstring
    int, float, int- & float-derived Enumsnumber
    True / Falsetrue / false
    Nonenull

    在 Python 中,使用 json 庫就可以保存或者讀取 JSON 格式的文件,代碼例子如下:

    import json # 先生成一個json文件 test_dict = {'name': 'python','age': 40,'package': ['os', 'json', 'sys'],'features': {'data_analysis': ['pandas', 'matplotlib'],'deep_learning': ['scikit-learn', 'tensorflow', 'pytorch', 'keras']} } try:with open('test_data.json', 'w', encoding='utf-8') as fw:json.dump(test_dict, fw, indent=4, separators=(',', ': ')) except IOError as e:print(e) finally:print('程序執(zhí)行完畢')

    這是一個保存為 JSON 文件的代碼,調(diào)用 dump() 方法,然后讀取代碼如下所示:

    # 讀取 json 文件 try:with open('test_data.json', 'r') as fr:contents = json.load(fr)for key, val in contents.items():print('{}: {}'.format(key, val)) except IOError as e:print(e) print('讀取完畢')

    這里調(diào)用方法 load() 方法。

    在 json 庫中比較重要的是下面四個方法:

    • dump :將 Python 對象按照 JSON 格式序列化到文件中
    • dumps :將 Python 對象處理為 JSON 格式的字符串
    • load:將文件中的 JSON 數(shù)據(jù)反序列化為 Python 對象
    • loads:將字符串內(nèi)容反序列化為 Python 對象

    這里面,只要方法以 s 結(jié)尾,那就是和字符串有關(guān)系,而如果不帶,那就是和文件有關(guān)系了。

    這里的序列化和反序列化,其中序列化就是指將數(shù)據(jù)結(jié)果或者對象狀態(tài)轉(zhuǎn)換為可以存儲或者傳輸?shù)男问?#xff0c;也就是一系列字節(jié)的形式,而從這些字節(jié)提取數(shù)據(jù)結(jié)構(gòu)的操作,就是反序列化。

    在 Python 中,序列化和反序列化還可以采用 pickle 和 shelve 兩個庫,但它們僅適用于 Python,不能跨語言。

    刪除文件或者文件夾

    對于刪除文件,可以采用這兩種方法,分別用到 os 和 pathlib 兩個模塊

    • os.remove()
    • pathlib.Path.unlink() ,這個方法也可以刪除鏈接

    刪除文件夾有三種方法,不過前兩者都只能刪除空文件夾

    • os.rmdir() 只能刪除空的文件夾
    • pathlib.Path.rmdir() 刪除空文件夾
    • shutil.rmtree() 可以刪除非空文件夾

    4. pathlib 模塊

    最后介紹一個在 Python 3.4 版本加入的新模塊–pathlib ,這是一個可以很好處理文件相關(guān)操作的模塊。

    首先對于文件路徑,最大的問題可能就是 Unix 系統(tǒng)和 Windows 系統(tǒng)采用的斜杠不同,前者是 / ,而后者是 \ ,因此之前的處理文件路徑拼接的方式,可以采用 os.path.join 方法,例如:

    data_folder = 'source_folder/python/' file_path = os.path.join(data_folder, 'abc.txt') print(file_path) # 輸出 source_folder/python/abc.txt

    但現(xiàn)在有了一個更加簡潔的方法,就是采用 pathlib 模塊的 Path 方法,如下所示:

    from pathlib import Path data_folder = Path('source_folder/python/') file_path = data_folder / 'abc.txt' print(file_path) # 輸出 source_folder\python\abc.txt

    需要注意兩件事情:

  • 采用 pathlib 的方法,應(yīng)該使用 / 斜杠,Path() 方法會自動根據(jù)當(dāng)前系統(tǒng)修改斜杠,比如上述例子就更改為 Windows 的 \\
  • 文件路徑的拼接,直接采用 / 即可,不需要再寫成 os.path.join(a,b) ,更加方便簡潔。
  • 當(dāng)然,pathlib 并不只是有這個用途,它還可以完成更多事情:

    讀取文件內(nèi)容不需要打開和關(guān)閉文件,如下所示,直接調(diào)用 read_text 方法即可讀取內(nèi)容

    data_folder = Path('./') file_path = data_folder / 'test.txt' print(file_path.read_text())

    pathlib 可以更加快速容易實(shí)現(xiàn)大部分標(biāo)準(zhǔn)的文件操作,如下所示,分別執(zhí)行打印文件路徑,文件后綴,文件名(不包含文件后綴部分)、判斷文件是否存在的四個操作。

    filename = Path('./test.txt') print(filename.name) # 輸出 test.txt print(filename.suffix) # 輸出 .txt print(filename.stem) # 輸出 testif not filename.exists():print('file does not exist!') else:print('file exists')

    可以顯式將 Unix 路徑轉(zhuǎn)換為 Windows 形式的:

    from pathlib import PureWindowsPath filename = Path('source/test.txt') path_on_windows = PureWindowsPath(filename) print(path_on_windows) # 輸出 source\test.txt

    當(dāng)然,對于上述代碼,如果希望安全的處理斜杠,可以顯式定義為 Windows 格式的路徑,然后 pathlib 會將其轉(zhuǎn)換為可以在當(dāng)前系統(tǒng)使用的形式:

    filename = PureWindowsPath('source/test.txt') correct_path = Path(filename) print(correct_path) # 在 windows 輸出 source\test.txt # 在 Mac/Linux 輸出 source/test.txt

    最后,還可以利用 pathlib 將相對路徑的文件解析生成如 file:// 形式的 urls,如下所示:

    import webbrowser filename = Path('./test.txt') webbrowser.open(filename.absolute().as_uri())

    當(dāng)然,pathlib 的用法還有不少,更多的用法可以查看官網(wǎng)的介紹:

    https://docs.python.org/3/library/pathlib.html


    參考

    • Python3 File(文件) 方法
    • Python3 錯誤和異常
    • Day11–文件和異常
    • JSON 的官方網(wǎng)站
    • 《總結(jié):Python中的異常處理》
    • https://stackoverflow.com/questions/6996603/delete-a-file-or-folder
    • https://medium.com/@ageitgey/python-3-quick-tip-the-easy-way-to-deal-with-file-paths-on-windows-mac-and-linux-11a072b58d5f
    • https://docs.python.org/3/library/pathlib.html

    小結(jié)

    本文簡單介紹 Python 文件和異常的知識點(diǎn),如何讀寫文本文件、二進(jìn)制文件和 json 文件,然后異常處理,最后介紹一個新的處理文件相關(guān)操作的模塊 pathlib .

    此外,本文的代碼都上傳到我的 github 上了:

    https://github.com/ccc013/Python_Notes/blob/master/Practise/file_and_exception_example.ipynb

    歡迎關(guān)注我的微信公眾號–算法猿的成長,或者掃描下方的二維碼,大家一起交流,學(xué)習(xí)和進(jìn)步!

    總結(jié)

    以上是生活随笔為你收集整理的Python基础入门6_文件和异常的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。