【问题标题】:How to filter files (with known type) from os.walk?如何从 os.walk 过滤文件(已知类型)?
【发布时间】:2009-07-24 08:40:31
【问题描述】:

我有来自os.walk 的列表。但我想排除一些目录和文件。我知道如何处理目录:

for root, dirs, files in os.walk('C:/My_files/test'):
    if "Update" in dirs:
        dirs.remove("Update")

但是我如何处理我知道的文件类型。因为这不起作用:

if "*.dat" in files:
    files.remove("*.dat")

【问题讨论】:

    标签: python


    【解决方案1】:
    files = [ fi for fi in files if not fi.endswith(".dat") ]
    

    【讨论】:

      【解决方案2】:

      排除多个扩展。

      files = [ file for file in files if not file.endswith( ('.dat','.tar') ) ]
      

      【讨论】:

        【解决方案3】:

        还有一种方式,因为我刚刚写了这个,然后偶然发现了这个问题:

        files = filter(lambda file: not file.endswith('.txt'), files)

        注意在 python3 过滤器中返回一个生成器,而不是一个列表,并且列表理解是“首选”。

        【讨论】:

          【解决方案4】:

          简洁的写法,如果你经常这样做的话:

          def exclude_ext(ext):
              def compare(fn): return os.path.splitext(fn)[1] != ext
              return compare
          
          files = filter(exclude_ext(".dat"), files)
          

          当然,exclude_ext 包含在您相应的实用程序包中。

          【讨论】:

            【解决方案5】:
            files = [file for file in files if os.path.splitext(file)[1] != '.dat']
            

            【讨论】:

              【解决方案6】:

              试试这个:

              import os
              
              skippingWalk = lambda targetDirectory, excludedExtentions: (
                  (root, dirs, [F for F in files if os.path.splitext(F)[1] not in excludedExtentions]) 
                  for (root, dirs, files) in os.walk(targetDirectory)
              )
              
              for line in skippingWalk("C:/My_files/test", [".dat"]):
                  print line
              

              这是一个生成器表达式生成 lambda 函数。您向它传递一个路径和一些扩展名,它会使用该路径调用 os.walk,使用列表推导过滤掉不需要的扩展名列表中具有扩展名的文件,然后返回结果。

              (编辑:删除了.upper() 语句,因为不同大小写的扩展之间可能存在实际差异 - 如果您希望它不区分大小写,请在os.path.splitext(F)[1] 之后添加.upper() 并以大写字母传递扩展。 )

              【讨论】:

                【解决方案7】:

                使用 os.walk() 过滤具有已知类型的文件的最简单方法是告诉路径并使用 if 语句获取由扩展名过滤的所有文件。

                for base, dirs, files in os.walk(path):
                
                    if files.endswith('.type'):
                
                       #Here you will go through all the files with the particular extension '.type'
                       .....
                       .....
                

                【讨论】:

                • 小心,os.walk 返回一个生成根目录、目录和文件的生成器,files 是文件的列表。我认为列表理解和过滤器的答案很清楚。
                【解决方案8】:

                应该正是你所需要的:

                if thisFile.endswith(".txt"):
                

                【讨论】:

                • 别提了,你下一行要做什么还不清楚。
                【解决方案9】:

                另一种解决方案是使用 fnmatch 模块中的函数:

                def MatchesExtensions(name,extensions=["*.dat", "*.txt", "*.whatever"]):
                  for pattern in extensions:
                    if fnmatch.fnmatch(pattern):
                      return True
                  return False
                

                这样您就避免了大写/小写扩展的所有麻烦。这意味着您在必须匹配 *.JPEG、*.jpeg、*.JPeg、*.Jpeg 时不需要转换为低/大

                【讨论】:

                  【解决方案10】:

                  以上所有答案都有效。只是想为其他任何文件可能来自异构来源的人添加,例如从 Internet 下载档案中的图像。在这种情况下,由于类 Unix 系统区分大小写,您最终可能会拥有像“.PNG”和“.png”这样的扩展名。这些将被endswith 方法视为不同的字符串,即'.PNG'.endswith('png') 将返回False。为了避免这个问题,使用lower()函数。

                  【讨论】:

                    【解决方案11】:

                    这里是如何在以特定扩展名结尾的目录中查找所有文件

                     import glob, os
                     path=os.path.expanduser('C:\\Users\\A')
                     for filename in [item for item in os.listdir(path) if item.endswith(".ipynb")  ]:
                           print(filename)
                    

                    【讨论】:

                      猜你喜欢
                      • 2011-07-05
                      • 2021-01-09
                      • 1970-01-01
                      • 2011-01-25
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-02-14
                      • 2012-09-15
                      相关资源
                      最近更新 更多