“我想寫一個能給我所有重要文件建立備份的程序”。
- 需要備份的文件和目錄由一個列表指定病苗。
- 備份應(yīng)該保存在主備份目錄中惩嘉。
- 文件備份成一個 zip 文件。
- zip 存檔的名稱是當(dāng)前的日期和時間乱灵。
- 我們使用標(biāo)準(zhǔn)的 zip 命令塑崖,它通常默認(rèn)地隨 Linux/Unix 發(fā)行版提供。Windows 用戶可以從GnuWin32項目頁安裝痛倚。注意你可以使用任何存檔命令规婆,只要它有命 令行界面就可以了,那樣的話我們可以從我們的腳本中傳遞參數(shù)給它。
版本一
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
# Filename: backup_ver1.py
import os
import time
# 1.待備份的文件作為一個list
# 在windows下:
# source = ['"C:\\My Documents"','C:\\Code'] #這里要轉(zhuǎn)義
# 在 Mac OS X 和 Linux 下:
source = ['/Users/Lazyant/Documents/學(xué)習(xí)/Pythonlearn/練習(xí)題']
# 2. 目標(biāo)存檔目錄抒蚜,記得把路徑改為自己電腦的路徑
target_dir = '/Users/Lazyant/Documents/學(xué)習(xí)/Pythonlearn/backup'
# 3. 文件備份到一個zip文件里
# 以當(dāng)前日期命名zip文件
# time.strftime()獲取時間
# os.sep 會根據(jù)操作系統(tǒng)給出路徑分隔符掘鄙,如在 windows 中用'\\'
target = target_dir + os.sep + time.strftime('%Y%m%d%H%M%S') + '.zip'
# 4. 如果文件夾不存在則創(chuàng)建文件夾
if not os.path.exists(target_dir):
os.mkdir(target_dir)
# 5. 創(chuàng)建zip_command字符串,其包含將要執(zhí)行的zip命令
# 使用的 zip 命令有一些選項和傳遞的參數(shù)嗡髓。-q 選項被用來表明 zip 命令應(yīng)該以快 速的方式進(jìn)行操漠。-r 選項指定 zip 命令應(yīng)該對每個目錄重復(fù)執(zhí)行,例如應(yīng)該包含所有子 目錄和文件饿这。這兩個選項可以用 -qr 結(jié)合到一起浊伙。
# 用 join 方法將資源列表轉(zhuǎn)換成一個字符串
zip_command = "zip -r {0} {1}".format(target,' '.join(source))
# 用 os.system 函數(shù)運(yùn)行命令
print('Zip command is:')
print(zip_command)
print('Running:')
if os.system(zip_command) == 0:
print('Successful backup to',target)
else:
print('Backup FAILED')
版本二
優(yōu)化:使用時間作為文件名,而當(dāng)前的 日期作為目錄名长捧,存放在主備份目錄中嚣鄙。
...
# 3. 文件備份到一個zip文件里
# 以當(dāng)前日期在主目錄里命名子目錄
today = target_dir + os.sep + time.strftime('%Y%m%d')
# 以當(dāng)前時間命名zip
now = time.strftime('%H%M%S')
target = today + os.sep + now + '.zip'
# 4. 如果文件夾不存在則創(chuàng)建文件夾
if not os.path.exists(target_dir):
os.mkdir(target_dir)
if not os.path.exists(today):
os.mkdir(today)
print('Successful created directory',today)
...
...
版本三:
優(yōu)化:文件名添加備注
...
# 3. 文件備份到一個zip文件里
# 以當(dāng)前日期在主目錄里命名子目錄
today = target_dir + os.sep + time.strftime('%Y%m%d')
# 以當(dāng)前時間命名zip
now = time.strftime('%H%M%S')
# 加個備注
comment = input('Enter a comment -->')
#檢查輸入的備注
if len(comment) == 0:
target = today + os.sep + now + '.zip'
else:
target = today + os.sep + now + \
'_' + comment.replace(' ','_') + '.zip'
...
對于大多數(shù)用戶來說,第四個版本是一個滿意的工作腳本了串结,但是它仍然有進(jìn)一 步改進(jìn)的空間哑子。比如,你可以在程序中包含交互程度 —— 你可以用 -v 選項來使你的 程序更具交互性肌割。
另一個可能的改進(jìn)是使文件和目錄能夠通過命令行直接傳遞給腳本卧蜓。我們可以通 過 sys.argv 列表來獲取它們,然后我們可以使用 list 類提供的 extend 方法把它們加到 source 列表中去把敞。
最重要的提煉就是不用 os.system 方式來創(chuàng)建壓縮文檔烦却,而是用 zipfile 或 tarfile 內(nèi)置模塊來創(chuàng)建壓縮文檔。它們是標(biāo)準(zhǔn)庫的一部分先巴,沒有與你計算機(jī)中外部 zip 程序 的依賴性其爵,并且已經(jīng)能夠使用。
但是伸蚯,在上面的例子中摩渺,我已經(jīng)使用了 os.system 的方式創(chuàng)建備份,這純粹是為 教學(xué)的方便剂邮,以使得例子足夠簡單摇幻,能被每個人理解,但這已經(jīng)足夠用了挥萌。
你能嘗試用zipfile 模塊來替代 os.system 調(diào)用寫出第四版嗎?