列出目录中的所有文件?

时间:2016-10-07 04:54:44

标签: python pathlib

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

在这里,我有一个:

enter image description here

我有

  • 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))

希望有人能纠正我。

10 个答案:

答案 0 :(得分:17)

使用glob列出所有文件和目录。然后过滤它。

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

答案 1 :(得分:12)

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('.'))

答案 2 :(得分:4)

您可以使用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

答案 3 :(得分:2)

晚些时候参加聚会,但是可以通过使用内置的Python filter函数来实现与@prasastoadi类似的,更面向功能的解决方案

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

如果文件的后缀相同,例如.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导入的。

答案 6 :(得分:1)

如果您可以假设仅文件对象的名称(例如.txt,.png等)中带有.,则可以进行全局或递归全局搜索...

from pathlib import Path

# Search the directory
list(Path('testDir').glob('*.*'))

# Search directories and subdirectories, recursively
list(Path('testDir').rglob('*.*'))

但并非总是如此。有时存在诸如.ipynb_checkpoints之类的隐藏目录和不带扩展名的文件。在这种情况下,请使用列表理解或过滤器来整理路径文件。

# 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 :(得分:0)

使用pathlib2更容易,

<button id="gs-address-go" class="b-btn bold go-btn" onclick="$('#splash-get-walkscore-form').submit(); return false;" aria-label="Go"><span class="icon big-search"></span></button>

答案 8 :(得分:0)

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

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

答案 9 :(得分:-1)

import os
import pathlib

def get_all_files(dir_path_to_search):
    filename_list = []

    with os.scandir(dir_path_to_search) as entries:
        for entry in entries:
            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))
相关问题