Python for循环仅将最后一个列表附加为值

时间:2019-02-14 14:50:22

标签: python loops dictionary for-loop append

我正在遍历目录,并希望将文件夹中的所有文件作为列表存储在字典中,其中每个键是一个文件夹,文件列表是值。

循环中的第一个打印完全显示了我期望的输出。

但是,第二个打印显示空白值。

该类初始化后的第三张图显示最后一个子文件夹的列表作为每个键的值。

我在俯视什么或做错了什么?

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

看来您遇到的问题是您实际上总是在使用相同的列表。

定义files_in_subfolder = []将创建一个列表,并在您刚定义的变量中为该列表分配一个指针。因此发生的是,当您分配self.folders_and_files[subfolder] = files_in_subfolder时,您仅将指向列表的指针(每次迭代都相同)存储在字典中,而不是实际的列表中。

稍后,当您执行files_in_subfolder.clear()时,您将清除该指针指向的列表,并因此清除字典的所有条目(因为它始终是同一列表)。

为解决此问题,建议您为字典中的每个不同条目创建一个 new 列表,而不是每次迭代都将其清除。也就是说,将files_in_subfolder的定义从循环的外部移到循环的内部。

希望有帮助!

答案 1 :(得分:0)

您正在清除阵列,据我所知...

files_in_subfolder.clear()

删除它,并确保在执行任何清除操作之前将您的值添加到folder_and_files变量中。

答案 2 :(得分:0)

听起来您像在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)为添加的每个新密钥创建一个新列表。这就是您似乎想要在代码中发生的事情。