【问题标题】:Listing of all files in directory?列出目录中的所有文件?
【发布时间】:2017-02-16 00:07:28
【问题描述】:

谁能帮我创建一个函数,使用pathlib库创建某个目录下所有文件的列表?

在这里,我有一个:

我有

  • c:\desktop\test\A\A.txt

  • c:\desktop\test\B\B_1\B.txt

  • c:\desktop\test\123.txt

我希望有一个包含上述路径的列表,但我的代码返回一个嵌套列表。

这是我的代码:

from pathlib import Path

def searching_all_files(directory: Path):   
    file_list = [] # A list for storing files existing in directories

    for x in directory.iterdir():
        if x.is_file():

           file_list.append(x)
        else:

           file_list.append(searching_all_files(directory/x))

    return file_list


p = Path('C:\\Users\\akrio\\Desktop\\Test')

print(searching_all_files(p))

希望有人能纠正我。

【问题讨论】:

  • 在第二种情况下使用extend而不是append

标签: python pathlib


【解决方案1】:

使用Path.glob() 列出所有文件和目录。然后将其过滤到List Comprehensions

p = Path(r'C:\Users\akrio\Desktop\Test').glob('**/*')
files = [x for x in p if x.is_file()]

更多来自pathlib 模块:

【讨论】:

  • 如果我想列出一个目录中的所有目录怎么办?
  • 要列出所有目录,只需将“x.is_file()”替换为“x.is_dir()”,如docs中所述
【解决方案2】:
from pathlib import Path
from pprint import pprint

def searching_all_files(directory):
    dirpath = Path(directory)
    assert dirpath.is_dir()
    file_list = []
    for x in dirpath.iterdir():
        if x.is_file():
            file_list.append(x)
        elif x.is_dir():
            file_list.extend(searching_all_files(x))
    return file_list

pprint(searching_all_files('.'))

【讨论】:

  • assert 是一个语句,而不是一个函数,所以我想你想要 assert dirpath.is_dir() 没有括号。在 Python 2 和 3 中。或者只是 assert dirpath.exists()
【解决方案3】:

如果您的文件具有相同的后缀,例如.txt,您可以使用rglob 递归列出主目录和所有子目录。

paths = list(Path(INPUT_PATH).rglob('*.txt'))

如果您需要对每个路径应用任何有用的Path function。例如,访问name 属性:

[k.name for k in Path(INPUT_PATH).rglob('*.txt')]

其中INPUT_PATH 是主目录的路径,Path 是从pathlib 导入的。

【讨论】:

    【解决方案4】:

    使用 Python 内置的 filter 函数可以实现与 @prasastoadi's one 类似的、更面向函数的解决方案:

    from pathlib import Path
    
    my_path = Path(r'C:\Users\akrio\Desktop\Test')
    list(filter(Path.is_file, my_path.glob('**/*')))
    

    【讨论】:

      【解决方案5】:

      有了pathlib,就跟下面的命令一样简单。

      path = Path('C:\\Users\\akrio\\Desktop\\Test')    
      list(path.iterdir())
      

      【讨论】:

        【解决方案6】:

        如果您可以假设只有文件对象的名称中包含 .(即 .txt、.png 等),您可以进行 glob 或递归 glob 搜索...

        from pathlib import Path
        
        # Search the directory
        list(Path('testDir').glob('*.*'))
        
        # Search directories and subdirectories, recursively
        list(Path('testDir').rglob('*.*'))
        

        但情况并非总是如此。有时会有像.ipynb_checkpoints 这样的隐藏目录和没有扩展名的文件。在这种情况下,请使用列表推导或过滤器将 Path 对象分类为文件。

        # Search Single Directory
        list(filter(lambda x: x.is_file(), Path('testDir').iterdir()))
        
        # Search Directories Recursively
        list(filter(lambda x: x.is_file(), Path('testDir').rglob('*')))
        
        # Search Single Directory
        [x for x in Path('testDir').iterdir() if x.is_file()]
        
        # Search Directories Recursively
        [x for x in Path('testDir').rglob('*') if x.is_file()]
        

        【讨论】:

          【解决方案7】:

          使用 pathlib2 要容易得多,

          from pathlib2 import Path
          
          path = Path("/test/test/")
          for x in path.iterdir():
              print (x)
          

          【讨论】:

          • pathlib2 已弃用。
          • 我没有看到 pathlib2 与这个问题有什么关系。似乎 pathlib2 只是 pathlib 的一个反向移植(到 Python 2.x),因此 pathlib2 中的path.iterdir() 不能递归地遍历目录。
          【解决方案8】:
          def searching_all_files(directory: Path):   
              file_list = [] # A list for storing files existing in directories
          
              for x in directory.iterdir():
                  if x.is_file():
                      file_list.append(x)#here should be appended
                  else:
                      file_list.extend(searching_all_files(directory/x))# need to be extended
          
              return file_list
          

          【讨论】:

            【解决方案9】:
            import pathlib
            
            def get_all_files(dir_path_to_search):
                filename_list = []
            
                file_iterator = dir_path_to_search.iterdir()
            
                for entry in file_iterator:
                        if entry.is_file():
                            #print(entry.name)
                            filename_list.append(entry.name)
            
                return filename_list
            

            我们可以测试的功能是-

            dir_path_to_search= pathlib.Path("C:\\Users\\akrio\\Desktop\\Test")
            print(get_all_files(dir_path_to_search))
            

            【讨论】:

            • 您的答案是正确的,但是您正在使用 OS 和 pathlib。我认为如果你只使用 pathlib 会更好
            • @PirateNinjas 感谢您的建议。我已经做出改变了。
            【解决方案10】:

            您可以使用 os.listdir()。它会为您提供目录中的所有内容 - 文件和目录。

            如果你只想要文件,你可以使用 os.path 过滤掉它:

            from os import listdir
            from os.path import isfile, join
            onlyfiles = [files for files in listdir(mypath) if isfile(join(mypath, files))]
            

            或者您可以使用 os.walk() ,它会为它访问的每个目录生成两个列表 - 为您拆分为文件和目录。如果您只想要顶级目录,则可以在第一次生成时中断

            from os import walk
            files = []
            for (dirpath, dirnames, filenames) in walk(mypath):
                files.extend(filenames)
                break
            

            【讨论】:

            • 要求是使用pathlib。还是谢谢你
            猜你喜欢
            • 2011-06-13
            • 1970-01-01
            • 1970-01-01
            • 2012-11-14
            • 2015-06-13
            • 2018-12-21
            • 1970-01-01
            • 2014-03-08
            相关资源
            最近更新 更多