在Python编程中,有时我们需要复制一个目录的结构,但不包括其中的文件。这在处理大量文件或层次复杂的目录时非常有用。本文将探讨如何使用Python编写一个脚本来实现这一功能,同时也会介绍一些基础的Python语法和常用模块。
Python脚本通常以`#!/usr/bin/python`作为开头,这称为Shebang,它告诉操作系统使用哪个解释器来执行这个脚本。类似地,`#!/bin/bash`用于指示使用Bash shell,而`#!/usr/local/php/bin/php`则表示使用PHP执行器。
接下来,我们看到`# -*- coding: utf-8 -*-`,这是设置脚本编码的元注释,确保非ASCII字符在脚本中正确显示,避免乱码问题。
在Python中,匿名函数`lambda`是一种简洁的定义小型函数的方法。例如,`g = lambda x, y: x + y`创建了一个接受两个参数x和y并返回它们之和的函数。此外,`map`和`filter`函数分别用于对序列应用函数和过滤序列中的元素。
`__name__ == "__main__"`是一个常见的检查,用来确定脚本是否作为主程序运行。如果`__name__`的值是`__main__`,那么这意味着脚本被直接执行,而不是作为模块导入。这样,我们可以在`if __name__ == "__main__":`块内放置程序的主体,确保只有在直接运行脚本时才会执行这些代码。
在实际的目录复制脚本中,我们使用了`os`和`sys`这两个重要模块。`os`模块提供了许多与操作系统交互的功能,如遍历目录、创建目录等。`sys.argv`是一个列表,包含了命令行参数,`sys.argv[1]`和`sys.argv[2]`分别对应脚本的第一个和第二个参数,通常是源目录和目标目录。
以下是一个简单的目录复制脚本示例:
```python
import os
import sys
source = os.path.realpath(sys.argv[1])
target = os.path.realpath(sys.argv[2])
def isdir(x):
return os.path.isdir(x) and x != '.svn'
def mkfloders(src, tar):
paths = os.listdir(src)
paths = [os.path.join(src, name) for name in paths]
paths = filter(isdir, paths)
for i in paths:
(filepath, filename) = os.path.split(i)
targetpath = os.path.join(tar, filename)
if not os.path.isdir(targetpath):
os.mkdir(targetpath)
mkfloders(i, targetpath)
if __name__ == "__main__":
if os.path.isdir(source):
if target.startswith(source):
print("不能将生成的新目录放在源目录下")
else:
if not os.path.isdir(target):
os.mkdir(target)
mkfloders(source, target)
else:
print("源文件夹不存在")
```
这个脚本首先获取命令行参数,然后定义了一个`isdir`函数来检查路径是否为目录且不等于`.svn`。`mkfloders`函数递归地遍历源目录,创建目标目录结构。在`if __name__ == "__main__":`块内,我们检查源目录是否存在,并在满足条件时调用`mkfloders`。
在使用这个脚本时,只需在命令行中输入`./folders.py 源目录 目标目录`,例如`./folders.py ./ /tmp/yyyyy`,它会在`/tmp`目录下创建一个名为`yyyyy`的新目录,其结构与源目录相同。
提到的一个问题`/usr/bin/python^M: bad interpreter: No such file or directory`,可能是由于文本编辑器在Windows环境下保存文件时产生了回车换行符(`\r\n`),而在Unix-like系统中需要的是行结束符(`\n`)。为解决此问题,可以确保在纯Unix环境中编辑或使用适当设置的跨平台编辑器。