【问题标题】:Process a set of files from a source directory to a destination directory in Python在 Python 中处理从源目录到目标目录的一组文件
【发布时间】:2010-04-07 14:45:51
【问题描述】:

在 python 中是 全新的 我正在尝试对 python 中的一组文件运行命令。该命令需要源文件和目标文件(我实际上使用的是 imagemagick convert,如下例所示)。

我可以同时提供源目录和目标目录,但是我不知道如何轻松地保留从源目录到目标目录的目录结构。

例如假设srcdir 包含以下内容:

srcdir/
   file1
   file3
   dir1/
       file1
       file2

然后我希望程序在destdir 上创建以下目标文件:destdir/file1destdir/file3destdir/dir1/file1destdir/dir1/file2

到目前为止,这是我想出的:

import os
from subprocess import call

srcdir = os.curdir # just use the current directory
destdir = 'path/to/destination'

for root, dirs, files in os.walk(srcdir):
    for filename in files:
        sourceFile = os.path.join(root, filename)
        destFile = '???'
        cmd = "convert %s -resize 50%% %s" % (sourceFile, destFile)
        call(cmd, shell=True)

walk 方法不直接提供文件在srcdir 下的目录,只是将根目录字符串与文件名连接起来。有没有一些简单的方法来获取目标文件,或者我必须做一些字符串操作才能做到这一点?

【问题讨论】:

  • 您说“获取目标文件”,但对我来说,您希望目标文件名 + 路径是什么并不明显。请问你能详细说明吗?是否要保留相对于 srcdirdestdir 的目录结构?

标签: python path


【解决方案1】:

将循环更改为:

for root, dirs, files in os.walk(srcdir):
    destroot = os.path.join(destdir, root[len(srcdir):])
    for adir in dirs:
        os.makedirs(os.path.join(destroot, adir))
    for filename in files:
        sourceFile = os.path.join(root, filename)
        destFile = os.path.join(destroot, filename)
        processFile(sourceFile, destFile)

【讨论】:

  • 这可能与我为 SilentGhost 的回答指出的问题相同——例如,如果 srcdir 是“foo/bar”,那么 root 将是“foo/bar/baz”,所以“root[ len(srcdir):]" 将是 "/baz"。当您执行 os.path.join 并且第二个参数是绝对路径(至少在 unix 上是“/baz”)时,它只会丢弃 destdir 部分;所以你最终会得到 destroot="/baz"。
  • root[len(srcdir)+len(os.sep):]替换root[len(srcdir):]
【解决方案2】:

有一些相对路径脚本可以满足您的需求——即找到两条路径之间的相对路径。例如:

不幸的是,我认为这个功能从未被添加到核心 python 中。

【讨论】:

    【解决方案3】:

    虽然不漂亮,但这将保留树的目录结构:

    _, _, subdirs = root.partition(srcdir)
    destfile = os.path.join(destdir, subdirs[1:], filename)
    

    【讨论】:

    • 这里你需要小心——你可能会得到一个以 '/' 或 '\' 开头的“subdirs”字符串,这会使 os.path.join 将其视为绝对路径,丢弃表达式的 destdir 部分。不过,如果您知道自己使用的是什么操作系统,则很容易解决这个问题。
    • @Edward:这就是我做切片的原因,不是吗?
    • subdirs.lstrip(os.sep)替换subdirs[:1]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多