如何使用Python处理每个目录中一个子文件夹到另一个子文件夹的文件?

How to process files from one subfolder to another in each directory using Python?

我在桌面上有一个基本的 file/folder 结构,其中 "Test" 文件夹包含 "Folder 1",后者又包含 2 个子文件夹:

我正在尝试编写一个脚本来查看每个父文件夹(文件夹 1文件夹 2 等),如果它找到一个 Original Files 子文件夹,它将 运行 一个函数并将结果输出到 Processed files 子文件夹中。

我制作了一个简单的图表来展示这一点,如果 文件夹 1 包含相关的子文件夹,那么该函数将 运行;如果 Folder 2 not 包含子文件夹,那么它会被忽略:

我查看了以下帖子,但遇到了一些问题:

下面是看起来运行开心的脚本,烦人的是它没有产生错误所以这个真正的菜鸟看不出问题出在哪里:

import os, sys

from os.path import expanduser
home = expanduser("~")

for subFolders, files in os.walk(home + "\Test\" + "\*Original\"):
 if filename.endswith('.shp'):

    output = home + "\Test\" + "\*Processed\" + filename

    # do_some_function, output  

我猜你在 os.walk() 循环中混淆了一些东西。

我刚刚创建了一个简单的结构,如您的问题所示,并使用此代码获得了您要查找的内容:

root_dir = '/path/to/your/test_dir'
original_dir = 'Original files'
processed_dir = 'Processed files'

for path, subdirs, files in os.walk(root_dir):
    if original_dir in path:
        for file in files:
            if file.endswith('shp'):
                print('original dir: \t' + path)
                print('original file: \t' + path + os.path.sep + file)
                print('processed dir: \t' + os.path.sep.join(path.split(os.path.sep)[:-1]) + os.path.sep + processed_dir)
                print('processed file: ' + os.path.sep.join(path.split(os.path.sep)[:-1]) + os.path.sep + processed_dir + os.path.sep + file)
                print('')

如果您真的确定您的目录树是什么样子,我建议您只在目录爬网脚本中使用通配符。我宁愿使用文件夹的全名来搜索,就像在我的脚本中一样。

更新:路径

无论何时使用路径,请注意路径分隔符 - 斜线。

在 windows 系统上,反斜杠用于:

C:\any\path\you\name

大多数其他系统使用正常的正斜杠:

/the/path/you/want

在python中,可以直接使用正斜杠,没有任何问题:

path_var = '/the/path/you/want'

...与反斜杠相反。反斜杠是 python 字符串中的特殊字符。例如,它用于换行命令:\n

澄清一下,您不想将它用作特殊字符,而是将其用作反斜杠本身,您必须 "escape" 它,使用另一个反斜杠:'\'。这使得 windows 路径看起来像这样:

path_var = 'C:\any\path\you\name'

...或者您可以将字符串标记为 "raw" 字符串(或 "literal string"),并带有 r。请注意,通过这样做,您不能再在该字符串中使用特殊字符。

path_var = r'C:\any\path\you\name'

在您的评论中,您使用了示例 root_dir = home + "\Test\"。此字符串中的反斜杠在那里用作特殊字符,因此 python 试图理解反斜杠和以下字符:\T。我不确定这在 python 中是否有任何意义,但 \t 会被转换为制表位。无论哪种方式 - 都不会解析为您要使用的路径。

我想知道为什么您的其他示例有效。在 "C:\Users\me\Test\" 中, \U\m 应该会导致类似的错误。你还混合了单反斜杠和双反斜杠。

也就是说...

当您处理 OS 路径分隔符并尝试使用新路径时,还要注意 python 为您做了很多与路径有关的事情。例如,如果您的脚本像 os.walk() 那样读取目录,那么在我的 windows 系统上,分隔符已经被处理为双反斜杠。我不需要检查 - 它通常只是硬编码的字符串,您必须小心。

最后:Python os.path module 提供了很多方法来处理路径、分隔符等。例如,os.path.sep(以及 os.sep)将在 python 为 运行 的系统中转换为正确的分隔符。您还可以使用 os.path.join().

构建路径

最后:主目录

您使用 expanduser("~") 获取当前用户的主路径。这应该可以正常工作,但如果您使用的是旧 python 版本,则可能存在错误 - 请参阅:expanduser("~") on Windows looks for HOME first

因此请检查该主路径是否已正确解析,然后使用 os-模块的强大功能构建您的路径 :-)

希望对您有所帮助!