如何使用Python处理每个目录中一个子文件夹到另一个子文件夹的文件?
How to process files from one subfolder to another in each directory using Python?
我在桌面上有一个基本的 file/folder 结构,其中 "Test" 文件夹包含 "Folder 1",后者又包含 2 个子文件夹:
- 包含形状文件 (.shp) 的 "Original files" 子文件夹。
- 一个空的 "Processed files" 子文件夹。
我正在尝试编写一个脚本来查看每个父文件夹(文件夹 1、文件夹 2 等),如果它找到一个 Original Files 子文件夹,它将 运行 一个函数并将结果输出到 Processed files 子文件夹中。
我制作了一个简单的图表来展示这一点,如果 文件夹 1 包含相关的子文件夹,那么该函数将 运行;如果 Folder 2 not 包含子文件夹,那么它会被忽略:
我查看了以下帖子,但遇到了一些问题:
python glob issues with directory with [] in name
Getting a list of all subdirectories in the current directory
How to list all files of a directory?
下面是看起来运行开心的脚本,烦人的是它没有产生错误所以这个真正的菜鸟看不出问题出在哪里:
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
-模块的强大功能构建您的路径 :-)
希望对您有所帮助!
我在桌面上有一个基本的 file/folder 结构,其中 "Test" 文件夹包含 "Folder 1",后者又包含 2 个子文件夹:
- 包含形状文件 (.shp) 的 "Original files" 子文件夹。
- 一个空的 "Processed files" 子文件夹。
我正在尝试编写一个脚本来查看每个父文件夹(文件夹 1、文件夹 2 等),如果它找到一个 Original Files 子文件夹,它将 运行 一个函数并将结果输出到 Processed files 子文件夹中。
我制作了一个简单的图表来展示这一点,如果 文件夹 1 包含相关的子文件夹,那么该函数将 运行;如果 Folder 2 not 包含子文件夹,那么它会被忽略:
我查看了以下帖子,但遇到了一些问题:
python glob issues with directory with [] in name
Getting a list of all subdirectories in the current directory
How to list all files of a directory?
下面是看起来运行开心的脚本,烦人的是它没有产生错误所以这个真正的菜鸟看不出问题出在哪里:
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
-模块的强大功能构建您的路径 :-)
希望对您有所帮助!