84

任何人都可以帮助我创建一个函数,该函数将使用库创建某个目录下所有文件的列表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))

希望有人能纠正我。

4

10 回答 10

141

用于Path.glob()列出所有文件和目录。然后在List Comprehensions中对其进行过滤。

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

更多来自pathlib模块:

于 2016-10-24T10:52:51.340 回答
31
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('.'))
于 2016-10-07T07:08:56.190 回答
12

使用 pathlib,它就像下面的命令一样简单。

path = Path('C:\\Users\\akrio\\Desktop\\Test')    
list(path.iterdir())
于 2021-08-02T12:04:58.817 回答
10

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

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

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

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

INPUT_PATH主目录的路径在哪里,Pathpathlib.

于 2019-11-19T12:48:42.193 回答
10

可以通过使用 Python 的内置函数来实现与@prasastoadi类似的、更面向功能的解决方案filter

from pathlib import Path

my_path = Path(r'C:\Users\akrio\Desktop\Test')
list(filter(Path.is_file, my_path.glob('**/*')))
于 2020-11-26T16:07:41.150 回答
8

如果您可以假设只有文件对象.的名称中有 a(即 .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()]
于 2020-07-17T17:06:21.993 回答
4

使用 pathlib2 要容易得多,

from pathlib2 import Path

path = Path("/test/test/")
for x in path.iterdir():
    print (x)
于 2019-11-12T19:52:08.227 回答
2
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
于 2016-10-07T05:06:20.020 回答
2
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))
于 2019-06-04T07:32:14.103 回答
0

您可以使用 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
于 2016-10-07T05:20:05.167 回答