一,複習 二,今日內容 三,sys模塊 四,calendar 模塊 五,time 模塊 六,datetime 模塊 七,os 模塊 八,os.path 模塊 九,os案例 : 十,項目開發分析: ...
''' 1.跨文件夾導包 - 不用考慮包的情況下直接導入文件夾(包)下的具體模塊 2.__name__: py自執行 '__main__' | py被導入執行 '模塊名' 3.包:一系列模塊的集合體,通過包內的__init__文件來管理包中所有模塊提供給外界的名字 -- 存放所以模塊的文件夾名就是包名 4.導包三件事: 1)編譯__init__文件的pyc 2)執行__init__文件形成全局名稱空間,作為包的全局名稱空間,包能直接使用的名字全部是__init__文件中提供的 3)在導包文件中形成一個名字指向包的名稱空間 5.包的管理:通過__init__文件來管理,在包中使用相對導入 . 代表當前文件所在目錄 .. 代表當前文件所在目錄的上一級目錄 # .開頭的導包語法,from .開頭 import 名字,只能存活在包內 '''
''' 1.時間模塊 2.系統模塊 3.項目開發目錄規範 4.loggin 5.json
"""
sys是system的縮寫,表示系統,但是要註意
sys指的是解釋器自身,而非操作系統
所以該模塊主要是處理與解釋器相關的操作的
sys.argv 命令行參數List,第一個元素是程式本身路徑
sys.exit(n) 退出程式,正常退出時exit(0)
sys.version 獲取Python解釋程式的版本信息
sys.maxint 最大的Int值
sys.path 返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變數的值
sys.platform 返回操作系統平臺名稱
"""""
其中提供了有一個argv屬性用於接收從控制台傳入的參數,當你要開發一款命令行程式時,該屬性非常重要 案例:開發一款命令行界面的文件複製工具 思路:第一個參數是當前執行文件本身,第二個參數用於接收源文件,第三個參數用於接收目標文件 import sys source_path = sys.argv[1] target_path = sys.argv[2] print(source_path) print(target_path) with open(source_path, "rb") as f1: with open(target_path, "wb") as f2: while True: data = f1.read(1024) if not data: break f2.write(data)
""" 判斷閏年:calendar.isleap(year) 能被4整除但不能被100整除的年份為普通閏年 查看某年某月日曆:calendar.month(year, mouth) 查看某年某月起始星期與當月天數:calendar.monthrange(year, mouth) 查看某年某月某日是星期幾:calendar.weekday(year, month, day) """"" import calendar print(calendar.isleap(2020)) #True print(calendar.month(2019,6)) #日曆表 print(calendar.monthrange(2019,6)) #(5, 30) print(calendar.weekday(2019,5,7)) #1
""" 時間戳(timestamp):time.time() 延遲線程的運行:time.sleep(secs) (指定時間戳下的)當前時區時間:time.localtime([secs]) (指定時間戳下的)格林威治時間:time.gmtime([secs]) (指定時間元組下的)格式化時間:time.strftime(fmt[,tupletime]) """ import time '''時間戳''' # print(time.time()) #1557212208.8409944 '''延遲線程的運行''' time.sleep(3) print('結束了') '''# 自定義睡覺''' old_time = time.time() while time.time() - old_time <= 3: pass print(time.time()) print('醒了') '''當前時區時間''' print(time.localtime()) #time.struct_time(tm_year=2019, tm_mon=5, tm_mday=7, tm_hour=14, tm_min=59, tm_sec=32, tm_wday=1, tm_yday=127, tm_isdst=0) time_old = time.localtime() print(time_old) print(time_old.tm_year) #2019 '''格林威治時間''' print(time.gmtime()) #time.struct_time(tm_year=2019, tm_mon=5, tm_mday=7, tm_hour=10, tm_min=44, tm_sec=56, tm_wday=1, tm_yday=127, tm_isdst=0) time_obj2 = time.gmtime() print(time_obj2) print(time_obj2.tm_hour) #10 print(time_obj2.tm_wday) #1 星期從周一開始計算,周一為數字0 print(time.localtime(1557302208)) #將時間戳轉化成時間對象 print(time.gmtime(1557012208)) #time.struct_time(tm_year=2019, tm_mon=5, tm_mday=4, tm_hour=23, tm_min=23, tm_sec=28, tm_wday=5, tm_yday=124, tm_isdst=0) '''格式化時間''' res = time.strftime('%Y-%m-%d') #2019-05-07 print(res) res = time.strftime("%Y-%m-%d %H:%M:%S", (2008, 8, 8, 8, 8, 8, 0, 0, 0)) print(res)
""" 當前時間:datetime.datetime.now() 昨天:datetime.datetime.now() + datetime.timedelta(days=-1) 修改時間:datetime_obj.replace([...]) 格式化時間戳:datetime.date.fromtimestamp(timestamp) """"" import datetime print(datetime.datetime.year) now_time = datetime.datetime.now() print(now_time) # 2019-05-07 19:17:33.200227 當前時間 res = str(now_time) print(res[:-7]) # 2019-05-07 19:19:03 時間截取 # 7天的時間對象 days = datetime.timedelta(days=7) print(days, type(days)) # 7 days, 0:00:00 <class 'datetime.timedelta'> # 免登陸時間運算|會員過期時間 time_obj = now_time + days # 當前時間 + 7天 print(time_obj, type(time_obj)) # 2019-05-14 19:23:26.698641 <class 'datetime.datetime'> now_time_obj = time_obj.replace(year=2000, day=1, second=0) print(now_time_obj) #2000-05-01 19:25:00.294593 print(datetime.date.fromtimestamp(1557094560)) #2019-05-06 print('=========') print(datetime.datetime.now() + datetime.timedelta(days=-1)) #昨天 2019-05-06 22:10:01.758706 print(datetime.datetime.now() - datetime.timedelta(days=-1)) #明天 2019-05-08 22:10:01.758706
'''
os翻譯過來就是操作系統,os模塊提供了與操作系統打交道需要用到的函數,
那我們什麼時候需要與操作系統打交道呢?
在操作系統中,我們最最常用的操作就是,對文件及文件夾的操作, 所以 當你需要操作文件時,就應該想到os模塊了
os提供一下函數:
os.getcwd() 獲取當前工作目錄,即當前python腳本工作的目錄路徑
os.chdir("dirname") 改變當前腳本工作目錄;相當於shell下cd
os.curdir 返回當前目錄: ('.')
os.pardir 獲取當前目錄的父目錄字元串名:('..')
os.makedirs('dirname1/dirname2') 可生成多層遞歸目錄
os.removedirs('dirname1') 若目錄為空,則刪除,並遞歸到上一級目錄,如若也為空,則刪除,依此類推
os.mkdir('dirname') 生成單級目錄;相當於shell中mkdir dirname
os.rmdir('dirname') 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname
os.listdir('dirname') 列出指定目錄下的所有文件和子目錄,包括隱藏文件,並以列表方式列印
os.remove() 刪除一個文件
os.rename("oldname","newname") 重命名文件/目錄
os.stat('path/filename') 獲取文件/目錄信息
os.sep 輸出操作系統特定的路徑分隔符,win下為"\\",Linux下為"/"
os.linesep 輸出當前平臺使用的行終止符,win下為"\t\n",Linux下為"\n"
os.pathsep 輸出用於分割文件路徑的字元串 win下為;,Linux下為:
os.name 輸出字元串指示當前使用平臺。win->'nt'; Linux->'posix'
os.system("bash command") 運行shell命令,直接顯示
os.environ 獲取系統環境變數
''''' import os print(os.sep) #\ print(os.linesep) print(os.name) #nt print(os.pathsep) #; print(os.environ) os.mkdir('abc') #在當前文件所在路徑下創建abc文件夾,如果文件存在會報錯 os.mkdir('D:\\abc') #就是在指定的絕對路徑下創建abc文件夾 os.mkdir('a/b/c') #a,b必須提前存在,c不能存在 os.makedirs(r'a\b\c') #a,b存在與否都可以,c不能存在 os.rename('abc','aaa') #修改文件名 print(os.getcwd()) #獲取工作目錄 D:\Python_Project\ClassRoom\day18 os.rmdir('aaa') #刪除單層空文件 os.removedirs('a/b/c') #刪除多層空文件 os.remove('aa/1.py') #刪除指定文件 print(os.listdir('D:\Python_Project\ClassRoom\day18')) #輸入當前目錄下的目錄 ['a', 'abc', 'calendar模塊.py', 'datetime模塊.py', 'os模塊.py', 'part5', 'sys模塊.py', 'time模塊.py']
"""
該模塊用於處理路徑,我們知道python是一門跨平臺的語言,二每種操作系統,文件路徑是截然不同的,為了使程式可以在不同平臺生正確運行,
python提供了該模塊,使用該模塊可以實現路徑在不同品臺下的自動轉換,從而實現跨平臺
今後只要涉及到文件或文件夾路徑,就應該使用該模塊
提供的函數:
os.path.abspath(path) 返回path規範化的絕對路徑
os.path.split(path) 將path分割成目錄和文件名二元組返回
os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素
os.path.basename(path) 返回path最後的文件名。如何path以/或\結尾,那麼就會返回空值。即os.path.split(path)的第二個元素
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是絕對路徑,返回True
os.path.isfile(path) 如果path是一個存在的文件,返回True。否則返回False
os.path.isdir(path) 如果path是一個存在的目錄,則返回True。否則返回False
os.path.join(path1[, path2[, ...]]) 將多個路徑組合後返回,第一個絕對路徑之前的參數將被忽略
os.path.getatime(path) 返回path所指向的文件或者目錄的最後存取時間
os.path.getmtime(path) 返回path所指向的文件或者目錄的最後修改時間
os.path.getsize(path) 返回path的大小
"""""
import os print(__file__) #當前執行文件路徑 D:/Python_Project/ClassRoom/day18/os_path模塊.py res = os.path.abspath('D://Python_Project/\ClassRoom/day18//os_path模塊.py') #規範化 print(res) res = os.path.split('D:/Python_Project/ClassRoom/day18/os_path模塊.py') print(res,res[1]) #('D:/Python_Project/ClassRoom/day18', 'os_path模塊.py') os_path模塊.py print(r'D:\Python_Project\ClassRoom\day18\os_path模塊.py'.rsplit(os.sep ,1 )) #['D:\\Python_Project\\ClassRoom\\day18', 'os_path模塊.py'] print(__file__) print(os.path.dirname(__file__)) print(os.path.dirname(os.path.dirname(__file__))) BASE_DIR = os.path.dirname(os.path.dirname(__file__)) print(BASE_DIR) #該項目根目錄是在執行時,自動獲取到當前項目根目錄的絕對路徑
#案例:項目根目錄的應用場景 import sys sys.path.append(BASE_DIR) #所有導包\導模塊都依賴BASE_DIR print(sys.path) from part3.abc import new print(new) #<module 'part5.abc.new' from 'D:/Python_Project/ClassRoom\\part5\\abc\\new.py'> from part5.x import y print(y.x) from part5 import mm print(mm.mmmm) from mm import mmmm print(mmmm)
part1_path = os.path.join(BASE_DIR,'part1') #BASE_DIR + os.sep + 'part1' sys.path.append(part1_path) part3_path = os.path.join(BASE_DIR,'part3') sys.path.append(part3_path) print(sys.path) #最後一級名稱 print(os.path.basename('D:/Python_Project/ClassRoom/day18/os_path模塊.py')) #os_path模塊.py #路勁拼接: new_path = os.path.join(BASE_DIR,'part3','abc','new.py') print(new_path) #D:/Python_Project/ClassRoom\part3\abc\new.py """ 指定路徑是否存在:os.path.exists(path) 是否是絕對路徑:os.path.isabs(path) 是否是文件:os.path.isfile(path) 是否是路徑:os.path.isdir(path) """
print(os.path.exists(new_path)) #是否存在 print(os.path.isabs(new_path)) #是否絕對路徑 print(os.path.exists('abc')) print(os.path.isabs('abc')) print(os.path.isfile(new_path)) #是否是文件 print(os.path.isdir(new_path)) #是否是路徑 print(os.path.isfile('abc')) print(os.path.isdir('abc')) print(__file__) file_path = 'D:/Python_Project/ClassRoom/day18/os_path模塊.py' print(os.path.getctime(file_path)) print(os.path.getatime(file_path)) #最後存儲時間 print(os.path.getmtime(file_path)) #最後修改時間 ''' 1557230709.9831052 1557233680.8510375 #修改了文件會進行更新 1557233680.8540661 ''' print(os.path.normcase('D:/Python_Project/\ClassRoom/day18/os_path模塊.py')) #d:\python_project\\classroom\day18\os_path模塊.py print(os.path.normpath('D:/Python_Project/ClassRoom/day18/..')) #D:\Python_Project\ClassRoom
'''將part5下的mm.py移動到part6下abc文件中'''
import os import sys BASE_DIR = os.path.dirname(os.path.dirname(__file__)) sys.path.append(BASE_DIR) def move_file(file,folder): #如果文件不存在或不是文件文件 if not (os.path.exists(file) and os.path.isfile(file)): print('文件不存在或不是文件') return False #如果文件不存在則創建文件 if not os.path.exists(folder): os.makedirs(folder) #提取part5中的mm.py文件 file_name = os.path.split(file)[1] #第二種方式提取 file_name = os.path.basename(file) print(file_name) #mm.py #將提取出來的mm.py文件添加到part6\abc中 new_file = os.path.join(folder,file_name) print(new_file) #D:/Python_Project/ClassRoom\part6\abc\mm.py #打開文件提取內容 with open(file,'rb')as r,open(new_file,'wb')as w: for line in r: w.write(line) #將part5中的mm.py 刪除 os.remove(file) file = os.path.join(BASE_DIR,'part5','mm.py') print(file) #D:/Python_Project/ClassRoom\part5\mm.py folder = os.path.join(BASE_DIR,'part6','abc') print(folder) #D:/Python_Project/ClassRoom\part6\abc # move_file(file,folder)
'''遞歸刪除的思路''' def delete_dir(folder): for path in os.listdir(folder): # 如果path是文件夾 delete_dir(path) # 如果是文件os.remove(path) pass # for走完了代表folder內部刪空了,可以刪folder
'''#遍歷列印目標路徑中所有的txt文件''' def print_txt(folder): #判斷文件是否存在,是否是文件 if not (os.path.exists(folder) or os.path.isfile(folder)): print('文件不存在或不是文件') return #迴圈遍歷文件下的目錄 for path in os.listdir(folder): #將文件名迴圈出來添加到D:/Python_Project/ClassRoom\part6後面 file_path = os.path.join(folder,path) print(file_path) #D:/Python_Project/ClassRoom\part6\a\b #如果是文件並且以.txt結尾的,就輸出 if os.path.isfile(file_path) and file_path.endswith('.txt'): print(path) #如果是文件繼續迴圈 elif os.path.isdir(file_path): print_txt(file_path) #遞歸調用自己 target_path = os.path.join(BASE_DIR,'part6') # print(target_path) #D:/Python_Project/ClassRoom\part6 print_txt(target_path)
''' 1.調研 2.需求分析 3.架構師完成項目demo,完成項目架構 4.分工 5.寫代碼 6.白盒黑盒測試 7.項目審核發佈 => 項目 -> 產品 ''' ''' bin: 可執行文件,入口,入口也可以放在項目根目錄下 core: 核心代碼 db:資料庫相關文件 interface:介面 lib:包、模塊、第三方文件夾 log:日誌 setting:配置 static:靜態文件 '''