复制特殊的 Python 练习

“Copy Special”练习附带 Python 实用程序部分中的文件系统和外部命令资料。此练习位于 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),将这些文件压缩到指定的压缩文件中

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>”。这样将创建包含相应文件的 zipfile。为了好玩/安心,您也可以输出您首先要执行的命令行(如讲座中所示)。(Windows 注意事项:默认情况下,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)