天天看點

子產品和檔案

一、子產品

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))