繁体   English   中英

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

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

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

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

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

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

文件夹结构

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

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

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() loop中混合了一些东西。

我刚刚创建了一个简单的结构,如您的问题所示,并使用此代码来获取您正在寻找的内容:

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为你做了很多与路径相关的事情。 例如,如果您的脚本读取目录,就像os.walk()那样,在我的Windows系统上,分隔符已经被处理为双反斜杠。 我没有必要检查它 - 它通常只是硬编码的字符串,你必须要小心。

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

最后:主目录

您使用expanduser("~")来获取当前用户的主路径。 这应该工作正常,但如果你使用旧的python版本,可能会有一个错误 - 请参阅: Windows上的expanduser(“〜”)首先查找HOME

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

希望有所帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM