python語言基礎 - day12~13 模組包以及檔案操作

weixin_41810571發表於2020-10-16

python語言基礎 - day12~13 模組包以及檔案操作

在這裡插入圖片描述

1、模組

1)什麼是模組

python中的每一個py檔案都是一個模組,可以在一個模組中去使用另外模組的全域性變數(變數、函式、類),但是需要提前匯入該模組

2)如何匯入模組

匯入模組的方法總結起來有以下幾種:

a.import 模組名 - 匯入模組中沒有被阻止匯入的所有的全域性變數:'模組名.'
b.import 模組名 as 別名 - 匯入模組中的所有全域性變數:'別名.'
c.from 模組名 import 變數名 - 匯入模組中的指定變數:直接使用變數
d.from 模組名 import 變數名1 as 別名1, 變數名2, 變數名3...- 匯入模組中的指定變數:直接使用變數(變數別名)
d.from 模組名 import *:匯入模組中所有的全域性變數

3)匯入模組的原理

不管是通過import匯入,還是通過from-import匯入,在匯入的時候,模組裡的程式碼都會被執行(python的import自帶查重功能,如果模組被匯入過就不會再被重複匯入,即被匯入的模組只會執行一次)

4)阻止匯入

定義模組時,通過if __name__ = "__main__"'這個if語句來阻止在匯入模組時不需要被執行的程式碼被執行(在這個if語句中的程式碼在匯入時不會被其他模組執行,不在if中的程式碼在匯入時會被其他模組執行)

阻止匯入原理:
每個py檔案都有一個__name__變數來儲存當前模組的模組名,當直接執行某個模組時,這個檔案的__name__值為自動變成"__main__"


2、包

1)什麼是包

包就是一個含有__init__.py模組的資料夾,包是用來對py檔案進行分類或者封裝的,目的是為了方便在別的地方使用

2)怎麼樣使用包中的模組

匯入包的幾種方式:

① import 包名.模組
包名.模組名.變數
② import 包名.模組名 as 新名
對’包名.模組名’重新命名,通過’新名.變數’的方式使用變數
③ from 包名 import 模組名1, 模組名2, …
模組名.變數
④ from 包名 import 模組名1 as 新模組名1, 模組名2, …
新模組名1.變數
⑤ from 包名.模組名 import 變數名1, 變數名2, 變數名3, …
直接使用變數

3)定製包的__init__.py檔案

__init__.py檔案的作用,不管是以哪種方式匯入包,都會先執行這個檔案中的程式碼。不可以通過包直接匯入其他檔案的變數,但是可以通過包直接匯入__init__.py檔案中的變數。

3、檔案操作

1)資料持久化

資料預設儲存在執行記憶體中,執行記憶體中資料存在的週期是從程式執行開始到程式執行結束,要想長久儲存,就需要將資料儲存到磁碟中,如果想要將資料儲存到磁碟中,就需要先將資料儲存到一個檔案中,然後將該檔案儲存到磁碟中。

2)檔案操作

一個完整的檔案操作包括:開啟 -> 讀/寫 -> 關閉

3)python實現檔案操作

① 開啟檔案

使用open函式 - open(path, mode, ..., encoding=None)

path - 檔案路徑(絕對路徑、相對路徑)
絕對路徑 - 檔案在計算機中的全路徑
相對路徑 - 用.來替代路徑中的部分,只寫部分
. - 表示當前目標(當前正在寫程式碼的檔案所在的目錄),一個點可以省略
.. - 表示當前目標的上層目錄
... - 表示當前目標的上層目錄的上層目錄

# 絕對路徑
path0 = r"E:\python\PyCharm\01、語言基礎\day13 - 包檔案操作和異常\04 檔案操作.py"  # 當前檔案
path1 = r"E:\python\PyCharm\01、語言基礎\day13 - 包和檔案操作\files\message.txt"
pathx = r"E:\python\PyCharm\01、語言基礎\day13 - 包檔案操作和異常\test3\game.py"
# 相對路徑
# . - 代表資料夾'day13 - 包和檔案操作'
path2 = r'.\files\message.txt'
path3 = r'files\message.txt'

# .. - 代表資料夾'01、語言基礎'
path4 = r'..\day13 - 包檔案操作和異常\files\message.txt'
path5 = r'..\day13 - 包檔案操作和異常\test3\game.py'

mode - 字串,開啟方式(決定開啟檔案後能執行哪種操作,決定讀寫資料的型別)
'r' - 只讀操作,讀取位置在檔案的開頭(開啟一次檔案,第一次讀取讀取位置在檔案開頭,從第二次讀取開始,讀取位置都做檔案末尾)(預設)
'w' - 只寫操作(使用’w’開啟檔案會清空檔案)
'a' - 只寫操作 (使用’a’開啟檔案不會清空檔案,讀取位置在檔案結尾)

't' - 表示文字資料,對應 str 型別(預設)
'b' - 表示二進位制數字,對應bytes型別

'rt'/'tr'/'t' - 都表示讀取文字資料
'wt'/'tw'/'w' - 都表示寫入文字資料
'at'/'ta'/'t' - 都表示寫入文字資料
'rb'/'br'/'b' - 都表示讀取二進位制資料
'wb'/'bw' - 都表示寫入二進位制資料
'ab'/'ba'/ - 都表示寫入二進位制資料

注意:
1、如果一個檔案不存在,以只讀方式開啟會報錯(FileNotFoundError),以只寫方式開啟不會報錯,並且會自動建立該檔案

2、如果是文字檔案,開啟的時候可以帶’t’,也可以帶’b’,如果是非文字檔案,開啟的時候只能帶’b’

encoding - 設定文字檔案的編碼格式,一般使用’utf-8’

**注意:**1)開啟同一個檔案,讀和寫的方式要一致;

​ 2)開啟的時候如果帶’b’,不能設定encoding

② 檔案的讀/寫操作

# text.txt/test.txt不存在
# f = open('./files/text.txt', 'r')  # 報錯 FileNotFoundError
f = open('./files/text.txt', 'wt')  # 不會報錯,並且會建立text.txt檔案
f = open('./files/test.txt', 'at')  # 不會報錯,並且會建立test.txt檔案

f = open(path1, 'ra')
re1 = f.read()
f.close()

f = open(path1, 'wb')
f.write('這是在寫入')
f.close()

# 寫入二進位制資料
f = open(path1, 'ab')

③關閉 - 檔案物件.close()

**注意:**檔案關閉後不能再進行讀寫操作

f = open(path1)
f.read()
f.close()
# f.read()  # ValueError: I/O operation on closed file.

4、資料的持久化

怎麼樣做到資料持久化

1)建立一個檔案來儲存需要持久化的資料

2)需要這個資料的時候從檔案中獲取這個資料

3)如果在程式中對資料進行了修改,需要將最新的資料更新到檔案中

# 練習2:新增學生
# a.每執行一次程式新增一個學生,並且列印已經新增過的所有的學生
# b.每執行一次程式新增一個學生,並且以列表的形式列印已經新增過的所有的學生
# stu1  -> stu1        ['stu1']
# stu2  -> stu1 stu2   ['stu1', 'stu2']
# 小明   -> stu1 stu2 小明   ['stu1', 'stu2', '小明']

# 直接列印已經新增過的所有的學生
name = input('請輸入學生姓名:')
f = open('students1.txt')
re1 = f.read()
print(re1+name)
f = open('students1.txt', 'a')
f.write(name+' ')
f.close

# 列表形式列印(先在students2表裡面給一個初始值'[]')
name = input('請輸入學生姓名:')
f = open('students2.txt')
re1 = eval(f.read())
re1.append(name)
print(re1)
f = open('students2.txt', 'w')
f.write(str(re1))
f.close

相關文章