Python的shutil zipfile tarfile模組學習
shutil 模組
shutil.copyfileobj(fsrc, fdst[, length=16*1024]) #copy檔案內容到另一個檔案,可以copy指定大小的內容
檔案複製操作
shutil.copyfile(src,dst) #copy檔案內容,是不是感覺上面的檔案複製很麻煩?還需要自己手動用open函式開啟檔案,在這裡就不需要了,事實上,copyfile呼叫了copyfileobj
shutil.copymode(src,dst) #僅copy許可權,不更改檔案內容,組和使用者。
shutil.copystat(src,dst) #複製所有的狀態資訊,包括許可權,組,使用者,時間等
shutil.copy(src,dst) #複製檔案的內容以及許可權,先copyfile後copymode
shutil.copy2(src,dst) #建議使用這個來複製,複製檔案的內容以及檔案的所有狀態資訊。先copyfile後copystat
示例:shutil.copy2('/tmp/123.txt','/tmp/mysql/123.txt')
目錄操作
shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2,ignore_dangling_symlinks=False) #遞迴的複製檔案內容及狀態資訊,目標目錄不需要預先建立
shutil.rmtree(path, ignore_errors=False, onerror=None) #遞迴地刪除檔案
示例
shutil.copytree('/tmp/mysql','/tmp/mysql2') mysql2這個目標目錄不需要預先建立
剪下檔案操作
shutil.move(src, dst) #遞迴的移動檔案
示例:
shutil.move('/tmp/mysql','/tmp/mysql2') 在同一個目錄下,對於目錄就是改名,mysql2這個目標目錄不需要預先建立 shutil.move('/tmp/mysql2/123.txt','/tmp/mysql3/123.txt') 對於檔案就是剪下
批次打包壓縮操作
make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0,dry_run=0, owner=None, group=None, logger=None) #壓縮打包
base_name: 壓縮打包後的檔名或者路徑名
format: 壓縮或者打包格式 "zip", "tar", "bztar"or "gztar"
root_dir : 將哪個目錄或者檔案打包(也就是原始檔)
base_dir : 將哪個目錄或者檔案打包(也就是原始檔)
root_dir 和 base_dir 預設設定為當前目錄,root_dir 和 base_dir 一般可以認為是一樣的
shutil.make_archive('tarball','gztar',root_dir='/tmp/mysql')
zipfile模組
ZipFile類
zipfile.ZipFile(zipfilename, 'a')
a:新增檔案到壓縮包
r:讀取壓縮包內容
w:生成一個壓縮包
ZipFile.write(filename, arcname, compress_type)
arcname:使用ZipFile.write增加檔案時,會把檔案本身的路徑也加進去,加上arcname就能根據自己的命名規則將檔案加入zip包
ZipFile.extractall(path, members, pwd)
path:解壓到指定目錄
members:只解壓壓縮包裡某個檔案
pwd:指定壓縮包裡的解壓密碼,zip可以加密壓縮
注意:python2.6不支援with xx as的寫法,不管是zipfile 還是 tarfile 模組
z = zipfile.ZipFile('/tmp/aa.zip','w',zipfile.ZIP_DEFLATED)
z.write('/tmp/aa.py')
z.close()
python2.6不支援with xx as的寫法github地址:
示例
壓縮單個檔案
如果要對檔案進行壓縮,zlib模組是必須的,如果zlib可以使用,你可以使用zipfile.ZIP_DEFLATED設定壓縮模式為單個檔案或者歸檔一個整體。
預設的壓縮模式是zipfile.ZIP_STORED。
import zipfile import os with zipfile.ZipFile('/tmp/aa.zip','w',zipfile.ZIP_DEFLATED) as z: z.write('/tmp/aa.py')
或
z = zipfile.ZipFile('/tmp/aa.zip','w',zipfile.ZIP_DEFLATED) z.write('/tmp/aa.py') z.close()
解壓檔案
with zipfile.ZipFile('/tmp/123.zip', 'r') as z: z.extractall(path='/tmp/') # 解壓全部,可設定解壓路徑
遞迴壓縮某個目錄下所有檔案
def compress_file(zipfilename, dirname): # zipfilename是壓縮包名字,dirname是要打包的目錄 if os.path.isfile(dirname): with zipfile.ZipFile(zipfilename, 'w') as z: z.write(dirname) else: with zipfile.ZipFile(zipfilename, 'w') as z: for root, dirs, files in os.walk(dirname): for single_file in files: if single_file != zipfilename: filepath = os.path.join(root, single_file) z.write(filepath) compress_file('a.zip', '.') # 執行函式
新增檔案到已有的zip包中
def addfile(zipfilename, dirname): if os.path.isfile(dirname): with zipfile.ZipFile(zipfilename, 'a') as z: z.write(dirname) else: with zipfile.ZipFile(zipfilename, 'a') as z: for root, dirs, files in os.walk(dirname): for single_file in files: if single_file != zipfilename: filepath = os.path.join(root, single_file) z.write(filepath) addfile('a.zip', 'test.txt')
檢視壓縮包中的檔案
def viewfile(zipfilename): with zipfile.ZipFile(zipfilename, 'r') as z: print(z.namelist()) print(z.namelist()) # 檢視壓縮包中的檔案列表 print(z.read(z.namelist()[0])) # 讀出來壓縮包中的第一個檔案的內容列印到螢幕,也可儲存到檔案中 viewfile('a.zip')
tarfile模組
新增了arcname不會將檔案所在目錄tmp新增到壓縮包裡,解壓出來會把檔案直接解壓到當前資料夾
不新增arcname則會將檔案所在目錄tmp也新增到壓縮包裡,解壓出來會把tmp解壓出來,所以檔案放在tmp目錄下
建議是不新增arcname,這樣解壓出來就不會把所有檔案解壓在當前目錄很混亂,mysql壓縮包也是這種做法
mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz
t = tarfile.open('/tmp/a.tgz', 'w:gz')
t.add('/tmp/aa.py',arcname='aa.py')
t.add('/tmp/22.txt',arcname='22.txt')
t.close()
tar -tf a.tgz
aa.py
22.txt
t = tarfile.open('/tmp/a.tgz', 'w:gz')
t.add('/tmp/aa.py')
t.add('/tmp/22.txt')
t.close()
tar -tf a.tgz
tmp/aa.py
tmp/22.txt
注意:python2.6不支援with xx as的寫法,不管是zipfile 還是 tarfile 模組
t = tarfile.open('/tmp/a.tgz', 'w:gz')
t.add('/tmp/aa.py',arcname='aa.py')
t.add('/tmp/22.txt',arcname='22.txt')
t.close()
python2.6不支援with xx as的寫法github地址:
tarfile.open(name=None, mode=’r’, fileobj=None, bufsize=10240, **kwargs)
在打包的過程中可以設定壓縮規則,如想要以gz壓縮的格式打包
tar=tarfile.open('/path/to/your.tar.gz','w:gz')
其他格式如下表:
tarfile.open的mode有很多種:
mode action
'r' or 'r:*' Open for reading with transparent compression (recommended).
'r:' Open for reading exclusively without compression.
'r:gz' Open for reading with gzip compression.
'r:bz2' Open for reading with bzip2 compression.
'a' or 'a:' Open for appending with no compression. The file is created if it does not exist.
'w' or 'w:' Open for uncompressed writing.
'w:gz' Open for gzip compressed writing.
'w:bz2' Open for bzip2 compressed writing.
TarFile.add(name, arcname=None, recursive=True, exclude=None, filter=None)
name:可以是目錄,軟連線,檔案
recursive:如果name是目錄則遞迴壓縮這個目錄,預設是true
arcname:使用tar.add()增加檔案時,會把檔案本身的路徑也加進去,加上arcname就能根據自己的命名規則將檔案加入tar包
exclude:已經Deprecated
filter:不壓縮某些檔案
TarFile.extractall(path='', members=None)
path:解壓的路徑
members:只解壓壓縮包裡某個檔案
示例
壓縮單個檔案並打包
import tarfile import os with tarfile.open('/tmp/a.tgz', 'w:gz') as tar: tar.add('/tmp/aa.py',arcname='aa.py') tar.add('/tmp/22.txt',arcname='22.txt')
或
t = tarfile.open('/tmp/a.tgz', 'w:gz') t.add('/tmp/aa.py',arcname='aa.py') t.add('/tmp/22.txt',arcname='22.txt') t.close()
解壓檔案
with tarfile.open('a.tar', 'r') as tar: print(tar.getmembers()) # 檢視壓縮包內檔案成員 tar.extractall(path='/tmp/') # 解壓全部
或
t = tarfile.open('/data/test/mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz', 'r:gz') print(t.getmembers()) # 檢視壓縮包內檔案成員 t.extractall(path='/data/test/mysql') # 解壓全部 t.close()
壓縮某個目錄下所有檔案
def compress_file(tarfilename, dirname): # tarfilename是壓縮包名字,dirname是要打包的目錄 if os.path.isfile(dirname): with tarfile.open(tarfilename, 'w') as tar: tar.add(dirname) else: with tarfile.open(tarfilename, 'w') as tar: for root, dirs, files in os.walk(dirname): for single_file in files: # if single_file != tarfilename: filepath = os.path.join(root, single_file) tar.add(filepath) compress_file('test.tar', 'test.txt') compress_file('t.tar', '.')
新增檔案到已有的tar包中
def addfile(tarfilename, dirname): # tarfilename是壓縮包名字,dirname是要打包的目錄 if os.path.isfile(dirname): with tarfile.open(tarfilename, 'a') as tar: tar.add(dirname) else: with tarfile.open(tarfilename, 'a') as tar: for root, dirs, files in os.walk(dirname): for single_file in files: # if single_file != tarfilename: filepath = os.path.join(root, single_file) tar.add(filepath) addfile('t.tar', 'ttt.txt') addfile('t.tar', 'ttt')
如果語法正確,pycharm可以彈出語法提示
因為用的舊的語法,所以可以出來提示
python2.6不能用with xx as語法,所以tar. 不能出來提示
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/36/viewspace-2800675/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- python常用標準庫(壓縮包模組zipfile和tarfile)Python
- Python學習【第十四篇】shutil模組Python
- Python的shutil模組Python
- python之shutil模組Python
- Python_shutil模組Python
- python3 shutil模組Python
- tarfile壓縮模組
- day18:json模組&time模組&zipfile模組JSON
- 內建模組--壓縮模組--zipfile
- Python入門(二十六):檔案模組(os模組與shutil模組)Python
- [Python模組學習] glob模組Python
- 學習Python的urllib模組Python
- python常用標準庫(os系統模組、shutil檔案操作模組)Python
- Python學習——logging模組Python
- Python學習——shelve模組Python
- Python學習——xml模組PythonXML
- Python學習——configparser模組Python
- Python學習——hashlib模組Python
- Python學習之模組Python
- Python3學習筆記(5)常用模組:time、datetime、random、os、sys、shutil、shelve、xml處理Python筆記randomXML
- Python學習之常用模組Python
- Python學習之 datetime模組Python
- python基礎學習16—-模組Python
- Python學習之模組與包Python
- python開發學習之如何更好的引用Python模組?Python
- Python開發常用的庫及模組!Python學習教程Python
- Python學習之如何引用Python自定義模組?Python
- retrying模組的學習
- 模組學習之hashlib模組
- 模組學習之logging模組
- os ,shutil,send2trash模組彙總(tcy)
- itertools 模組學習
- Python學習筆記_函式_匯入模組Python筆記函式
- Python學習【第十二篇】time & datetime模組Python
- Python學習【第十三篇】隨機數相關:random模組&string模組Python隨機random
- Python案例學習——模組和包、爬蟲的基礎概念Python爬蟲
- Python3學習筆記4 , 迴圈、模組Python筆記
- Node fs模組學習