#!/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 安裝

