简明Python教程学习笔记_5_解决问题
問題
我提出的問題是: 我想要一個可以為我的所有重要文件創建備份的程序。
盡管這是一個簡單的問題,但是問題本身并沒有給我們足夠的信息來解決它。進一步的分析是必需的。例如,我們如何確定該備份哪些文件?備份保存在哪里?我們怎么樣存儲備份?
在恰當地分析了這個問題之后,我們開始設計我們的程序。我們列了一張表,表示我們的程序應該如何工作。對于這個問題,我已經創建了下面這個列表以說明我 如何讓它工作。如果是你設計的話,你可能不會這樣來解決問題——每個人都有其做事的方法,這很正常。
需要備份的文件和目錄由一個列表指定。
備份應該保存在主備份目錄中。
文件備份成一個zip文件。
zip存檔的名稱是當前的日期和時間。
我們使用標準的zip命令,它通常默認地隨Linux/Unix發行版提供。Windows用戶可以使用Info-Zip程序。注意你可以使用任何地存檔命令,只要它有命令行界面就可以了,那樣的話我們可以從我們的腳本中傳遞參數給它。
版本一
#!/usr/bin/python # Filename: backup_ver4.pyimport os import time# 1. The files and directories to be backed up are specified in a list. source = ['/home/swaroop/byte', '/home/swaroop/bin'] # If you are using Windows, use source = [r'C:\Documents', r'D:\Work'] or something like that# 2. The backup must be stored in a main backup directory target_dir = '/mnt/e/backup/' # Remember to change this to what you will be using# 3. The files are backed up into a zip file. # 4. The current day is the name of the subdirectory in the main directory today = target_dir + time.strftime('%Y%m%d') # The current time is the name of the zip archive now = time.strftime('%H%M%S')# Take a comment from the user to create the name of the zip file comment = raw_input('Enter a comment --> ') if len(comment) == 0: # check if a comment was enteredtarget = today + os.sep + now + '.zip' else:target = today + os.sep + now + '_' + \comment.replace(' ', '_') + '.zip'# Notice the backslash!# Create the subdirectory if it isn't already there if not os.path.exists(today):os.mkdir(today) # make directoryprint 'Successfully created directory', today# 5. We use the zip command (in Unix/Linux) to put the files in a zip archive zip_command = "zip -qr '%s' %s" % (target, ' '.join(source))# Run the backup if os.system(zip_command) == 0:print 'Successful backup to', target else:print 'Backup FAILED'輸出
$ python backup_ver4.py Enter a comment --> added new examples Successful backup to /mnt/e/backup/20041208/082156_added_new_examples.zip$ python backup_ver4.py Enter a comment --> Successful backup to /mnt/e/backup/20041208/082316.zip它如何工作
這個程序現在工作了!讓我們看一下版本三中作出的實質性改進。我們使用raw_input函數得到用戶的注釋,然后通過len函數找出輸入的長度以檢驗用戶是否確實輸入了什么東西。如果用戶只是按了回車(比如這只是一個慣例備份,沒有做什么特別的修改),那么我們就如之前那樣繼續操作。
然而,如果提供了注釋,那么它會被附加到zip歸檔名,就在.zip擴展名之前。注意我們把注釋中的空格替換成下劃線——這是因為處理這樣的文件名要容易得多。
但是它仍然有進一步改進的空間。比如,你可以在程序中包含 交互 程度——你可以用-v選項來使你的程序更具交互性。
另一個可能的改進是使文件和目錄能夠通過命令行直接傳遞給腳本。我們可以通過sys.argv列表來獲取它們,然后我們可以使用list類提供的extend方法把它們加到source列表中去。
我還希望有的一個優化是使用tar命令替代zip命令。這樣做的一個優勢是在你結合使用tar和gzip命令的時候,備份會更快更小。如果你想要在Windows中使用這些歸檔,WinZip也能方便地處理這些.tar.gz文件。tar命令在大多數Linux/Unix系統中都是默認可用的。Windows用戶也可以下載安裝它。
命令字符串現在將稱為:
tar = 'tar -cvzf %s %s -X /home/swaroop/excludes.txt'% (target,' '.join(srcdir))
選項解釋如下:
-
-c表示創建一個歸檔。
-
-v表示交互,即命令更具交互性。
-
-z表示使用gzip濾波器。
-
-f表示強迫創建歸檔,即如果已經有一個同名文件,它會被替換。
-
-X表示含在指定文件名列表中的文件會被排除在備份之外。例如,你可以在文件中指定*~,從而不讓備份包括所有以~結尾的文件。
重要
最理想的創建這些歸檔的方法是分別使用zipfile和tarfile。它們是Python標準庫的一部分,可以供你使用。使用這些庫就避免了使用os.system這個不推薦使用的函數,它容易引發嚴重的錯誤。
然而,我在本節中使用os.system的方法來創建備份,這純粹是為了教學的需要。這樣的話,例子就可以簡單到讓每個人都能夠理解,同時也已經足夠用了。 ?
總結
以上是生活随笔為你收集整理的简明Python教程学习笔记_5_解决问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 爬虫学习 系列教程
- 下一篇: 最长升序子串1231