Python 3.x 将路径目录与字典进行比较,并从字典中检索密钥以查找匹配项

Python 3.x 将路径目录与字典进行比较,并从字典中检索密钥以查找匹配项,python-3.x,Python 3.x,我有一个字典,其中键是数值,值是目录路径 我试图遍历一个文件夹(也有子文件夹),并为RDS表创建两列:1)文件名,2)该文件的文件夹路径数值(文件夹路径ID) 在尝试循环遍历文件夹及其子文件夹时,会得到重复的值。我认为,当存在子文件夹时,它会对每个子文件夹反复循环,我会得到文件及其关联文件夹路径ID的重复条目 这是响应['Content']的代码片段: {'ETag': '"0c7a50851d188f2d3b112a1f338b8c36"', 'Key': 'Repos/TEMPLATE/

我有一个字典,其中键是数值,值是目录路径

我试图遍历一个文件夹(也有子文件夹),并为RDS表创建两列:1)文件名,2)该文件的文件夹路径数值(文件夹路径ID)

在尝试循环遍历文件夹及其子文件夹时,会得到重复的值。我认为,当存在子文件夹时,它会对每个子文件夹反复循环,我会得到文件及其关联文件夹路径ID的重复条目

这是响应['Content']的代码片段:

{'ETag': '"0c7a50851d188f2d3b112a1f338b8c36"',
  'Key': 'Repos/TEMPLATE/Name/IRB/8-Recruitment '
         'Materials/path8.sh',
  'LastModified': '2019-05-23T23:18:16+00:00',
  'Owner': {'DisplayName': 'user001',
            'ID': '024ea7e7ee4dee8da7a426dbc2105e8f577f476d676d229473d96e7a0e63d274'},
  'Size': 50,
  'StorageClass': 'STANDARD'},
 {'ETag': '"0c7a50851d188f2d3b112a1f338b8c36"',
  'Key': 'Repos/TEMPLATE/Name/Reg. 1/1-Memos to File/Old '
         'Memos/path9.sh',
  'LastModified': '2019-05-23T23:18:16+00:00',
  'Owner': {'DisplayName': 'user001',
            'ID': '024ea7e7ee4dee8da7a426dbc2105e8f577f476d676d229473d96e7a0e63d274'},
  'Size': 50,
  'StorageClass': 'STANDARD'},
 {'ETag': '"0c7a50851d188f2d3b112a1f338b8c36"',
  'Key': 'Repos/TEMPLATE/Group Name/Reg. 1/Misc/path18.sh',
  'LastModified': '2019-05-23T23:18:16+00:00',
  'Owner': {'DisplayName': 'user001',
            'ID': '024ea7e7ee4dee8da7a426dbc2105e8f577f476d676d229473d96e7a0e63d274'}
目录是这样的字典:

13: 'Repos/TEMPLATE/Name/Reg. 1/1-Memos to File/Old', 
14: 'Repos/TEMPLATE/Name/Reg. 1/1-Memos to File/Misc',
INSERT INTO document.Document(documentName,folderID,repositoryID,recCreatedByUserID) 
    VALUES("path19.sh",13,1,35);
s3 = boto3.resource('s3')
bucket = s3.Bucket('tes0001-2019052325451')
result = bucket.meta.client.list_objects(Bucket=bucket.name,
                                     Delimiter="/*")
  FolderA
    |-FolderB
    |   |-File1
    |-FolderC
    |   |-File2
    |-FolderD
    |   |-File3
    |-FolderE
    |   |-File4
输出应如下所示:

13: 'Repos/TEMPLATE/Name/Reg. 1/1-Memos to File/Old', 
14: 'Repos/TEMPLATE/Name/Reg. 1/1-Memos to File/Misc',
INSERT INTO document.Document(documentName,folderID,repositoryID,recCreatedByUserID) 
    VALUES("path19.sh",13,1,35);
s3 = boto3.resource('s3')
bucket = s3.Bucket('tes0001-2019052325451')
result = bucket.meta.client.list_objects(Bucket=bucket.name,
                                     Delimiter="/*")
  FolderA
    |-FolderB
    |   |-File1
    |-FolderC
    |   |-File2
    |-FolderD
    |   |-File3
    |-FolderE
    |   |-File4
下面是我正在努力工作的代码。生成的值似乎是正确的,但如何消除重复的迭代

for file in response['Contents']:
    for k,v in directories.items():
        if os.path.dirname(file['Key']) in v:
            print(
                'INSERT INTO document.Document(documentName,folderID,repositoryID,recCreatedByUserID)',
                "\n",
               'VALUES("{}",{},1,{});'.format(os.path.basename(file['Key']),k,randint(1, 40)))
这与boto3结合使用,如下所示:

13: 'Repos/TEMPLATE/Name/Reg. 1/1-Memos to File/Old', 
14: 'Repos/TEMPLATE/Name/Reg. 1/1-Memos to File/Misc',
INSERT INTO document.Document(documentName,folderID,repositoryID,recCreatedByUserID) 
    VALUES("path19.sh",13,1,35);
s3 = boto3.resource('s3')
bucket = s3.Bucket('tes0001-2019052325451')
result = bucket.meta.client.list_objects(Bucket=bucket.name,
                                     Delimiter="/*")
  FolderA
    |-FolderB
    |   |-File1
    |-FolderC
    |   |-File2
    |-FolderD
    |   |-File3
    |-FolderE
    |   |-File4
获取S3存储桶的内容。理论上,此代码应该适用于任何桶


问题摘要: 我已经能够将这种行为缩小到:

对于根文件夹中的每个子文件夹,python都在子文件夹-1中循环。如果有5个子文件夹,我将获得所有5个子文件夹的输出,然后是4个子文件夹的输出,然后是3、2、1

我的文件夹结构如下:

13: 'Repos/TEMPLATE/Name/Reg. 1/1-Memos to File/Old', 
14: 'Repos/TEMPLATE/Name/Reg. 1/1-Memos to File/Misc',
INSERT INTO document.Document(documentName,folderID,repositoryID,recCreatedByUserID) 
    VALUES("path19.sh",13,1,35);
s3 = boto3.resource('s3')
bucket = s3.Bucket('tes0001-2019052325451')
result = bucket.meta.client.list_objects(Bucket=bucket.name,
                                     Delimiter="/*")
  FolderA
    |-FolderB
    |   |-File1
    |-FolderC
    |   |-File2
    |-FolderD
    |   |-File3
    |-FolderE
    |   |-File4
我得到以下输出:

A/B/1
A/C/2
A/D/3
A/E/4
A/C/2
A/D/3
A/E/4
A/D/3
A/E/4
A/E/4

不管一个文件夹中有多少子文件夹,我只需要循环浏览所有内容一次。在没有更多文件夹之前,不要在更少的文件夹上继续循环

请添加您当前的输出和所需的输出(不是文字,而是我们可以复制的格式),并添加
response['contents']
@Error syntactical懊悔我添加了更多内容。电流输出和期望输出相同,是正确的输出。唯一的问题是有额外的记录。我没有包括响应的全部内容,因为这将超过1000行代码。希望这是足够的信息。哪些记录是“额外”记录?抱歉,我只是想弄清楚什么是什么:P@Error-语法自责我添加了一个“问题摘要”,从高层次概述了我所看到的情况。我认为这只是FOR循环的一般问题。我对内容的循环次数超过了需要的次数。看起来,如果一个根文件夹中有5个子文件夹,我会在根文件夹中循环5次。如果子文件夹包含子文件夹,则此问题会更加复杂,以此类推。文件列表变得非常大,大部分内容都是冗余的。@错误语法自责非常感谢您的关注。我能够使用如下所述的os.walk方法:。复制示例并将“.”替换为根目录路径将生成文件夹结构中所有文件的列表,其路径如您所需。请添加您当前的输出和所需的输出(不是文字,而是我们可以复制的格式),并添加
response['contents']的内容
@Error syntactical懊悔我添加了更多内容。电流输出和期望输出相同,是正确的输出。唯一的问题是有额外的记录。我没有包括响应的全部内容,因为这将超过1000行代码。希望这是足够的信息。哪些记录是“额外”记录?抱歉,我只是想弄清楚什么是什么:P@Error-语法自责我添加了一个“问题摘要”,从高层次概述了我所看到的情况。我认为这只是FOR循环的一般问题。我对内容的循环次数超过了需要的次数。看起来,如果一个根文件夹中有5个子文件夹,我会在根文件夹中循环5次。如果子文件夹包含子文件夹,则此问题会更加复杂,以此类推。文件列表变得非常大,大部分内容都是冗余的。@错误语法自责非常感谢您的关注。我能够使用如下所述的os.walk方法:。复制示例并将“.”替换为根目录路径将生成文件夹结构中所有文件的列表,这些文件的路径符合您的期望。