怎么在 Python项目中利用 7zip 对文件进行备份
怎么在 Python項目中利用 7zip 對文件進行備份?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
下面三種方法可以在python中正確運行7z命令:
# 方法1: 拷貝 7z.exe 和7z.dll 到當前python文件所在的目錄下。 否則,不認識7z 命令。
zip_command = '7z a -tzip {0} {1} -r'.format(target, ' '.join(source))
# 方法2: os.system() 里面執行的是同目錄下的exe, 使用如下os.chdir() 命令切換 path。
os.chdir('D:\\ProgramFiles(x86)\\7-Zip')
print('切換當前路徑為:',os.getcwd())
zip_command='7za-tzip{0}{1}-r'.format(target,''.join(source))
# 方法3:在cmd 命令中寫入7z.exe所在的目錄
zip_command = '"D:\\Program Files (x86)\\7-Zip\\7z.exe" a -tzip {0} {1} '.format(target, ' '.join(source))
importos
importtime
#1.需要備份的文件與目錄將被指定在一個列表中。
#例如在Windows下:source=['"C:\\MyDocuments"','C:\\Code']
#又例如在MacOSX與Linux下:source=['/Users/swa/notes']
source=['D:\\test\\fold\\']
#在這里要注意到我們必須在字符串中使用雙引號用以括起其中包含空格的名稱。
#2.備份文件必須存儲在一個主備份目錄中
#例如在Windows下:target_dir='E:\\Backup'
#又例如在MacOSX和Linux下:target_dir='/Users/swa/backup'
target_dir='D:\\test\\Backup'
#要記得將這里的目錄地址修改至你將使用的路徑
#3.備份文件將打包壓縮成zip文件。
#4.zip壓縮文件的文件名由當前日期與時間構成。
#os.sep變量的使用方式——它將根據你的操作系統給出相應的分隔符,在#GNU/Linux與Unix中它會是'/',在Windows中它會是'\\',在MacOS中它會是':'
target=target_dir+os.sep+time.strftime('%Y%m%d%H%M%S')+'.zip'
#如果目標目錄還不存在,則進行創建
ifnotos.path.exists(target_dir):
os.mkdir(target_dir)
#5.我們使用zip命令將文件打包成zip格式
#方法1:拷貝7z.exe和7z.dll到當前python文件所在的目錄下。否則,不認識7z命令。
#zip_command='7za-tzip{0}{1}-r'.format(target,''.join(source))
#方法2:os.system()里面執行的是同目錄下的exe,使用如下os.chdir()命令切換path。
#os.chdir('D:\\ProgramFiles(x86)\\7-Zip')
#print('切換當前路徑為:',os.getcwd())
#zip_command='7za-tzip{0}{1}-r'.format(target,''.join(source))
#方法3:在cmd命令中寫入7z.exe所在的目錄
#-mcu強制使用utf-8編碼文件名
zip_command='"D:\\ProgramFiles(x86)\\7-Zip\\7z.exe"a-tzip-mcu{0}{1}'.format(target,''.join(source))
#運行備份
print('\nZipcommandis:')
print(zip_command)
print('Running:')
ifos.system(zip_command)==0:
print('Successfulbackupto',target)
else:
print('BackupFAILED')
#查看壓縮文件內容
check_command='"D:\\ProgramFiles(x86)\\7-Zip\\7z.exe"l{0}'.format(target)
print('\nCheckzipfilecommandis:')
print(check_command)
print('Running:')
#使用os.system(check_command)中文返回有亂碼,所以使用os.popen
#ifos.system(check_command)==0:
#print('Pleasecheckthefilelistin:',target)
#else:
#print('CheckinfoFAILED')
print('Pleasecheckthefilelistin:',target)
p=os.popen(check_command)
print(p.read())
p.close()
#解壓縮到目錄
extr_command='"D:\\ProgramFiles(x86)\\7-Zip\\7z.exe"x{0}-oD:\\test\\extract\\-y'.format(target)
print('\nExtractcommandis:')
print(extr_command)
print('Running:')
ifos.system(extr_command)==0:
print('Successfulextractto','D:\\test\\extract')
else:
print('ExtractFAILED')
注意:
在壓縮的時候,不要使用 -r,遞歸會把folder同級的其它目錄下的文件一起壓縮;
在解壓的時候,使用-y,如果當前目錄下已存在被解壓的目錄和文件,替換目標文件。
zip_command = '"D:\\Program Files (x86)\\7-Zip\\7z.exe" a -tzip {0} {1} -r'.format(target, ' '.join(source))
extr_command = '"D:\\Program Files (x86)\\7-Zip\\7z.exe" x {0} -oD:\\test\\extract\\ -y'.format(target)
補充知識:誰說Python的shutil不支持7z解壓縮,我來教你擴展它的功能!
python的內置模塊
在Python的標準庫中,有哪些你常用并且覺得犀利無比的模塊?不要說time、datetime、os、sys。這些模塊常用是常用,但是逼格不夠高啊。舉個例子,如果你經常在LeetCode上刷題,你會發現有時Java、C需要幾十行的算法題,如果Python使用了collections、itertools,可能三四行代碼就結束了。
shutil的便利
日常的編碼中,常會涉及到對文件、目錄等的操作場景,如果我們使用os,可能需要對文件、文件夾,非空等進行逐個判斷。舉個例子: 我們現在要刪除一個目錄,目錄中包含有文件與文件夾,如果使用os模塊,沒有現成可以使用的函數,需要我們進行判斷與分類執行。
importos #path是文件的路徑,如果這個路徑是一個文件夾, #則會拋出OSError的錯誤,這時需用用rmdir()來刪除 os.remove(path) #path是文件夾路徑,注意文件夾需空的才能被刪除 os.rmdir(path)
多數初學者遇到刪除文件夾,想到的操作就是,創建兩個列表,然后用os.walk遍歷目錄,將文件與文件夾分別存入初始化的兩個列表中,然后先統一刪除文件,最后刪除文件夾。如果有上面這樣操作的同學,請面壁三分鐘。明顯沒有好好學習os.walk函數。
os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]]) top -- 是你所要遍歷的目錄的地址, 返回的是一個三元組(root,dirs,files)。
root 所指的是當前正在遍歷的這個文件夾的本身的地址
dirs 是一個 list ,內容是該文件夾中所有的目錄的名字(不包括子目錄)
files 同樣是 list , 內容是該文件夾中所有的文件(不包括子目錄)
topdown --可選,為 True,則優先遍歷 top 目錄,否則優先遍歷 top 的子目錄(默認為開啟)。如果 topdown 參數為 True,walk 會遍歷top文件夾,與top 文件夾中每一個子目錄。
onerror -- 可選,需要一個 callable 對象,當 walk 需要異常時,會調用。
followlinks -- 可選,如果為 True,則會遍歷目錄下的快捷方式(linux 下是軟連接 symbolic link )實際所指的目錄(默認關閉),如果為 False,則優先遍歷 top 的子目錄。
只需要將topdown設置為False,這樣在遍歷目錄時,就會從根節點進行遍歷,然后我們逐個刪除就ok了,哪里需要那么麻煩!代碼如下:
importos
forroot,dirs,filesinos.walk('D:\\software_temp',topdown=False):
fornameinfiles:
os.remove(os.path.join(root,name))
fornameindirs:
os.rmdir(os.path.join(root,name))
說這么多,無外乎為了引出最簡便的方式 : shutil模塊
如果換做shutil模塊登場,那么執行刪除目錄的操作,只需要0.1秒的時間:
import shutil
shutil.rmtree('D:\\software_temp')
就這樣,完事兒了...
文件解壓縮
日常工作中,我們經常會使用python進行文件的解壓縮處理。python自帶的解壓縮模塊有zipfile, gzip, tarfile,如果我們需要解壓rar文件則需要單獨下載rarfile模塊,針對每一種壓縮文件,我們都需要針對文件類型進行對應模塊的使用,是不是很繁瑣?如果我們使用shutil呢?讓我們先來看看shutil支持的解壓類型:
importpprint
importshutil
pprint.pprint(shutil.get_unpack_formats())
output:
[('bztar',['.tar.bz2','.tbz2'],"bzip2'edtar-file"),
('gztar',['.tar.gz','.tgz'],"gzip'edtar-file"),
('tar',['.tar'],'uncompressedtarfile'),
('xztar',['.tar.xz','.txz'],"xz'edtar-file"),
('zip',['.zip'],'ZIPfile')]
shutil已經包含了我們上面提到的所有文件。
.7z文件是什么鬼?
眾所周知,zip的壓縮率相比rar是比較低的,但是商業軟件下載中,你很少會見到.rar的文件,why?因為專利啊...
RAR是一種專利文件格式,用于數據壓縮與歸檔打包,開發者為尤金·羅謝爾(俄語:Евгений Лазаревич Рошал,拉丁轉寫:Yevgeny Lazarevich Roshal),RAR的全名是“Roshal ARchive”,即“羅謝爾的歸檔”之意。首個公開版本RAR 1.3發布于1993年。
所以,有很多產品在軟件發布時,開始使用一種壓縮率更高的.7z文件,這又是為什么?來讓我們訪問一下7-zip的官網:7-zip官方主頁:https://sparanoid.com/lab/7z/在其中有一個許可協議是這樣寫的
許可協議:
7-Zip 是一款 開源 軟件。大多數源代碼都基于 GNU LGPL 許可協議下發布。AES 代碼基于 BSD 許可下發布。unRAR 代碼基于兩種許可:GNU LGPL 和 unRAR 限制許可。更多下許可信息請查看:7-Zip 許可。您可以在任何一臺計算機上使用 7-Zip ,包括用在商業用途的計算機,不對 7-Zip 進行捐贈或支付并不影響您的使用。
shutil擴展7z
說了這么多7z文件的好處,可我們看到shutil并不能解壓該類型的文件啊。我們能否讓shutil支持.7z文件,達到無腦解壓縮呢?此時,你需要py7zr模塊。養成好習慣,遇到模塊先找GitHub:https://github.com/miurahr/py7zr
1. 模塊下載
pip install py7zr
2. 基本使用
當我們安裝好py7zr后,它可以在cmd下直接運行該命令
Listarchivecontents $py7zrltest.7z Extractarchive $py7zrxtest.7z Extractarchivewithpassword $py7zrx-Ptest.7z password?:**** Createandcompresstoarchive $py7zrctarget.7ztest_dir Createmulti-volumearchive $py7zrc-v500ktarget.7ztest_dir Testarchive $py7zrttest.7z Showinformation $py7zri Showversion $py7zr--version
單獨使用模塊
importpy7zr
archive=py7zr.SevenZipFile('sample.7z',mode='r')
archive.extractall(path="/tmp")
archive.close()
withpy7zr.SevenZipFile('target.7z','w')asz:
z.writeall('./base_dir')
3. shutil集成
之所以推薦py7zr給大家,不僅因為他的簡單好用,更是由于他可以輕松集成于shutil,來看看它的使用方式吧:
frompy7zrimportpack_7zarchvie,unpack_7zarchive
importshutil
#registerfileformatatfirst.
shutil.register_archive_format('7zip',
pack_7zarchive,
description='7ziparchive')
shutil.register_unpack_format('7zip',
['.7z'],
unpack_7zarchive,
description='7ziparchive')
#extraction
shutil.unpack_archive('test.7z','/tmp')
#compression
shutil.make_archive('target','7zip','src')
pprint.pprint(shutil.get_unpack_formats())
#output:
[('7zip',['.7z'],'7ziparchive'),
('bztar',['.tar.bz2','.tbz2'],"bzip2'edtar-file"),
('gztar',['.tar.gz','.tgz'],"gzip'edtar-file"),
('tar',['.tar'],'uncompressedtarfile'),
('xztar',['.tar.xz','.txz'],"xz'edtar-file"),
('zip',['.zip'],'ZIPfile')]
通過注冊我們看到,shutil已經支持7z文件的解壓了
總結
以上是生活随笔為你收集整理的怎么在 Python项目中利用 7zip 对文件进行备份的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么提取html的数据,如何提取网页数据
- 下一篇: ajax each html 太多,HT