課堂筆記15-文件的讀寫

課堂筆記

1. 異常簡介

程序在運⾏過程中可能會出現⼀些錯誤。⽐如: 使⽤了不存在的索引,兩個不 同類型的數據相加…這些錯誤我們稱之爲異常

處理異常 程序運⾏時出現異常,⽬的並不是讓我們的程序直接終⽌!Python 是希望在出現異常時,我們可以編寫代碼來對異常進⾏處理


# 在程序運行過程當中,不可避免出現一些錯誤例如 用沒有賦值過的變量。類型不同做加法運算..
# 異常以後的代碼都不會執行
# print(a) # NameError: name 'a' is not defined

# print(10/0) # ZeroDivisionError: division by zero

# print('hello')
# print(10 / 0)
# print('python')

# 處理異常
# 程序運行時出現異常,目的並不是要終止我們的程序
# Python是希望出現異常時,我們可以編寫代碼來對異常進行處理

# try語句
# try:
#     代碼塊 (可能出現錯誤的語句)
# except 異常類型 as 異常名:
#     代碼塊 (出現錯誤之後的處理方式)
# except 異常類型 as 異常名:
#     代碼塊 (出現錯誤之後的處理方式)
# except 異常類型 as 異常名:
#     代碼塊 (出現錯誤之後的處理方式)
# .....
# finally:
#     代碼塊
# else:
#     代碼塊 (沒有出錯要執行的語句)

print('hello')
try:
    print(10 / 2)
except:
    print('出錯了兄弟.....')
else:
    print('程序正常執行沒有錯誤')
print('python')

2. 異常的傳播

當在函數中出現異常時,如果在函數中對異常進⾏了處理,則異常不會在進 ⾏傳播。如果函數中沒有對異常進⾏處理,則異常會繼續向函數調⽤傳播。 如果函數調⽤處處理了異常,則不再傳播異常,如果沒有處理則繼續向調⽤ 處傳播。直到傳遞到全局作⽤域(主模塊)如果依然沒有處理,則程序終⽌,並 顯示異常信息。

當程序運⾏過程中出現異常以後,所有異常信息會保存到⼀個異常對象中。 ⽽異常傳播時,實際上就是異常對象拋給了調⽤處


# 異常的傳播
# 當在函數中出現異常時,如果在函數中處理了異常。則異常不會在繼續傳播
# 如果在函數中沒有處理異常,則異常會繼續向函數調用出傳播
# 如何函數調用處處理了異常,則不在傳播。如果沒有處理則繼續向調用處傳播
# 直到傳遞到全局作用域(主模塊)如果依然沒有處理,則呈現終止,並顯示異常信息

# 當程序運行過程中,出現異常以後,所以的異常信息會被保存到一個專門的異常對象當中
# 而異常傳播時,實際上就是異常對象拋給了調用處
# def fn():
#
#     print('hello fn')
#     print(10 / 0)
#
# try:
#     fn()
#
# except:
#     pass

def fn():

    print('hello fn')
    print(10 / 0)

def fn2():

    print('hello fn2')
    fn()


def fn3():
    print('hello fn2')
    fn2()

# fn3()
print(NameError)
--------------------------------------------------------------------------

print('異常出現前')

lst = []

try:
    # print(a)
    # lst + 'hello'
    print(10/0)
# except NameError:
#     # except後不跟任何內容,此時它會捕獲所有的異常
#     # print('處理異常的邏輯....')
#     print('出現 NameError異常了')
# except ZeroDivisionError:
#     # except後不跟任何內容,此時它會捕獲所有的異常
#     # print('處理異常的邏輯....')
#     print('出現 ZeroDivisionError異常了')
except Exception as e:
    # Exception 是有所有異常類的父類 所有如果except後跟Exception 它會捕獲到所有的異常
    print('出現異常了',e,type(e))

finally:
    print('無論是否出現異常,該語句都會執行')

print('異常出現後')





3. 異常對象

1 try語句 
2 try: 
3 代碼塊(可能出現錯誤的語句) 
4 except 異常類型 as 異常名: 
5 代碼塊(出現錯誤以後的處理⽅式)
 6 except 異常類型 as 異常名: 
7 代碼塊(出現錯誤以後的處理⽅式) 
8 except 異常類型 as 異常名: 
9 代碼塊(出現錯誤以後的處理⽅式) 
10 .... 
11 else: 
12 代碼塊(沒出錯時要執⾏的語句) 
13
14 finally: 
15 代碼塊(是否出錯該代碼塊都會執⾏) 
16 try是必須的 else有沒有都可以
 17 except和finally⾄少有⼀個 
18 

4. ⽂件打開

⽂件(file) 通過Python程序來對計算機中的各種⽂件進⾏增刪改查的操作 ⽂ 件也叫I/O(Input/Output)

⽂件的操作步驟
打開⽂件
對⽂件進⾏各種操作(讀、寫)然後保存
關閉⽂件
⽂件會有⼀個返回值。返回⼀個對象,這個對象就表示的是當前的⽂件

# 文件(File)(IO Input/Output)
# 通過Python程序對計算機的各種文件進行增刪改查的操作
# 操作文件的步驟 1.打開文件 2.對文件進行各種操作(讀寫)然後保存 3.關閉文件

# open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
# 返回值 返回了一個對象 這個對象代表的就是當前打開的文件
# 如果目標文件和當前文件在同一級目錄下,直接使用文件名即可
file_name = 'demo.txt'

file_name = 'D:\JerryProject\基礎\demo.txt'

file_obj = open(file_name) # 打開對應的文件

print(file_obj)
-----------------------------------------------------------------------------
file_name = 'demo4.txt'

with open(file_name,'x',encoding='utf-8') as file_obj:

    # write()來向文件中寫入內容
    # 如果操作的是一個文本文件的時候,則需要傳遞一個字符串作爲參數
    # r表示只讀
    # w表示可以寫
    # a表示追加
    # x 表示用來創建新的文件,如有文件不存在則創建,如果存在就報錯
    # FileExistsError: [Errno 17] File exists: 'demo.txt'
    # file_obj.write('nice to meet you') # io.UnsupportedOperation: not writable
    file_obj.write('abc\n')
    file_obj.write('def')
    file_obj.write('wxy')
    r = file_obj.write(str(123)+'\n') # TypeError: write() argument must be str, not int
    print(r)
---------------------------------------------------------------------------
file_name = 'demo.txt'

with open(file_name,encoding='utf-8') as file_obj:

    # print(file_obj.read())
    # readline()該方法用來讀取一行的內容
    # print(file_obj.readline(),end='')
    # print(file_obj.readline())
    # print(file_obj.readline())
    # readlines() 它會一次性讀取文件內容以列表形式返回
    r = file_obj.readlines()
    print(r[0])
-------------------------------------------------------------------------------

file_name = 'demo.txt'
try:
    with open(file_name,encoding='utf-8') as file_obj:

        # 定義一個變量 來保存結果
        file_content = ''

        # 定義一個變量 指定每次讀取的大小
        chunk = 100
        # 創建一個循環來讀取內容
        while True:

            content = file_obj.read(chunk)

            # 檢查是否讀完文件
            if not content:
                # 內容讀取完畢退出循環
                break
            # print(content,end='')
            file_content += content

except FileNotFoundError:
    print(f'{file_name}文件不存在.....')
print(file_content,end='')



5. 關閉⽂件

調⽤close()⽅法來關閉⽂件
with…as 語句不⽤寫close()來關閉。它⾃帶關閉


# file_name = 'demo.txt'

# file_obj = open(file_name)
#
# # read()函數 用來讀取文件的內容,它會將內容全部保存到一個字符串返回
#
# content = file_obj.read()
#
# print(content)
#
# # 關閉文件
# # 調用close()函數來關閉文件
# file_obj.close()

# file_obj.read() # ValueError: I/O operation on closed file.

# with...as...語句 不用寫close()
file_name = 'demo.txt'
try:
    with open(file_name) as file_obj:


        print(file_obj.read())
except FileNotFoundError:
    print(f'{file_name}文件不存在.....')

# print(file_obj.read()) ValueError: I/O operation on closed file.



6. 讀取⽂件

通過read()來讀取⽂件的內容
調⽤open()來打開⼀個⽂件,可以將⽂件分爲2中類型 ⼀種 純⽂本⽂件(使⽤utf-8編碼編寫的⽂件) ⼀種 ⼆進制⽂件(圖⽚ mp3 視頻…) open()打開⽂件時,默認是以⽂本⽂件的形式打開的 open()默認的編碼 爲None。所以處理⽂本⽂件時要指定編碼


# 調用open()函數打開一個文件時,可以將文件分爲2種類型
# 一種純文本
# 一種是二進制文件


file_name = 'demo2.txt'
try:
    with open(file_name,encoding='utf-8') as file_obj:
        # 對於較大的文件不要直接使用read()
        # help(file_obj.read)
        content = file_obj.read(6)
        content = file_obj.read(6)
        content = file_obj.read(6)
        content = file_obj.read(6)
        print(content)
        print(len(content))



except FileNotFoundError:
    print(f'{file_name}文件不存在.....')



7. 較⼤⽂件的讀取

通過read()讀取⽂件內容時會將⽂件中所有的內容全部讀取出來。如果對於 讀取的⽂件⽐較⼤的話。會⼀次性的將⽂件加載到內容中。容易導致內存泄 露。所以對於較⼤的⽂件。不要直接調⽤read()

read()可以接收⼀個size作爲的參數。該參數⽤來指定要讀取字符的數量。默 認值爲-1.-1也就是要讀取全部的內容 每次讀取都會從上次讀取到的位置開始。如果字符的數量⼩於size。則會讀 取所有的。如果讀取到最後的⽂件。則會返回空串

readline() 該⽅法⽤來讀取⼀⾏

readlines() 該⽅法⽤於⼀⾏⼀⾏的讀取內容,它會⼀次性將讀取到的內容封 裝到⼀個列表當中返回

8. ⽂件的寫⼊

write()來向⽂件中寫⼊內容
該⽅法可以分多次向⽂件寫⼊內容
寫⼊完成之後該⽅法會返回寫⼊的字符的個數

使⽤open()函數打開⽂件時,必須要指定打開⽂件要做的操作(讀、寫、追 加)。如果不指定操作類型,則默認是讀取⽂件,⽽讀取⽂件是不能向⽂件中 寫⼊

r 表示只讀
w表示可以寫。使⽤w寫⼊⽂件時,如果⽂件不存在則會創建⼀個⽂件。 如果⽂件存在則會覆蓋原⽂件內容

9. ⼆進制⽂件寫⼊

讀取⽂本⽂件時,size是以字符爲單位。讀取⼆進制⽂件時,size是以字節 爲單位

我們⽤wb來寫⼊⼆進制⽂件

10.csv文件的操作

#寫入
import csv
with open('test.csv','a', newline='',encoding='utf-8') as f:
    writer  = csv.writer(f)
    writer.writerow(['4', '貓砂', '25', '1022', '886'])
    writer.writerow(['5', '貓罐頭', '18', '2234', '3121'])
------------------------------------------------------------
#讀出
import csv

with open('test.csv', newline = '', encoding = 'utf-8')  as f:
    #參數encoding = 'utf-8'防止出現亂碼
    reader=csv.reader(f)
    for row in reader:
        print(row)



我們也可以用這種方式自學:dir(x),可以查詢到x相關的函數,x可以是模塊,也可以是任意一種對象。
# 請直接運行並體驗代碼

a = ''  # 設置一個字符串
print('字符串:')
print(dir(a))    # 把字符串相關的函數展示出來

a = []  # 設置一個列表
print('列表:')
print(dir(a))    # 把列表相關的函數展示出來

a = {}  # 設置一個字典
print('字典:')
print(dir(a))  # 把字典相關的函數展示出來



11.random模塊/time模塊

import random  # 調用random模塊

a = random.random()  # 隨機從0-1之間(包括0不包括1)抽取一個小數
print(a)

a = random.randint(0,100)  # 隨機從0-100(包括0和100)之間抽取一個數字
print(a)

a = random.choice('abcdefg')  # 隨機從字符串,列表等對象中抽取一個元素(可能會重複)
print(a)

a = random.sample('abcdefg', 3) # 隨機從字符串,列表等對象中抽取多個不重複的元素
print(a)

items = [1, 2, 3, 4, 5, 6]  # “隨機洗牌”,比如打亂列表
random.shuffle(items)
print(items)

--------------------------------------------------------------
# 請直接運行並體驗代碼

import random  # 調用random模塊

print(dir(random))
--------------------------------------------------------
import time   

print('第一句話,過兩秒出現第二句。')
time.sleep(2)
print('第二句話。')


===================================================
time模塊和random模塊是Python的系統內置模塊,也就是說Python安裝後就準備好了這些模塊供你使用。

此外,Python作爲一門膠水語言,一個強大的優勢就是它擁有許多第三方的模塊可以直接拿來使用。

如果是第三方編寫的模塊,我們需要先從Python的資源管理庫下載安裝相關的模塊文件。

下載安裝的方式是打開終端,Windows用戶輸入pip install + 模塊名;蘋果電腦輸入:pip3 install + 模塊名,點擊enter即可。(需要預裝python解釋器和pip)

比如說,爬蟲時我們會需要用到requests這個庫(庫是具有相關功能模塊的集合),就需要在終端輸入pip3 install requests(Mac用戶)的指令。

=====================================================

自編模塊的導入演示
story.py
sentence = '從前有坐山,'

def mountain():
    print('山裏有座廟,')

class Temple:
    sentence = '廟裏有個老和尚,'
    def reading(self):
        print('在講一個長長的故事。')
------------------------------------------------------------------------------------
main.py
import story

if __name__ == '__main__':
    print(story.sentence)
    story.mountain()
    A = story.Temple()
    print(A.sentence)
    A.reading()
    print()



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章