複製特殊練習牽涉到 Python 公用程式章節中的檔案系統和外部指令內容。這項練習以「複製特別節目」為基礎google-python-exercises 內的目錄 (如果還沒有下載,請下載 google-python-exercises.zip)。如需詳細資訊,請參閱「設定」一文。在 copyspecial.py 中新增程式碼。
copyspecial.py 程式接受一或多個目錄做為引數。先把「特殊」檔案是名稱包含 __w__ 模式的某個位置,其中 w 代表一或多個字詞字元。提供的 main() 包含用來剖析指令列引數的程式碼,其餘程式碼則由您自行決定。編寫函式來實作以下功能,並修改 main() 來呼叫函式。
建議解決方案(詳見下文):
- get_special_paths(dir) -- 傳回指定目錄中特殊檔案的絕對路徑清單
- copy_to(paths, dir) 指定路徑清單,然後將這些檔案複製到指定的目錄。
- 指定路徑清單的 zip_to(paths, zippath),並將這些檔案壓縮成指定的壓縮檔
A 部分 (操控檔案路徑)
收集所有目錄中特殊檔案的絕對路徑清單。在最簡單的情況下,只要列印該清單即可 (在此指令之後的「.」是一個引數,代表目前的目錄)。請每行輸出一個絕對路徑。
$ ./copyspecial.py . /Users/nparlante/pycourse/day2/xyz__hello__.txt /Users/nparlante/pycourse/day2/zz__something__.jpg
我們會假設目錄中沒有重複的名稱 (選用:請確認該假設是否違反規定,如有違規情形則請錯誤)。
B 部分 (檔案複製)
如果「--todir dir」選項位於指令列開頭,請不要列印任何資訊,而是將檔案複製到指定目錄,必要時可以建立檔案。使用 Python 模組「shutil」以便複製檔案
$ ./copyspecial.py --todir /tmp/fooby . $ ls /tmp/fooby xyz__hello__.txt zz__something__.jpg
C 部分 (呼叫外部程式)
如果「--tozip zipfile」選項位於指令列開頭,請執行以下指令:「zip -j zipfile <list all the files>」。即可建立包含這些檔案的 ZIP 檔案。為求輕鬆/可信,也請將您要先執行的指令列列印出來 (如課程所示)。(Windows 附註:根據預設,視窗不會提供產生標準 .zip 封存的程式,但您可以下載免費的 ZIP 程式 (網址:www.info-zip.org)。
Linux 使用者如果沒有安裝 zip
,
呼叫 sudo apt install zip
即可安裝 。
$ ./copyspecial.py --tozip tmp.zip .Command I'm going to do:zip -j tmp.zip /Users/nparlante/pycourse/day2/xyz__hello__.txt /Users/nparlante/pycourse/day2/zz__something__.jpg
如果子程序結束並顯示錯誤代碼,請在結束時使用錯誤代碼,並顯示指令的輸出內容。如要進行測試,請嘗試將 ZIP 檔案寫入不存在的目錄。
$ ./copyspecial.py --tozip /no/way.zip .Command I'm going to do:zip -j /no/way.zip /Users/nparlante/pycourse/day2/xyz__hello__.txt /Users/nparlante/pycourse/day2/zz__something__.jpg
zip I/O error: No such file or directory zip error: Could not create output file (/no/way.zip)