【问题标题】:Python: how to search for specific "string" in directory name (not individual file names)Python:如何在目录名(不是单个文件名)中搜索特定的“字符串”
【发布时间】:2018-04-19 00:26:48
【问题描述】:

我想创建与特定字符串匹配的所有 文件路径名称 的列表,例如“04_DEM”,以便我可以对这些目录中的文件进行进一步处理?

例如

输入

 C:\directory\NewZealand\04DEM\DEM_CD23_1232.tif
 C:\directory\Australia\04DEM\DEM_CD23_1233.tif
 C:\directory\NewZealand\05DSM\DSM_CD23_1232.tif
 C:\directory\Australia\05DSM\DSM_CD23_1232.tif

想要的输出

 C:\directory\NewZealand\04DEM\
 C:\directory\Australia\04DEM\

这样可以确保只处理这些文件,因为目录中的其他一些文件的文件名中也包含相同的字符串“DEM”,我不想修改。

由于是Py代码的菜鸟,这是我的错误尝试

 import os

 for dirnames in os.walk('D:\Canterbury_2017Copy'):
     print dirnames
     if dirnames=='04_DEM' > listofdirectoriestoprocess.txt

 print "DONE CHECK TEXT FILE"

【问题讨论】:

  • 显示你写的代码没有产生你想要的输出。

标签: python python-2.7 path


【解决方案1】:

您可以为此使用os.path

import os

lst = [r'C:\directory\NewZealand\04DEM\DEM_CD23_1232.tif',
       r'C:\directory\Australia\04DEM\DEM_CD23_1233.tif',
       r'C:\directory\NewZealand\05DSM\DSM_CD23_1232.tif',
       r'C:\directory\Australia\05DSM\DSM_CD23_1232.tif']

def filter_paths(lst, x):
    return [os.path.split(i)[0] for i in lst if os.path.normpath(i).split(os.sep)[3] == x]

res = list(filter_paths(lst, '04DEM'))

# ['C:\\directory\\NewZealand\\04DEM',
#  'C:\\directory\\Australia\\04DEM']

【讨论】:

    【解决方案2】:

    使用in 检查所需字符串是否在另一个字符串中。

    这是一种快速的方法:

    new_list = []
    for path in path_list:
        if '04DEM' in path:
            new_list.append(path)
    

    演示

    s = 'C:/directory/NewZealand/04DEM/DEM_CD23_1232.tif'
    if '04DEM' in s:
        print(True)
    # True
    

    确保使用/\\ 作为目录分隔符而不是\,因为后者会转义字符。

    【讨论】:

      【解决方案3】:

      首先,您使用re 通过正则表达式进行选择,然后使用pathlib

      import re
      import pathlib
      pattern = re.compile('04DEM')
      # You use pattern.search() if s is IN the string
      # You use pattern.match() if s COMPLETELY matches the string.
      # Apply the correct function to your use case.
      files = [s in list_of_files if pattern.search(s)]
      all_pruned_paths = set()
      for p in files:
          total = ""
          for d in pathlib.Path(p):
              total = os.path.join(total, d)
              if pattern.search(s):
                  break
          all_pruned_paths.add(total)
      result = list(all_pruned_paths)
      

      这比使用in 更健壮,因为您将来可能需要形成更复杂的查询。

      【讨论】:

        猜你喜欢
        • 2017-02-11
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 2012-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多