day19:os模塊&shutil模塊&tarfile模塊
- 2020 年 7 月 29 日
- 筆記
- Python全棧31期-筆記
os模塊:對系統進行操作(6+3)
system popen listdir getcwd chdir environ / name sep linesep
import os #### os模塊方法 #### # 1.system 在python中執行系統命令 os.system("ifconfig") os.system("touch 1.txt") # 2.popen 執行系統命令返回對象 # 可以通過read方法讀出字符串,防止字符串亂碼,使用popen進行操作 obj = os.popen("ifconfig") res = obj.read() print(res) # 3.listdir 獲取指定文件夾中的所有內容的名稱列表 lst = os.listdir(".") # . 當前目錄 lst = os.listdir("..") # . 上一級目錄 lst = os.listdir("/home/libolun") print(lst) # 4.getcwd 獲取當前文件所在的默認路徑(單純的路徑) res = os.getcwd() print(res) # /mnt/hgfs/python31_gx/day19 # 路徑+文件 print(__file__) # /mnt/hgfs/python31_gx/day19/1.py # 5.chdir 修改當前文件工作的默認路徑 os.chdir("/home/libolun/mywork") os.system("mkdir ceshi100") # 6.environ 獲取或修改環境變量 print(os.environ) # 獲取所有環境變量 print(os.environ["path"]) os.environ["path"] += ":/home/libolun/mywork" # 修改環境變量 os.system("libolun") #### os模塊屬性 #### # 1.name 獲取系統標識 # linux,mac->posix windows->nt print(os.name) # 2.sep 獲取路徑分割符號 # linux,mac-> / windows-> \ print(os.sep) # 3.linesep 獲取系統的換行符號 # linux,max-> \n windows->\r\n或\n print(repr(os.linesep))
os模塊:新建和刪除(7)
mknod remove mkdir rmdir rename makedirs removedirs
#### os 負責新建和刪除 #### # 1 os.mknod 創建文件 os.mknod("1.txt") # 2.os.remove 刪除文件 os.remove("1.txt") # 3.os.mkdir 創建文件夾 os.mkdir("ceshi100") # 4.os.rmdir 刪除文件夾 os.rmdir("ceshi100") # 5.os.rename 對文件/文件夾重命名 os.rename("111.txt","123.py") # 6.os.makedirs 遞歸創建文件夾 os.makedirs("a/b/c/d/e") # 7.os.removedirs 遞歸刪除文件夾(空文件夾) os.removedirs("a/b/c/d/e")
shutil:負責複製和移動(6+2+1)
copyfileobj copyfile copymode copystat copy copy2 copytree rmtree remove
# 1.copyfileobj(fsrc,fdst,[,length=16*1024]) 單純複製文件的內容 # 需要手動創建文件對象 fp1 = open("123.py",mode='r',encoding="utf-8") fp2 = open("lianxi111.php",mode="w",encoding="utf-8") shutil.copyfileobj(fp1,fp2) # 2.copyfile(src,dst) 單純的僅複製文件內容 # 在底層調用了copyfileobj shutil.copyfile("1.php","2.js") # 3.copymode(src,dst) 單純的複製權限,不包括文件內容 shutil.copymode("1.php","2.js") # 4.copystat(src,dst) 複製文件所有狀態信息,不包括內容 # 狀態信息:包括權限、組、用戶、修改時間 shutil.copystat("1.py","2.php") # 5.copy(src,dst) 複製文件的權限和內容 shutil.copy("1.py","2.html") # 6.copy2(src,dst) 複製文件權限和內容,還有組,時間,用戶等 shutil.copy2("1.py","2.html") # 7.copytree(src,dst) 複製文件夾里的所有內容(遞歸拷貝) shutil.copytree("lianxi001","lianxi002") # 8.rmtree(path) 刪除當前文件夾以及文件夾中的所有內容(遞歸刪除) shutil.rmtree("lianxi001") # 9.move(path1,path2) 移動文件或者文件夾 shutil.move("1.php","..") shutil.move("lianxi001","../lianxi007") # 移動並改名
os.path:路徑模塊(6+3+3+3)
basename dirname split join splitext getsize isdir isfile islink getctime getatime getmtime exists isabs abspath
# 1.basename 返迴文件名部分 strvar = "/home/libolun/mywork/1.py" res = os.path.basename(strvar) print(res) # 1.py # 2.dirname 返迴路徑部分 res = os.path.dirname(strvar) print(res) # /home/libolun/mywork # 3.split 將路徑拆分為單獨的文件部分和路徑部分,並組合成一個元組 tup = os.path.split(strvar) print(tup) # 4.join 將多個路徑和文件組成新的路徑 # 可以自動通過不同的系統加不同的斜杠 path1 = "ceshi1" path2 = "libolun" path3 = "2.py" # pathvar = path1 + os.sep + path2 + os.sep + path3 pathvar = os.path.join(path1,path2,path3) print(pathvar) # 5.splitext 將路徑分割為後綴和其他部分 res = os.path.splitext(strvar) print(res) # ('/home/libolun/mywork/1','.py') # 6.getsize 獲取文件的大小 res = os.path.getsize("1.py") # 文件夾不能計算 res = os.path.getsize("os") print(res) # 7.isdir 檢測路徑是否是一個文件夾 strvar = "/home/libolun/mywork/libolun" res = os.path.isdir(strvar) print(res) # 8.isfile 檢測路徑是否是一個文件 strvar = "/home/libolun/mywork/libolun" res = os.path.isfile(strvar) print(res) # 9.islink 檢測路徑是否是一個鏈接 strvar = "/home/libolun/mywork/libolun" res = os.path.islink(strvar) print(res) # 10.getctime [windows]文件的創建時間 [linux]權限的改動時間 # 返回的是時間戳 res = os.path.getctime("1.py") # 11.getmtime 獲取文件最後一次修改時間 res = os.path.getmtime("1.py") # 12.getatime 獲取文件最後一次訪問時間 res = os.path.getatime("1.py") # 13.exists 檢測指定的路徑是否存在 strvar = "/home/libolun/mywork/libolun" res = os.path.exists(strvar) print(res) # 14.isabs 檢測一個路徑是否是絕對路徑 pathvar = "." res = os.path.isabs(pathvar) print(res) # 15.abspath 將相對路徑轉化為絕對路徑 pathnew = os.path.abspath(pathvar) print(pathnew) # 檢測是否是絕對路徑,如果不是,將其轉化為絕對路徑 if not os.path.abspath(pathvar): pathnew = os.path.abspath(pathvar) print(pathnew)
tarfile:壓縮模塊(4)
壓縮 解壓 追加 查看
# 1.創建tar包 '''最小的壓縮包,後綴格式為bz2''' # 單純的tar包 tf = tarfile.open("ceshi001.tar",'w',encoding="utf-8") tf.add("bin/echo","echo") tf.add("bin/ed","ed") tf.add("bin/fuser","/tmp/fuser") tf.close() tf = tarfile.open("ceshi002.tar.gz",'w:gz',encoding="utf-8") tf.add("bin/echo","echo") tf.add("bin/ed","ed") tf.add("bin/fuser","/tmp/fuser") tf.close() tf = tarfile.open("ceshi003.tar.bz2",'w:bz2',encoding="utf-8") tf.add("bin/echo","echo") tf.add("bin/ed","ed") tf.add("bin/fuser","/tmp/fuser") tf.close() # 2.對壓縮包進行解壓 tf = tarfile.open("ceshi003.tar.bz2",'r',encoding="utf-8") # 解壓單個 tf.extract("echo","ceshi004") # 解壓所有 tf.extractall("ceshi005") # 3.追加文件 # 支持with語法 # 只能為沒有壓縮過的tar包進行追加 with tarfile.open("ceshi001.tar",'a',encoding="utf-8") as tf: tf.add("/bin/cp","cp") # 4.查看壓縮包中的文件 with tarfile.open("ceshi002.tar.gz",'a',encoding="utf-8") as tf: lst = tf.getnames() print(lst)
思考題:計算一個文件夾的大小
import os pathvar = "/mnt/hgfs/python31_gx/day19/ceshi100" # 遞歸計算文件夾的大小 def getallsize(pathvar): size = 0 # 獲取當前文件夾中所有內容 lst = os.listdir(pathvar) # 循環列表 for i in lst: # 拼接完整路徑 pathnew = os.path.join(pathvar,i) # 判斷是否是文件或者文件夾 if os.path.isfile(pathnew): size += os.path.getsize(pathnew) elif os.path.isdir(pathnew): # 如果是文件夾,繼續調用函數. size += getallsize(pathnew) # 返回最後的結果 return size res = getallsize(pathvar) print(res)
思考題:如何處理tarfile不能再已經壓縮過的保重追加內容的問題
import os path = os.getcwd() # 找到要解壓的包的路徑 pathvar1 = os.path.join(path,"ceshi0729_3.tar.bz2") # 解壓到哪裡去 pathvar2 = os.path.join(path,"ceshi0729_3") # (1) 先對已經壓縮過的包進行解壓 with tarfile.open(pathvar1,"r",encoding="utf-8") as tf: tf.extractall(pathvar2) # (2) 往這個解壓的文件夾中添加新的文件 mybin = "cp -a /bin/fgrep " + pathvar2 # print(mybin) # cp -a /bin/fgrep /mnt/hgfs/python31_gx/day19/ceshi0729_3 os.system(mybin) # (3) 對這個文件進行過濾篩選,重新打包壓縮 (不要echo) lst = os.listdir(pathvar2) with tarfile.open(pathvar1,"w:bz2",encoding="utf-8") as tf: for i in lst: if i != "echo": # 拼接完整路徑 pathnew = os.path.join(pathvar2,i) # add(路徑,別名) tf.add(pathnew,i)