一、子產品
1.什麼叫子產品
子產品英文為Modules,一個子產品中可以包含N多個函數,在python中一個擴充名為.py的檔案就是一個子產品
子產品的優點:友善其他程式和腳本的導入并使用;避免函數名和變量名沖突;提高代碼的可維護性;提高代碼的可重用性
#多個子產品構成python程式
#子產品中包含函數
def fun():
pass
def fun2():
pass
#子產品中包含類
#類中包含類屬性,類方法,靜态方法,執行個體屬性
class Student():
native_place='吉林'#類屬性
def eat(self,name,age):
self.name=name
self.age=age
@classmethod
def cm(cls):
pass
@staticmethod
def sm():
pass
#子產品中包含語句
a=10
b=20
print(a+b)
2.自定義子產品
建立子產品:建立一個.py檔案,名稱盡量不要與Python自帶的标準子產品名稱相同
導入子產品:import 子產品名稱 [as别名]
from 子產品名稱 import 函數/變量/類
import math
print(math,id(math),type(math),math.pi)
print(dir(math))
print(math.pow(2,3),type(math.pow(2,3)))#8.0 <class 'float'>
print(math.ceil(9.001))#10
print(math.floor(9.9999))#9
from math import pi
from math import pow
print(pi)#3.141592653589793
print(pow(2,3))#8.0
建立python檔案calc.py
def add(a,b):
return a+b
def div(a,b):
return a/b
在其他python檔案所在的檔案夾上單擊右鍵出現“Mark Directory as”,選擇“Sources Root”後就可以導入calc子產品
#第一種導入
import calc
print(calc.add(10,20))
print(calc.div(10,4))
#第二種導入
from calc import add
from calc import div
print(add(10,20))
print(div(10,4))
3.以主程式的形式執行
在每個子產品的定義中都包括一個記錄子產品名稱的變量__name__,程式可以檢查該變量,以确定它們在哪個子產品中執行。如果一個子產品不是被導入到其他程式中執行,那麼它可能在解釋器的頂級子產品中執行。頂級子產品的__name__變量的值為__main__
if name=‘main’:
pass
建立python檔案calc2.py
def add(a,b):
return a+b
print(add(10,20))
在其他檔案中導入子產品calc2
import calc2
print(calc2.add(100,200))#發現calc2.py中的print(add(10,20))也輸出了結果
是以calc2改為
def add(a,b):
return a+b
if __name__ == '__main__':#輸入main回車
print(add(10,20))#隻有當點選運作calc2時,才會執行這步運算
4.python中的包
包是一個分層次的目錄結構,它将一組功能相近的子產品組織在一個目錄下,用于規範代碼和避免子產品沖突
包和目錄的差別:包含__init__.py檔案的目錄稱為包
目錄中通常不包含__init__.py檔案
包的導入:import 包名.子產品名
建立包:在python檔案所在的檔案夾上單擊右鍵出現“New”,選擇“Python Package”就可以建立一個包
在包中建立子產品moduleA和moduleB,在moduleA中寫a=10,在moduleB中寫b=100
然後在其他Python檔案中寫代碼
import pageage1.module_A
print(pageage1.module_A.a)
import pageage1.module_A as ma#ma是pageage1.module_A這個子產品的别名
print(ma.a)
#導入含有包的子產品時的注意事項
import pageage1
import calc
#使用import方式進行導入時,隻能跟包名或子產品名
from pageage1 import module_A
from pageage1.module_A import a
#使用from……import方式進行導入時,可以導入包、子產品、函數、變量
python中常用的内置子產品
子產品名 | 描述 |
---|---|
sys | 與python解釋器及其環境操作相關的标準庫 |
time | 提供與時間相關的各種函數的标準庫 |
os | 提供了通路作業系統服務功能的标準庫 |
calendar | 提供與日期相關的各種函數的标準庫 |
urllib | 用于讀取來自網上(伺服器)的資料标準庫 |
json | 用于使用JSON序列化和反序列化對象 |
re | 用于在字元串中執行正規表達式比對和替換 |
math | 提供标準算術運算函數的标準庫 |
decimal | 用于進行精确控制運算精度、有效位數和四舍五入操作的十進制運算 |
logging | 提供了靈活的記錄事件、錯誤、警告和調試資訊等日志資訊的功能 |
import sys
print(sys.getsizeof(24))#28
print(sys.getsizeof(45))#28
print(sys.getsizeof(True))#28
print(sys.getsizeof(False))#24
import time
print(time.time())#625478159.7243931
print(time.localtime(time.time()))#time.struct_time(tm_year=2021, tm_mon=7, tm_mday=5, tm_hour=17, tm_min=42, tm_sec=39, tm_wday=0, tm_yday=186, tm_isdst=0)
import urllib.request
print(urllib.request.urlopen('http://www.baidu.com').read())
import math
print(math.pi)
5.第三方子產品的安裝及使用
pip install 子產品名
鍵盤的“windows”+"r"同時按,輸入cmd,回車,輸入pip install schedule
輸入python,回車,輸入import schedule回車,如果不報錯說明安裝成功了
import schedule
import time
def job():
print('哈哈')
schedule.every(3).seconds.do(job)
while True:
schedule.run_pending()
time.sleep(1)
import 子產品名
二、檔案
1.編碼格式
常見的字元編碼格式:Python的解釋器使用的是Unicode(記憶體),.py檔案在磁盤上使用UTF-8存儲(外存)
在python檔案最上面添加一行encoding=gbk可以改變預設存儲為GBK
不同的編碼方式的存儲空間是不同的
2.檔案的讀寫原理
檔案的讀寫稱為"IO操作"(先進先出)
檔案讀寫操作流程:Python操作檔案—>打開或建立檔案—>讀寫檔案—>關閉資源
3.檔案讀寫操作
内置函數open()建立檔案對象,通過IO流将磁盤檔案中的内容與程式中的對象中的内容進行同步
file=open(filename[,mode,encoding])
file:被建立的檔案對象
open:建立檔案對象的函數
filename:要建立或打開的檔案名稱
mode:打開模式預設為隻讀
encoding:預設文本檔案中字元的編寫格式為gbk
file=open('a.txt','r')#讀取格式是一個清單
print(file.readlines())
file.close()
常見的檔案打開模式
按檔案中資料的組織形式,檔案分為文本檔案(存儲的是普通“字元”文本,預設為unicode字元集,可以使用記事本程式打開)和二進制檔案(把資料内容用“位元組”進行存儲,無法用記事本打開,必須用專用的軟體打開,如mps音頻檔案、jpg圖檔、doc文檔等)
打開模式 | 描述 |
---|---|
r | 以隻讀模式打開檔案,檔案的指針将會放在檔案的開頭 |
w | 以隻寫模式打開檔案,如果檔案不存在則建立,如果檔案存在則覆寫原有内容,檔案的指針放在檔案的開頭 |
a | 以追加模式打開檔案,如果檔案不存在則建立,檔案的指針放在檔案的開頭;如果檔案存在,則在檔案末尾追加内容,檔案指針在原檔案末尾 |
b | 以二進制模式打開檔案,不能單獨使用,需要與其它模式一起使用,rb或者wb |
+ | 以讀寫方式打開檔案,不能單獨使用,需要與其它模式一起使用,a+ |
file=open('b.txt','w')
file.write('hello,world')
file.close()
file=open('b.txt','w')
file.write('python')
file.close()
file=open('b.txt','a')
file.write('python')
file.close()
src_file=open('logo.png','rb')
target_file=open('copylogo.png','wb')
target_file.write(src_file.read())
target_file.close()
src_file.close()
4.檔案對象常用的方法
方法名 | 說明 |
---|---|
read([size]) | 從檔案中讀取size個位元組或字元的内容傳回。若省略[size],則讀取到檔案末尾,即一次讀取檔案所有内容 |
readline() | 從文本檔案中讀取一行内容 |
readlines() | 把文本檔案中每一行都作為獨立的字元串對象,并将這些對象放入清單傳回 |
write(str) | 将字元串str内容寫入檔案 |
writelines(s_ list) | 将字元串清單s_ list寫入文本檔案,不添加換行符 |
seek(offset[, whence]) | 把檔案指針移動到新的位置,offset表示相對于whence的位置:offset:為正往結束方向移動,為負往開始方向移動。whence不同的值代表不同含義:0:從檔案頭開始計算(預設值)1: 從目前位置開始計算2: 從檔案尾開始計算 |
tell() | 傳回檔案指針的目前位置 |
fiush() | 把緩沖區的内容寫入檔案,但不關閉檔案 |
close() | 把緩沖區的内容寫入檔案,同時關閉檔案,釋放檔案對象相關資源 |
file=open('a.txt','r')
print(file.read(2))
print(file.readline())
print(file.readlines())
file=open('a.txt','a')
file.write('hello')
file.close()
file=open('a.txt','a')
lst=['java','go','python']
file.writelines(lst)
file.close()
file=open('a.txt','r')
file.seek(2)
print(file.read())
print(file.tell())
file.close()
file=open('c.txt','a')
file.write('hello')
file.flush()
file.write('world')
file.close()
5.with語句(上下文管理器)
with語句可以自動管理上下文資源,不論什麼原因跳出with塊,都能保證檔案正确的關閉,以此來達到釋放資源的目的
#print(type(open('a.txt','r')))
with open('a.txt','r') as file:
print(file.read())
#MyContenMgr實作了特殊方法__enter__()、__exit__(),稱為該類對象遵守了上下文管理器協定
該類對象的執行個體對象,稱為上下文管理器
class MyContenMgr(object):
def __enter__(self):
print('enter方法被調用執行了')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('exit方法被調用執行了')
def show(self):
print('show方法被調用執行了')
with MyContenMgr() as file:#相當于file=MyContenMgr()
file.show()
with open('logo.png','rb') as src_file:
with open('copy2logo.png','wb') as target_file:
target_file.write(src_file.read())
6.目錄操作
os子產品是Python内置的與作業系統功能和檔案系統相關的子產品,該子產品中的語句的執行結果通常與作業系統有關,在不同的作業系統上運作,得到的結果可能不一樣。
os子產品與os.path子產品用于對目錄或檔案進行操作
#os子產品與作業系統相關的一個子產品
import os
os.system('notepad.exe')
os.system('calc.exe')
#直接調用可執行檔案
os.startfile('C:\\Program Files\\Tencent\\QQ\\Bin\\qq.exe')
函數 | 說明 |
---|---|
getcwd() | 傳回目前的工作目錄 |
listdir(path) | 傳回指定路徑下的檔案和目錄資訊 |
mkdir(path[, mode]) | 建立日錄 |
makedirs(path1/path2. … [, mode]) | 建立多級目錄 |
rmdir(path) | 删除日錄 |
removedirs(path1/path2…) | 删除多級目錄 |
chdir(path) | 将path設定為目前工作目錄 |
import os
print(os.getcwd())
lst=os.listdir('../chap15')
print(lst)
os.mkdir('newdir2')
os.makedirs('A/B/C')
os.rmdir('newdir2')
os.removedirs('A/B/C')
os.chdir('E:\\vippython\\chap14')
print(os.getcwd())
os.path子產品操作目錄相關函數
函數 | 說明 |
---|---|
abspath(path) | 用于擷取檔案或目錄的絕對路徑 |
exists(path) | 用于判斷檔案或目錄是否存在,如果存在傳回True,否則傳回False |
join(path, name) | 将目錄與目錄或者檔案名拼接起來 |
splitext() | 分離檔案名和擴充名 |
basename(path) | 從一個目錄中提取檔案名 |
dirname(path) | 從一個路徑中提取檔案路徑,不包括檔案名 |
isdir(path) | 用于判斷是否為路徑 |
import os.path
print(os.path.abspath('demo13.py'))
print(os.path.exists('demo13.py'),os.path.exists('demo18.py'))
print(os.path.join('E:\\Python','demo13.py'))
print(os.path.split('E:\\vippython\\chap15\\demo13.py'))
print(os.path.splitext('demo13.py'))
print(os.path.basename('E:\\vippython\\chap15\\demo13.py'))
print(os.path.dirname('E:\\vippython\\chap15\\demo13.py'))
print(os.path.isdir('E:\\vippython\\chap15\\demo13.py'))
#列出指定目錄下的所有.py檔案
import os
path=os.getcwd()
lst=os.listdir(path)
for filename in lst:
if filename.endswith('.py'):
print(filename)
import os
path=os.getcwd()
lst_files=os.walk(path)
for dirpath,dirname,filename in lst_files:
print(dirpath)
print(dirname)
print(filename)
import os
path=os.getcwd()
lst_files=os.walk(path)
for dirpath,dirname,filename in lst_files:
for dir in dirname:
print(os.path.join(dirpath,dir))
for file in filename:
print(os.path.join(dirpath,file))