python模塊之os_sys_動態導入_包
阿新 • • 發佈:2018-12-25
代碼 pen python3 遞歸 被調用 cal false each gis
#!/usr/bin/env python # coding:utf-8 import os print(os.getcwd()) #獲取當前工作目錄,即當前python腳本工作的目錄路徑 # os.chdir("dirname") #改變當前腳本工作目錄;相當於shell下cd print(os.curdir) # 返回當前目錄: (‘.‘) 所以一個點也是代表當前目錄的意思 print(os.pardir) # 獲取當前目錄的父目錄字符串名:(‘..‘) # print(os.makedirs(‘dirname1/dirname2‘)) # 可生成多層遞歸目錄 # print(os.removedirs(‘dirname1/dirname2‘)) # 若目錄為空,則刪除,並遞歸到上一級目錄,如若也為空,則刪除,依此類推 # os.mkdir(‘dirname‘) 生成單級目錄;相當於shell中mkdir dirname # os.rmdir(‘dirname‘) 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname print(os.listdir(‘./web‘)) # 列出指定目錄下的所有文件和子目錄,包括隱藏文件,並以列表方式打印 不會遞歸 # 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 獲取系統環境變量 # os.path.abspath(path) 返回path規範化的絕對路徑 # os.path.split(path) 將path分割成目錄和文件名二元組返回 a = os.path.dirname(r"D:\Python3\14 module\os_test.py") b = os.path.basename("D:/Python3/14 module/os_test.py") print(a) # 返回path的目錄。其實就是os.path.split(path)的第一個元素 print(b) #返回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[, ...]]) 將多個路徑組合後返回,第一個絕對路徑之前的參數將被忽略 c = os.path.join(a,b) # 路徑拼接會自動在裏面加上反斜杠 print(‘----------->‘,c) # os.path.getatime(path) 返回path所指向的文件或者目錄的最後存取時間 # os.path.getmtime(path) 返回path所指向的文件或者目錄的最後修改時間 if __name__ == "__main__": print(os.path.getmtime(__file__)) print(__file__)
os小例子:
#!/usr/bin/env python # coding:utf-8 import os import os.path """獲取指定目錄及其子目錄下的 py 文件路徑。說明:lis 用於存儲找到的 py 文件路徑。 get_py 函數,遞歸查找並存儲 py 文件路徑到 lis 中 """ lis = [] def get_py(path,lis): fileList = os.listdir(path) #獲取path目錄下文件 for filename in fileList: pathTmp = os.path.join(path,filename) #獲取path與filename組合後的路徑 if os.path.isdir(pathTmp): #如果是目錄 get_py(pathTmp,lis) #則遞歸查找 elif filename[-3:].upper()==‘.PY‘: #不是目錄,則比較後綴名 lis.append(pathTmp) path = input(‘請輸入路徑:‘).strip() get_py(path,lis) print(‘在%s目錄及其子目錄下找到%d個py文件\n分別為:\n‘%(path,len(lis))) for filepath in lis: print(filepath+‘\n‘)
os小例子:查找某些文件
#!/usr/bin/env python # coding:utf-8 import os ## 查找某些文件 def search_file(start_dir, target): os.chdir(start_dir) for each_file in os.listdir(os.curdir): ext = os.path.splitext(each_file)[1] if ext in target: vedio_list.append(os.getcwd() + os.sep + each_file + os.linesep) if os.path.isdir(each_file): search_file(each_file, target) # 遞歸調用 os.chdir(os.pardir) # 遞歸調用後切記返回上一層目錄 start_dir = input(‘請輸入待查找的初始目錄:‘) program_dir = os.getcwd() target = [‘.mp4‘, ‘.avi‘, ‘.rmvb‘] # 指定文件類型 vedio_list = [] search_file(start_dir, target) f = open(program_dir + os.sep + ‘vedioList.txt‘, ‘w‘) f.writelines(vedio_list) f.close()
sys 模塊
#!/usr/bin/env python # coding:utf-8 import sys print(sys.argv) # 使用命令行運行此腳本時可接受傳入參數 例如: python3 sys_test.py abc ddd fff # cmd = sys.argv[1] # path = sys.argv[2] # # if cmd =="post": # pass # elif cmd =="get": # pass import time # 簡單模擬進度條 for i in range(100): sys.stdout.write("#") time.sleep(0.1) sys.stdout.flush() ## 更多參考: http://www.cnblogs.com/cherishry/p/5725184.html
一個模塊導入時路徑的問題:
當前目錄有bin.py文件和my_mod文件夾,my_mod文件夾下有ma.py和cal.py文件。
而os和sys正好用來解決my_mod/ma.py導入cal模塊, 以及被bin.py導入的路徑問題
#!/usr/bin/env python # coding:utf-8 # cal.py # print(‘before...‘) def add(x,y): return x+y def sub(x,y): return x-y # print(‘end....‘) if __name__ == "__main__": # 用於本文件的調試 print(‘testing....‘) print(__name__) # 被調用時將打印出文件名(模塊名)
#!/usr/bin/env python # coding:utf-8 # ma.py # import cal # 直接執行本文件時,用此方式導入 # from my_mod import cal # 被上一級調用時,用此方式導入。 import sys,os BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) print(BASE_DIR) print(os.path.abspath(__file__)) # 本文件的絕對路徑 # 加入項目所在路徑, 同時解決本身的運行和被調用時的路徑問題。 sys.path.append(BASE_DIR) from my_mod import cal def run(): print(cal.add(7,5)) run()
#!/usr/bin/env python # coding:utf-8 # bin.py from my_mod import ma # ma.run() ## 模塊的種類 : # 1. 內置模塊 # 2. 第三方模塊 # 3. 自定義模塊 ### 包 和 文件夾 的區別: 是否有 __init__.py 文件 if __name__ =="__main__": # 假設將當前腳本作為主函數,僅可執行,不允許被調用。 可以避免反復調用帶來的坑 ma.run()
動態導入模塊: 參考: https://www.cnblogs.com/zy6103/p/6943557.html
#!/usr/bin/env python # coding:utf-8 # 動態導入的方法: # mt = __import__(‘m1.t‘) # 只能導入最頂級模塊 點後面的不會被導入 # print(mt) # m1.t.test1() # # from m1.t import test1,_test2 # # test1() # _test2() import importlib m = importlib.import_module(‘m1.t‘) # 動態導入就是基於反射的 print(m) m.test1() m.test2() ‘‘‘ 動態導入模塊方法1: __import__ 說明: 1. 函數功能用於動態的導入模塊,主要用於反射或者延遲加載模塊。 2. __import__(module)相當於import module 舉例說明: 首先創建一個模塊目錄lib,然後在目錄內創建一個模塊為:aa.py 模塊代碼為: class c(object): def __str__(self): return ‘C language‘ 在lib目錄平級新建一個測試的模塊,使用 __import__ 動態以字符串形式導入lib下的aa模塊。 lib = __import__(‘lib.aa‘) # 相當於import lib c = lib.aa.c() print(c) 動態導入模塊方法2:import importlib 實例還是上面的lib.aa模塊,這裏使用importlib進行動態導入(這個方法好理解,也是官方建議使用的) import importlib aa = importlib.import_module(‘lib.aa‘) c = aa.c() print(c) ‘‘‘
如果自定義的模塊中有寫 __all__ = [‘read‘,‘read2‘] # 此方法的列表中只和 import * 有關系
被導入後則只能使用 列表中列出的內容。
包: 類似於文件夾,例如 當前項目day20 下有 glance目錄,下面又有 api, cmd, db 三個子目錄,
import glance glance.db.models.register_models(‘mysql‘) glance.api.policy.get() glance.cmd.manage.ma()
想要使用glance 下面子目錄中的模塊,則需要每級目錄下面的 __init__.py 有相應的導入動作. 這樣,整個glance包內的模塊都可以使用了。
第三方軟件安裝:
1. pip包管理器
2. 源碼安裝: 下載,解壓, 執行python setup.py build 編譯, 執行 python setup.py install 安裝
python模塊之os_sys_動態導入_包