­

day19:os模塊&shutil模塊&tarfile模塊

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)