“选择性复制”练习使用 Python 实用程序部分中的文件系统和外部命令资料。本练习的“copyspecial”课程目录位于 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),将这些文件压缩到指定的 zipfile
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 <列出所有文件>”。这将创建一个包含这些文件的 ZIP 文件。只是为了好玩/安心,还要输出您首先要执行的命令行(如讲座中所示)。(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)