Python for цикл добавляет только последний список в качестве значения - PullRequest
0 голосов
/ 14 февраля 2019

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

Первый отпечаток вЦикл показывает именно тот результат, который я ожидаю.

Однако второй отпечаток показывает пустые значения.

Третий отпечаток после инициализации класса показывает список последней подпапки как значение для каждого ключа.

Что я пропускаю или делаю неправильно?

class FileAndFolderHandling() :

    folders_and_files = dict()


    def __init__(self) :
        self.getSubfolderAndImageFileNames()


    def getSubfolderAndImageFileNames(self) :

        subfolder = ""
        files_in_subfolder = []

        for filename in glob.iglob('X:\\Some_Directory\\**\\*.tif', recursive=True) :

            if not subfolder == os.path.dirname(filename) and not subfolder == "" :
                print(subfolder + "  /  /  " + str(files_in_subfolder))
                self.folders_and_files[subfolder] = files_in_subfolder   
                files_in_subfolder.clear()
                print(self.folders_and_files)

            subfolder = os.path.dirname(filename) # new subfolder
            files_in_subfolder.append(os.path.basename(filename))



folder_content = FileAndFolderHandling()

print(folder_content.folders_and_files)

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Вы очищаете массив от того, что я вижу ...

files_in_subfolder.clear()

Удалите это и убедитесь, что ваше значение добавлено в переменную folder_and_files перед любой операцией очистки.

0 голосов
/ 14 февраля 2019

Похоже, что вы после defaultdict.

Я изменил ваш код следующим образом:

import glob, os
from collections import defaultdict

class FileAndFolderHandling() :
    folders_and_files = defaultdict(list)

    def __init__(self) :
        self.getSubfolderAndImageFileNames()

    def getSubfolderAndImageFileNames(self) :
        for filename in glob.iglob(r'C:\Temp\T\**\*.txt', recursive=True) :
            # print(filename)
            subfolder = os.path.dirname(filename)
            self.folders_and_files[subfolder].append(os.path.basename(filename))


folder_content = FileAndFolderHandling()

print(dict(folder_content.folders_and_files))

Output:
{'C:\\Temp\\T': ['X.txt'], 'C:\\Temp\\T\\X': ['X1.txt', 'X2.txt'], 'C:\\Temp\\T\\X2': ['X1.txt']}

defaultdict(list) создает новый список для каждого нового добавленного ключа.Это то, что вы, кажется, хотите, чтобы произошло в вашем коде.

0 голосов
/ 14 февраля 2019

Похоже, проблема в том, что вы на самом деле всегда используете один и тот же список.

Определение files_in_subfolder = [] создает список и назначает указатель на этот список в переменнойВы только что определили.Так что же происходит, когда вы присваиваете self.folders_and_files[subfolder] = files_in_subfolder, вы сохраняете только указатель на свой список (который одинаков на каждой итерации) в словаре, а не на фактический список.

Позже, когда вы делаетеfiles_in_subfolder.clear() вы очищаете список, на который указывал этот указатель, и, следовательно, на все записи словаря (как это всегда был один и тот же список).

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

Надеюсь, это поможет!

...