Python第二十天 shutil 模塊 zipfile tarfile 模塊

Python第二十天  shutil 模塊  zipfile   tarfile 模塊html

 



os文件的操做還應該包含移動 複製  打包 壓縮 解壓等操做,這些os模塊都沒有提供


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)   #遞歸地刪除文件,無論目錄是否爲空都會刪除,建議用這個,不用os.rmdir和os.removedirs
示例python

shutil.copytree('/tmp/mysql','/tmp/mysql2') mysql2這個目標目錄不須要預先建立

 




剪切文件操做
shutil.move(src, dst)    #遞歸的移動文件
示例:mysql

shutil.move('/tmp/mysql','/tmp/mysql2') 在同一個目錄下,對於目錄就是更名,mysql2這個目標目錄不須要預先建立
shutil.move('/tmp/mysql2/123.txt','/tmp/mysql3/123.txt') 對於文件就是剪切

 




shutil模塊是高層次的文件接口,除了包含文件和目錄的操做函數之外,還包含了壓縮包的建立和解壓linux

shutil 支持的格式能夠經過get_archive_formats 函數獲取。以下所示:
print shutil.get_archive_formats()
[('bztar', "bzip2'ed tar-file"),
('gztar', "gzip'ed tar-file"),
('tar', 'uncompressed tar file'),
('zip', 'ZIP file')]git


建立壓縮包
shutil.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: 必須參數,,取值只能是get_archive_formats的輸出結果,壓縮或者打包格式 "zip", "tar", "bztar"or "gztar"
root_dir : 將哪一個目錄或者文件打包(也就是源文件)
base_dir : 將哪一個目錄或者文件打包(也就是源文件)
root_dir 和 base_dir 默認設置爲當前目錄,root_dir 和 base_dir 通常能夠認爲是同樣的
https://docs.python.org/2.7/library/shutil.html?highlight=make_archive#shutil.make_archivegithub

shutil.make_archive('tarball','gztar',root_dir='/tmp/mysql')sql


解壓壓縮包(python3纔有)
shutil.unpack_archive(filename , extract_dir=None , format=None)
filename :壓縮包名稱
extract_dir :解壓之後保存的目錄
format :壓縮包的格式
注意:文件夾不存在會新建文件夾app

shutil.unpack_archive('backup.tar.gz',extract_dir='/tmp/',format='gztar')函數

 



zipfile


zipfile模塊
ZipFile類
zipfile.ZipFile(zipfilename, 'a')
a:添加文件到壓縮包
r:讀取壓縮包內容
w:生成一個壓縮包加密

 

zipfile類經常使用方法

namelist : 返回zip 文件中包含的全部文件和文件夾的字符串列表;
extract : 從zip 文件中提取單個文件;
extractall :從zip 文件中提取全部文件。




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地址:https://github.com/mgedmin/check-manifest/issues/22


 

示例
壓縮單個文件
若是要對文件進行壓縮,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/',pwd='123456')      # 解壓所有,可設置解壓路徑,輸入解壓密碼

 



遞歸壓縮某個目錄下全部文件

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模塊

經常使用函數

getnames :獲取tar 包中的文件列表
extract :提取單個文件
extractall :提取全部文件

 

 


添加了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地址:https://github.com/mgedmin/check-manifest/issues/22


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. 不能出來提示

相關文章
相關標籤/搜索