Python的包(package)和模塊(module)
創(chuàng)新互聯(lián)是一家專業(yè)提供清江浦企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站建設(shè)、網(wǎng)站制作、H5頁面制作、小程序制作等業(yè)務(wù)。10年已為清江浦眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計公司優(yōu)惠進(jìn)行中。一、Python的包(package)
包:初期理解為文件夾,用于裝多個模塊
作用:一種管理Python模塊命名空間的形式,采用"點(diǎn)語法" os.path
包和文件夾之間的區(qū)別:Python的包中有一個特殊的文件__init__.py文件,前期里面不寫任何內(nèi)容,但是,就是為了告訴編譯器,當(dāng)前這個目錄不是普通目錄,是一個包
創(chuàng)建方式:選中工程,創(chuàng)建Python package(使用pycharm編輯器)
二、Python的模塊(module)
1.概述
為了解決維護(hù)問題,一般情況下,在一個完整的項目中,會將特定的功能分組,分別放到不同的文件中,在使用的過程中,可以單獨(dú)維護(hù),各個不同的文件之間互不影響,每個.py文件就被稱為一個模塊,通過結(jié)合包的使用來組織文件
封裝思路: 函數(shù) => 類 => 模塊 => 包 => 項目
優(yōu)點(diǎn):
a.提高了代碼的可維護(hù)性
b.提高了代碼的復(fù)用性【當(dāng)一個模塊被完成之后,可以在多個文件中使用】
c.引用其他的模塊【第三方模塊】
d.避免函數(shù)名和變量的命名沖突
2 os模塊
提供有關(guān)于操作系統(tǒng)的函數(shù),處理文件或者文件夾
**注意:**若path不是絕對路徑,則認(rèn)為是在當(dāng)前py文件的地址執(zhí)行相關(guān)操作
# os: operation system 操作系統(tǒng)
import os
print(os.name)
# nt--->windows
# posix --->Linux, MacOS
print(os.environ)
print(os.environ.get('PATH'))
# . 表示當(dāng)前目錄
# .. 表示上級目錄
print(os.curdir) # . 當(dāng)前目錄
# 當(dāng)前路徑
# 相對路徑:從當(dāng)前目錄(或者項目目錄)開始的路徑
# 絕對路徑:從磁盤根目錄開始的完整路徑
print(os.getcwd()) # C:\Users\75171\Desktop\Python2004\day11\code
# 后面的必須掌握
# listdir():獲取指定路徑下的所有文件或者目錄的名字,以列表形式展示
print(os.listdir(r'path'))
# mkdir():新建目錄
# os.mkdir('hello')
# os.makedirs('a/b/c') # 可以遞歸創(chuàng)建目錄
# 刪除目錄
# os.rmdir('hello')
# os.rmdir('a') # OSError: [WinError 145] 目錄不是空的。: 'a'
# 刪除文件
# os.remove('a.txt')
# 重命名
# os.rename('a','aaa')
# os.rename(r'aaa/b/a.txt','aaa/b/bbb.txt')
# 文件屬性
print(os.stat('aaa/b/bbb.txt'))
# os.path
# os.path.join():將多個路徑拼接
print(os.path.join(r'path2','name')) # 一般兩個,也可以三個
# os.path.split():拆分
print(os.path.split(r'C:\Users\75171\Desktop\Python2004\day11\code\aaa'))
# 'C:\Users\75171\Desktop\Python2004\day11\code' 'aaa'
# os.path.splitext():將文件的名稱和擴(kuò)展名拆分
print(os.path.splitext('ccc.py')) # ('ccc', '.py')
# os.path.getsize():獲取文件大小
print(os.path.getsize('path')) # 1639
# os.path.abspath(): 獲取指定文件的絕對路徑
print(os.path.abspath('bbb.txt')) # C:\Users\75171\Desktop\Python2004\day11\code\bbb.txt
# __file__:當(dāng)前文件名
print(os.path.abspath(__file__)) # C:\Users\75171\Desktop\Python2004\day11\code\os.py
file_path = r'C:\Users\75171\Desktop\Python2004\day11\code\os.py'
dir_path = r'C:\Users\75171\Desktop\Python2004\day11\code'
# os.path.exist() :判斷文件或目錄是否存在
print(os.path.exists(file_path))
print(os.path.exists(dir_path))
# os.path.isfile():是否為文件
print(os.path.isfile(file_path)) # True
print(os.path.isfile(dir_path)) # False
# os.path.isdir():是否為文件
print(os.path.isdir(file_path)) # False
print(os.path.isdir(dir_path)) # True
# os.path.dirname():父目錄/上一級目錄
print(os.path.dirname(dir_path)) # C:\Users\75171\Desktop\Python2004\day11
# os.path.basename():文件名
print(os.path.basename(file_path)) # os.py
3.自定義模塊【掌握】
3.1自定義import模塊
#1.格式:import 包1.包2.模塊的名稱
#注意1:通過點(diǎn)語法區(qū)分包的層級關(guān)系
#引入模塊
#注意2:如果要同時導(dǎo)入多個模塊,有兩種方式
#方式一
"""
import os
import datetime
import math
"""
#方式二
import os,math,datetime
#注意3:當(dāng)導(dǎo)入自定義模塊的時候,需要注意包的存在
#注意5:當(dāng)通過import將模塊導(dǎo)入的時候,將模塊對應(yīng)的文件整個加載了一遍
import ccc.module
import moduleTextDemo01
print("***************")
#注意4:當(dāng)模塊有包的層級關(guān)系時,需要調(diào)用其中函數(shù)的時候,需要指明函數(shù)的路徑
ccc.module.test() #os.path.isdir()
moduleTextDemo01.fun1()
moduleTextDemo01.fun2()
moduleTextDemo01.fun3()
print(moduleTextDemo01.num)
3.2自定義from-import模塊
#form 模塊名 import 函數(shù)名1/類名,函數(shù)名2.。。。
#import moduleTextDemo01
from moduleTextDemo01 import fun1,fun2,fun3
#注意:采用了form。。。import的方式導(dǎo)入指定的函數(shù)之后,可以直接調(diào)用函數(shù)
fun1() 鄭州去胎記醫(yī)院 http://www.zykdbhk.com/
fun2()
fun3()
#好處:進(jìn)行局部的導(dǎo)入,避免內(nèi)存空間的浪費(fèi)
#注意:當(dāng)前文件中如果存在和模塊中同名的函數(shù)的時候,當(dāng)前文件中的函數(shù)仍然會將模塊中的函數(shù)給覆蓋掉
def fun1():
print("hello")
fun1()
3.3自定義from-import*模塊
#from 。。。。 import * *代表全部
"""
下面三種導(dǎo)入方式完全等價:將moduleTextDemo01模塊中的所有的內(nèi)容全部導(dǎo)入
from moduleTextDemo01 import *
import moduleTextDemo01
from moduleTextDemo01 import fun1,fun2,fun3
"""
from moduleTextDemo01 import *
fun1()
總結(jié):在python中,每個py文件其實都是一個模塊,如果跨模塊調(diào)用函數(shù),則采用導(dǎo)入的方式
將不同的功能進(jìn)行劃分,調(diào)用函數(shù)的時候相對比較方便的
4.__name__屬性和dir函數(shù)
__name__的作用:如果不想讓模塊中的某些代碼執(zhí)行,可以通過屬性僅僅調(diào)用程序中的一部分功能
【寫在if判斷中的代碼只有當(dāng)前模塊被執(zhí)行的時候才會被執(zhí)行,檢測到是其他的文件在使用當(dāng)前的模塊,則if語句中的代碼不會被執(zhí)行】
def fun1():
print("aaa")
def fun2():
print("bbb")
def fun3():
print("ccc")
#作用:寫在下面判斷中的代碼,只有當(dāng)前模塊運(yùn)行的時候才會被執(zhí)行【起到屏蔽的作用】,其他文件想import此文件,以下函數(shù)不會被執(zhí)行
if __name__ == "__main__":
fun1()
fun2()
fun3()
dir:獲取指定模塊里面的所有的內(nèi)容
dir(模塊名稱) 返回的是一個列表
print(dir(math))
print(dir(moduleTextDemo01))