“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)