[英]Python for loop appends only the last list as value
我正在遍历目录,并希望将文件夹中的所有文件作为列表存储在字典中,其中每个键是一个文件夹,文件列表是值。
循环中的第一个输出准确显示了我期望的输出。
但是,第二张显示为空值。
类初始化后的第三张打印显示最后一个子文件夹的列表,作为每个键的值。
我忽略了什么或做错了什么?
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)
您似乎遇到的问题是您实际上总是使用相同的列表。
定义files_in_subfolder = []
会创建一个列表,并在您刚定义的变量中分配一个指向该列表的指针。 因此,发生的事情是,当您分配self.folders_and_files[subfolder] = files_in_subfolder
您仅将指向列表的指针(每次迭代都相同)存储在字典中,而不是实际列表中。
稍后,当您执行files_in_subfolder.clear()
您将清除该指针指向的列表,并因此清除字典的所有条目(因为它始终是同一列表)。
为了解决这个问题,我建议您为字典中的每个不同条目创建一个新列表,而不是为每次迭代清除它。 这就是将files_in_subfolder
的定义从循环外部移到循环内部。
希望能帮助到你!
从我所见,您正在清除阵列...
files_in_subfolder.clear()
删除该行,并确保在执行任何清除操作之前将您的值添加到folder_and_files变量中。
听起来您好像在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)
为添加的每个新密钥创建一个新列表。 这就是您似乎想要在代码中发生的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.