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

时间:2015-03-26 16:08:52

标签: python windows directory-structure

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

  • 包含shapefile(.shp)的“原始文件”子文件夹。
  • “已处理的文件”子文件夹,为空。

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

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

Folder structure

我查看了以下帖子,但遇到了一些麻烦:

以下是似乎运行愉快的脚本,烦人的是它不会产生错误所以这个真正的菜鸟无法看到问题出在哪里:

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  

1 个答案:

答案 0 :(得分:2)

我猜你在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字符串中的特殊字符。例如,它用于newline-command:\n

为了澄清您不希望将它用作特殊字符,但作为反斜杠本身,您必须使用另一个反斜杠“逃避”它:'\\'。这使得windows路径看起来像这样:

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

...或者您可以将字符串标记为“原始”字符串(或“文字字符串”),其中包含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为你做了许多与路径相关的事情。例如,如果您的脚本在{@ 1}}上读取目录,则在我的Windows系统上,分隔符已经被处理为双反斜杠。我没有必要检查 - 它通常只是硬编码的字符串,你必须要小心。

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

最后:主目录

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

因此,请检查主路径是否已正确解析,然后使用expanduser("~")模块的功能构建路径: - )

希望有所帮助!