複製特殊 Python 練習

「Copy Special」(複製特例) 練習與 Python Utilities 區段中的檔案系統和外部指令內容相關。這項練習位於 google-python-exercises 的「copyspecial」目錄中 (如果尚未下載,請下載 google-python-exercises.zip,詳情請參閱「設定」一文)。在 copyspecial.py 中加入程式碼

Copyspecial.py 程式使用一或多個目錄做為引數。我們會說「特別」檔案是指在某個位置含有 __w__ 模式的名稱,其中 w 代表一或多個字詞字元。我們提供的 main() 程式碼包含了剖析指令列引數的程式碼,但其餘部分取決於您。編寫函式以實作下列功能,並修改 main() 來呼叫函式。

解決方案建議函式(詳情如下):

  • get_special_paths(dir) -- 傳回指定目錄中特殊檔案的絕對路徑清單
  • 提供一份路徑清單 copy_to(paths, dir),並將這些檔案複製到指定的目錄
  • zip_to(paths, zippath) 提供路徑清單,然後將這些檔案壓縮成指定的 ZIP 檔案

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 封存檔,但您可以前往 www.info-zip.org 下載免費的 ZIP 程式)。 針對 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)