使用Python中的自定义结构将文件部署到目录

时间:2016-12-01 21:29:24

标签: python python-3.x directory-structure

我有多个文件对象,我想根据用户声明的要求将其重新部署到具有新结构的目录中。

例如,可能有这些文件对象:

1)root\name\date\type\filename
2)root\name\date\type\filename
3)root\name\date\type\filename

...我想在用户定义需要拆分类型> date->名称之后,在下面的新结构中保存(或复制它们):

1)root\type\date\name\filename
2)root\type\date\name\filename
3)root\type\date\name\filename

......甚至会失去以下等级:

1)root\type\filename
2)root\type\filename
3)root\type\filename

我只能拿出选项来进行长途搜索,获取初始列表,并且过滤过程只需使用基本字符串操作在新计算的文件夹结构中进行部署。

我觉得有人可能之前以聪明的方式完成了这项工作,并且可能已经存在库/模块来执行此操作。有没有人有任何想法?

2 个答案:

答案 0 :(得分:0)

如果您在UNIX环境中,实现此目的的更简单方法是使用带有cp命令的shell脚本。

例如,将所有文件从 / root / name / date / type / filename 复制为 / root / date / filename ;你需要做的事情:

cp /root/*/date/*/filename /root/date/filename

或者,如果要移动文件,请使用mv命令:

mv /root/*/date/*/filename /root/date/filename

您也可以通过Python运行这些命令,并使用os.system()作为:

import os
os.system("cp \root\*\date\*\filename root\date\filename")

有关详情,请查看:Calling an external command in Python

根据评论

修改。要将 / root / name / date / type / filename 复制到 / root / date / name / type / filename ,您需要执行以下操作:

cp /root/name/date/type/filename /root/date/name/type/filename

但在执行之前,请确保目录 / root / date / name / type 存在。为了确保它存在,如果没有使用带有mkdir选项的-p创建目录:

mkdir -p /root/date/name/type

答案 1 :(得分:0)

以下是使用Python glob的解决方案:

目前的级别是:姓名,日期,类型和文件名:

curr_levels = "name\\date\\type\\filename"
curr_levels = curr_levels.split("\\")

用户想要其他级别:类型,日期,名称和文件名:

user_levels = "type\\date\\name\\filename"
user_levels = user_levels.split("\\")

我们可以使用glob.iglob在4个级别上迭代树结构。 glob模式类似于:<src_dir>\*\*\*\*(但是,我们在这里使用更通用的方法)。

可以使用简单的字符串格式定义用户结构。 例如:Windows上的{type}\{date}\{name}\{filename}。 我们需要先创建目录结构,然后复制(或移动)文件。

pattern = os.path.join(source_dir, *("*" * len(curr_levels)))
fmt = os.sep.join(['{{{key}}}'.format(key=key) for key in user_levels])

for source_path in glob.iglob(pattern):
    source_relpath = os.path.relpath(source_path, source_dir)
    parts = source_relpath.split(os.sep)
    values = dict(zip(curr_levels, parts))
    target_relpath = fmt.format(**values)
    target_path = os.path.join(target_dir, target_relpath)
    parent_dir = os.path.dirname(target_path)
    if not os.path.exists(parent_dir):
        os.makedirs(parent_dir)
    shutil.copy2(source_path, target_path)

注意:如果您的source_dirtarget_dir(问题中的root)相同,则需要按glob.iglob顺序替换glob.glob在处理之前将整个文件列表存储在内存中。这是为了避免glob.iglob浏览您正在创建的目录树...