《Byte of Python3》 11章 建立備份的程序

“我想寫一個能給我所有重要文件建立備份的程序”。

  1. 需要備份的文件和目錄由一個列表指定病苗。
  2. 備份應(yīng)該保存在主備份目錄中惩嘉。
  3. 文件備份成一個 zip 文件。
  4. zip 存檔的名稱是當(dāng)前的日期和時間乱灵。
  5. 我們使用標(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)用寫出第四版嗎?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绰姻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子引瀑,更是在濱河造成了極大的恐慌狂芋,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憨栽,死亡現(xiàn)場離奇詭異帜矾,居然都是意外死亡翼虫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門屡萤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來珍剑,“玉大人,你說我怎么就攤上這事死陆≌凶荆” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵措译,是天一觀的道長别凤。 經(jīng)常有香客問我,道長瞳遍,這世上最難降的妖魔是什么闻妓? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任菌羽,我火速辦了婚禮掠械,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘注祖。我一直安慰自己猾蒂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布是晨。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乳蓄。 梳的紋絲不亂的頭發(fā)上缩功,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音箫章,去河邊找鬼烙荷。 笑死,一個胖子當(dāng)著我的面吹牛檬寂,可吹牛的內(nèi)容都是我干的终抽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼桶至,長吁一口氣:“原來是場噩夢啊……” “哼昼伴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起镣屹,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤圃郊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后女蜈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體描沟,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡飒泻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吏廉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泞遗。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖席覆,靈堂內(nèi)的尸體忽然破棺而出史辙,到底是詐尸還是另有隱情,我是刑警寧澤佩伤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布聊倔,位于F島的核電站,受9級特大地震影響生巡,放射性物質(zhì)發(fā)生泄漏耙蔑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一孤荣、第九天 我趴在偏房一處隱蔽的房頂上張望甸陌。 院中可真熱鬧,春花似錦盐股、人聲如沸钱豁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牲尺。三九已至,卻和暖如春幌蚊,著一層夾襖步出監(jiān)牢的瞬間谤碳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工溢豆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜒简,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓沫换,卻偏偏與公主長得像臭蚁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子讯赏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容