我在桌面上有一个基本的文件/文件夹结构,其中“测试”文件夹包含“文件夹1”,而该文件夹又包含2个子文件夹:
我正在尝试编写一个脚本,该脚本查找每个父文件夹(文件夹1,文件夹2等),如果找到原始文件子文件夹,它将运行一个函数并将结果输出到“已处理的文件”子文件夹中。
我制作了一个简单的图表来说明这一点,如果文件夹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'
...或者您可以使用“ procedures”将字符串标记为“原始”字符串(或“文字字符串”)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
)也将在运行python的系统的正确分隔符中转换。您也可以使用建立路径os.path.join()
。
您用于expanduser("~")
获取当前用户的主路径。那应该可以正常工作,但是如果您使用的是旧版本的python,则可能存在错误-请参见:Windows上的expanduser(“〜”)首先要寻找HOME
因此,请检查home-path是否正确解析,然后使用os
-module的功能构建路径:-)
希望有帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句