Python學習【第十四篇】shutil模組

淺洛帆發表於2018-04-24

一、概述

我們通過python操作檔案時,除正常讀寫操作外,有時還需要進行拷貝、刪除、打包等操作,雖然os模組提供了部分功能,但還是不夠完善,這裡要講講專業的高階的檔案,資料夾,壓縮包處理模組shutil了。

二、shutil模組常見用法

  • shutil.copyfileobj(fsrc, fdst,length)
    將原始檔內容拷貝到目標檔案中,因此涉及到檔案的讀寫操作。查閱資料顯示可以拷貝部分檔案內容,具體用法不詳,再具體研究。
import shutil
with open('readme.md', 'r', encoding = 'utf-8') as f1, \
    open('a.cc', 'w', encoding = 'utf-8') as f2:
    shutil.copyfileobj(f1, f2)
  • shutil.copyfile(src, dst)
    拷貝檔案物件,但不包括許可權。
shutil.copyfile('./1.txt','./2.txt')
shutil.copyfile('./1.txt', '../2.txt')
  • shutil.copy(src, dst)
    拷貝檔案,包括檔案的許可權(但不包括所有者屬性)。
>>> import os,shutil
>>> os.chdir('/root/temp')
>>> shutil.copy('./test.py', './2.py')
>>> quit()
  • shutil.copymode(src,dst)
    僅僅拷貝檔案的許可權,前提是dst檔案存在,不然會報錯,測試程式碼如下。
>>> import os,shutil
>>> os.chdir("/home/admin")
>>> shutil.copymode('src_file','dst_file')
>>> quit()

可通過ls -ltr檢視。

  • shutil.copystat(src,dst)
    拷貝檔案的屬性狀態資訊,如許可權,各種時間,bit,flag等,但不包括所有者和所屬組。
>>> import os,shutil
>>> os.chdir('/root/temp')
>>> os.stat('test.py')
>>> os.stat('2.py')
>>> shutil.copystat('test.py','2.py')
>>> quit()
  • shutil.copy2(src,dst)
    拷貝檔案和檔案的屬性狀態,目前來看等同於cp -a或cp -p。
>>> import os,shutil
>>> os.chdir('/root/temp')
>>> shutil.copy2('2.py','3.py')
>>> quit()
  • shutil.copytree(src,dst)
    遞迴拷貝檔案,相當於cp -r。
>>> import os,shutil
>>> os.chdir('/root/temp')
>>> shutil.copytree('01','02')
>>> quit()
  • shutil.rmtree(path[, ignore_errors[, onerror]])
    遞迴刪除檔案,相當於rm -rf。
>>> import os,shutil
>>> os.chdir('/root/temp')
>>> shutil.rmtree('02')
>>> quit()
  • shutil.move(src,dst)
    移動檔案,如果是路徑則遞迴移動,相當於mv。
>>> import os,shutil
>>> os.chdir('/root/temp')
>>> shutil.move('dns.zip','02')
>>> shutil.move('01','02')
>>> quit()

三、shutil模組常見用法

1. shutil.make_archive((base_name, format, root_dir=None,base_dir=None,verbose=0,dry=0,owner=None,group=None,logger=None)

功能:建立壓縮包並且返回檔案路徑,例如:zip,tar。

base_name : 壓縮包的檔名,也可以是壓縮包的路徑,或者路徑加檔名的混合體。如果僅僅指定檔名,則儲存在當前目錄,否則儲存到指定路徑。如果僅僅指定路徑或者指定了路徑和檔名,則自動把最後一級目錄(如果只有路徑)或者檔名作為壓縮包的檔名字首來處理。
format:壓縮包種類,’zip’,’tar’,’bztar’,’gztar’
root_dir:需要壓縮的資料夾路徑(預設當前路徑)
owner:使用者,預設當前使用者
group:組,預設當前組
logger:用於記錄日誌,通常是logging.Logger物件

>>> import shutil
>>> shutil.make_archive('p_archive', 'zip', 'archive')  # archive表示當前目錄下的archive資料夾
'/home/pumpkin/Desktop/python_files/p_archive.zip'
shutil.make_archive('archive', 'zip', 'archive')
'/home/pumpkin/Desktop/python_files/archive.zip'

2. zipfile模組

功能:以zip的形式壓縮和解壓縮檔案,注意了這個只能壓縮檔案,不能壓縮目錄,如果壓縮,也只能顯示空目錄。

>>> import zipfile
# 壓縮
>>> z=zipfile.ZipFile('test.zip', 'w')
>>> z.write('test.txt')
>>> z.close()

# 解壓縮
>>> z=zipfile.ZipFile('test.zip','r')
>>> z.extractall()
>>> z.close

# 操作方法類似於檔案的操作

3. tarfile模組

功能:以tar的形式打包檔案,能打包一切形式的檔案,包括目錄。

  • 打包
    打包通過tar.add來實現,語法: 先以寫的方式開啟tarfile檔案物件,然後是tar.add(‘file’, arcname=’’), 第一個引數是期望打包的檔案(可以是目錄),第二個引數可選,定義打包檔案中被打包檔案的名稱,如果不寫則自動採用第一個引數的檔名,但會去掉根路徑(猜測與Linux下的tar類似,防止解壓後覆蓋根路徑下的重要檔案)。
>>> import tarfile
>>> tar = tarfile.open('test.tar','w')
>>> tar.add('test.zip')
>>> tar.add('a.cc')
>>> tar.add('b.cc')
>>> tar.close()

沒有定義打包檔案中的檔名的,檔名就是原始檔名,包含絕對路徑,但已經去掉了根路徑

  • 解壓
    解壓通過tar.extractall() 來實現,可自定義解壓後的路徑,預設就是當前目錄。當然前提是先以讀的方式開啟tarfile檔案物件。
>>> import tarfile
>>> tar=tarfile.open('test.tar','r')
>>> tar.extractall('tartest')  # 解壓到指定目錄下
>>> tar.close()

解壓後的檔案形式與在tar包中直接開啟看到的相同。

參考:http://www.cnblogs.com/linupython/p/8213265.html

相關文章