Подтвердить что ты не робот

Как проходить через файлы в каталоге?

У меня есть файлы журналов каталогов. Я хочу обрабатывать каждый файл внутри этого каталога с помощью Python script.

for file in directory:
      # do something

Как мне это сделать?

4b9b3361

Ответ 1

С os.listdir() или os.walk(), в зависимости от того, хотите ли вы сделать это рекурсивно.

Ответ 2

В Python 2 вы можете попробовать что-то вроде:

import os.path

def print_it(x, dir_name, files):
    print dir_name
    print files

os.path.walk(your_dir, print_it, 0)

Примечание: третий аргумент os.path.walk - это то, что вы хотите. Вы получите это как первый аргумент обратного вызова.

В Python 3 os.path.walk был удален; используйте вместо этого os.walk. Вместо обратного вызова вы просто передаете ему каталог, и он выдает (dirpath, dirnames, filenames) тройки. Таким образом, грубый эквивалент вышеупомянутого становится

import os

for dirpath, dirnames, filenames in os.walk(your_dir):
    print dirpath
    print dirnames
    print filenames

Ответ 3

import os
# location of directory you want to scan
loc = '/home/sahil/Documents'
# global dictonary element used to store all results
global k1 
k1 = {}

# scan function recursively scans through all the diretories in loc and return a dictonary
def scan(element,loc):

    le = len(element)

    for i in range(le):   
        try:

            second_list = os.listdir(loc+'/'+element[i])
            temp = loc+'/'+element[i]
            print "....."
            print "Directory %s " %(temp)
            print " "
            print second_list
            k1[temp] = second_list
            scan(second_list,temp)

        except OSError:
            pass

    return k1 # return the dictonary element    


# initial steps
try:
    initial_list = os.listdir(loc)
    print initial_list
except OSError:
    print "error"


k =scan(initial_list,loc)
print " ..................................................................................."
print k

Я сделал этот код в качестве сканера каталога, чтобы сделать функцию воспроизведения для моего аудиоплеера, и он будет рекурсивно сканировать все подкаталоги, присутствующие в каталоге.

Ответ 4

Вы можете перечислить каждый файл из каталога, рекурсивный, как это.

from os import listdir
from os.path import isfile, join, isdir

def getAllFilesRecursive(root):
    files = [ join(root,f) for f in listdir(root) if isfile(join(root,f))]
    dirs = [ d for d in listdir(root) if isdir(join(root,d))]
    for d in dirs:
        files_in_d = getAllFilesRecursive(join(root,d))
        if files_in_d:
            for f in files_in_d:
                files.append(join(root,f))
    return files

Ответ 5

Вы можете попробовать glob:

import glob

for file in glob.glob('log-*-*.txt'):
  # Etc.

Но glob не работает рекурсивно (насколько я знаю), поэтому, если ваши журналы находятся в папках внутри этого каталога, вам будет лучше смотреть на то, что Ignacio Vazquez-Abrams.

Ответ 6

import os
rootDir = '.'
for dirName, subdirList, fileList in os.walk(rootDir):
    print('Found directory: %s' % dirName)
    for fname in fileList:
        print('\t%s' % fname)
    # Remove the first entry in the list of sub-directories
    # if there are any sub-directories present
    if len(subdirList) > 0:
        del subdirList[0]

Ответ 7

Если вам нужно проверить несколько типов файлов, используйте

glob.glob("*.jpg") + glob.glob("*.png")

Glob не заботится о заказе файлов в списке. Если вам нужны файлы, отсортированные по имени файла, используйте

sorted(glob.glob("*.jpg"))

Ответ 8

Здесь моя версия рекурсивного обходчика файлов, основанная на ответе Матеуса Араужо, который может принимать необязательные аргументы списка исключений, что очень полезно при работе с копиями дерева, где не нужны некоторые директории/файлы/расширения файлов.

import os

def get_files_recursive(root, d_exclude_list=[], f_exclude_list=[], ext_exclude_list=[], primary_root=None):
"""
Walk a path to recursively find files
Modified version of https://stackoverflow.com/a/24771959/2635443 that includes exclusion lists
:param root: path to explore
:param d_exclude_list: list of root relative directories paths to exclude
:param f_exclude_list: list of filenames without paths to exclude
:param ext_exclude_list: list of file extensions to exclude, ex: ['.log', '.bak']
:param primary_root: Only used for internal recursive exclusion lookup, don't pass an argument here
:return: list of files found in path
"""

# Make sure we use a valid os separator for exclusion lists, this is done recursively :(
d_exclude_list = [os.path.normpath(d) for d in d_exclude_list]

files = [os.path.join(root, f) for f in os.listdir(root) if os.path.isfile(os.path.join(root, f))
         and f not in f_exclude_list and os.path.splitext(f)[1] not in ext_exclude_list]
dirs = [d for d in os.listdir(root) if os.path.isdir(os.path.join(root, d))]
for d in dirs:
    p_root = os.path.join(primary_root, d) if primary_root is not None else d
    if p_root not in d_exclude_list:
        files_in_d = get_files_recursive(os.path.join(root, d), d_exclude_list, f_exclude_list, ext_exclude_list, primary_root=p_root)
        if files_in_d:
            for f in files_in_d:
                files.append(os.path.join(root, f))
return files

Ответ 9

Это обновление моей последней версии, которая принимает подстановочные знаки стиля glob в списках исключений. Функция в основном входит в каждый подкаталог данного пути и возвращает список всех файлов из этих каталогов в виде относительных путей. Функция работает как ответ Матеуса и может использовать дополнительные списки исключений.

Например:

files = get_files_recursive('/some/path')
files = get_files_recursive('/some/path', f_exclude_list=['.cache', '*.bak'])
files = get_files_recursive('C:\\Users', d_exclude_list=['AppData', 'Temp'])
files = get_files_recursive('/some/path', ext_exclude_list=['.log', '.db'])

Надеюсь, это поможет кому-то, как мне помог первоначальный ответ этой темы :)

import os
from fnmatch import fnmatch

def glob_path_match(path, pattern_list):
    """
    Checks if path is in a list of glob style wildcard paths
    :param path: path of file / directory
    :param pattern_list: list of wildcard patterns to check for
    :return: Boolean
    """
    return any(fnmatch(path, pattern) for pattern in pattern_list)


def get_files_recursive(root, d_exclude_list=None, f_exclude_list=None, ext_exclude_list=None, primary_root=None):
    """
    Walk a path to recursively find files
    Modified version of https://stackoverflow.com/a/24771959/2635443 that includes exclusion lists
    and accepts glob style wildcards on files and directories
    :param root: path to explore
    :param d_exclude_list: list of root relative directories paths to exclude
    :param f_exclude_list: list of filenames without paths to exclude
    :param ext_exclude_list: list of file extensions to exclude, ex: ['.log', '.bak']
    :param primary_root: Only used for internal recursive exclusion lookup, don't pass an argument here
    :return: list of files found in path
    """

    if d_exclude_list is not None:
        # Make sure we use a valid os separator for exclusion lists, this is done recursively :(
        d_exclude_list = [os.path.normpath(d) for d in d_exclude_list]
    else:
        d_exclude_list = []
    if f_exclude_list is None:
        f_exclude_list = []
    if ext_exclude_list is None:
        ext_exclude_list = []

    files = [os.path.join(root, f) for f in os.listdir(root) if os.path.isfile(os.path.join(root, f))
             and not glob_path_match(f, f_exclude_list) and os.path.splitext(f)[1] not in ext_exclude_list]
    dirs = [d for d in os.listdir(root) if os.path.isdir(os.path.join(root, d))]
    for d in dirs:
        p_root = os.path.join(primary_root, d) if primary_root is not None else d
        if not glob_path_match(p_root, d_exclude_list):
            files_in_d = get_files_recursive(os.path.join(root, d), d_exclude_list, f_exclude_list, ext_exclude_list,
                                             primary_root=p_root)
            if files_in_d:
                for f in files_in_d:
                    files.append(os.path.join(root, f))
    return files