python iterate - Как я могу перебирать файлы в заданном каталоге?





directory recursively (6)


Вот как я перебираю файлы в Python:

import os

path = 'the/name/of/your/path'

folder = os.fsencode(path)

filenames = []

for file in os.listdir(folder):
    filename = os.fsdecode(file)
    if filename.endswith( ('.jpeg', '.png', '.gif') ): # whatever file types you're using...
        filenames.append(filename)

filenames.sort() # now you have the filenames and can do something with them

НЕТ ЭТИ ТЕХНИКИ ГАРАНТИЯ ЛЮБОГО ИСПОЛЬЗОВАНИЯ ИТЕРАЦИИ

Да, супер непредсказуемо. Обратите внимание, что я сортирую имена файлов, что важно, если порядок файлов имеет значение, то есть для видеокадров или сбора данных, зависящих от времени. Обязательно поместите индексы в свои имена!

Мне нужно перебирать все .asm файлы внутри заданного каталога и выполнять некоторые действия над ними.

Как это можно сделать эффективным образом?




Я еще не совсем доволен этой реализацией, я хотел иметь настраиваемый конструктор, который делает DirectoryIndex._make(next(os.walk(input_path))) , чтобы вы могли просто передать путь, в который вы хотите DirectoryIndex._make(next(os.walk(input_path))) список файлов. Редактирование приветствуется!

import collections
import os

DirectoryIndex = collections.namedtuple('DirectoryIndex', ['root', 'dirs', 'files'])

for file_name in DirectoryIndex(*next(os.walk('.'))).files:
    file_path = os.path.join(path, file_name)



Это приведет к повторению всех файлов-потомков, а не только непосредственно дочерних элементов каталога:

import os

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        #print os.path.join(subdir, file)
        filepath = subdir + os.sep + file

        if filepath.endswith(".asm"):
            print (filepath)



Оригинальный ответ:

for filename in os.listdir(directory):
    if filename.endswith(".asm") or filename.endswith(".py"): 
        # print(os.path.join(directory, filename))
        continue
    else:
        continue

Версия Python 3.6 выше, используя os - предполагая, что у вас есть путь к каталогу как объект str в переменной, называемой directory_in_str :

directory = os.fsencode(directory_in_str)

for file in os.listdir(directory):
    filename = os.fsdecode(file)
    if filename.endswith(".asm") or filename.endswith(".py"): 
        # print(os.path.join(directory, filename))
        continue
    else:
        continue

Или рекурсивно, используя pathlib :

from pathlib import Path

pathlist = Path(directory_in_str).glob('**/*.asm')
for path in pathlist:
    # because path is object not string
    path_in_str = str(path)
    # print(path_in_str)



Вы можете попробовать использовать модуль glob

import glob

for filepath in glob.iglob('my_dir/*.asm'):
    print(filepath)



Эта реализация реализует вашу цель, динамически заполняя массив строк содержимым указанного каталога.

int exploreDirectory(const char *dirpath, char ***list, int *numItems) {
    struct dirent **direntList;
    int i;
    errno = 0;

    if ((*numItems = scandir(dirpath, &direntList, NULL, alphasort)) == -1)
        return errno;

    if (!((*list) = malloc(sizeof(char *) * (*numItems)))) {
        fprintf(stderr, "Error in list allocation for file list: dirpath=%s.\n", dirpath);
        exit(EXIT_FAILURE);
    }

    for (i = 0; i < *numItems; i++) {
        (*list)[i] = stringDuplication(direntList[i]->d_name);
    }

    for (i = 0; i < *numItems; i++) {
        free(direntList[i]);
    }

    free(direntList);

    return 0;
}






python iterator directory