如何使用计数器遍历字典

时间:2019-07-29 12:25:48

标签: python dictionary for-loop

因此,我尝试使用dict进行排序循环。我想做的是在我的文件夹中有两个不同的json文件,我想在其中为每个json文件应用每个dict。意味着json文件1将是字典中的第一个文件,第二个json文件将是第二个字典。

discordHooks = {'swedish': [
                'https://discordapp.com/api/webhooks/xxxxxxxxxxxxxx/ASDFDFGDSFGSDFG',
                'https://discordapp.com/api/webhooks/xxxxxxxxxxxxxxxx/EAAEFAEFAFlF'],
                'italian':[
                'https://discordapp.com/api/webhooks/xxxxxxxxxxxxxx/qwertyuiop',
                'https://discordapp.com/api/webhooks/xxxxxxxxxxxxxxxx/lkjahgfdsa']
            }

def sendToDiscord():
    directory = os.fsencode('./slack')
    for counters, file in enumerate(os.listdir(directory)):
        filename = os.fsdecode(file)
        if filename.endswith(".json"):
            with open('./slack/' + filename) as slackAttachment:
                 print(discordHooks.get('italian', [counters]))

我的想法是我希望它使用for counters, file in enumerate(os.listdir(directory)):遍历每个json文件,而我希望它发生的是第一个循环将是第一个json文件==应该打印出第一个dict值而下一个循环将是第二个dict值。

但是我也不知道该怎么做,我也不想使用列表。

我如何循环遍历每个dict,所以json文件的第一个循环将是dict的第一个值,第二个循环将是dict的第二个值?


更新:

在我的文件夹中,我有两个json文件,第一个文件名为Thrill.json,第二个文件名为HelloWorld.json,它们始终相同(不会在任何位置添加新的json文件或删除json。时间)。

所以现在我正在使用代码:

discordHooks = {'swedish': [
                'https://discordapp.com/api/webhooks/xxxxxxxxxxxxxx/ASDFDFGDSFGSDFG',
                'https://discordapp.com/api/webhooks/xxxxxxxxxxxxxxxx/EAAEFAEFAFlF'],
                'italian':[
                'https://discordapp.com/api/webhooks/xxxxxxxxxxxxxx/qwertyuiop' #This going tobe applied for the first json,
                'https://discordapp.com/api/webhooks/xxxxxxxxxxxxxxxx/lkjahgfdsa' #this going to applied to second json]
            }

def sendToDiscord():
    directory = os.fsencode('./slack')
    for counters, file in enumerate(os.listdir(directory)):
        filename = os.fsdecode(file)
        if filename.endswith(".json"):
            with open('./slack/' + filename) as slackAttachment:
                 print(discordHooks.get('italian', [counters]))

所以基本上我想做的是我要第一个json Thrill打印出列表中的第一个值https://discordapp.com/api/webhooks/xxxxxxxxxxxxxx/qwertyuiop,当完成后,我们遍历第二个循环将打印出https://discordapp.com/api/webhooks/xxxxxxxxxxxxxxxx/lkjahgfdsa

多数民众赞成在其中,我稍后将在代码中应用json文件中包含值(我尚未编写任何代码),但重要的是,第一个json文件应具有来自Italian [0]的第一个webhook基本上。并且第二个json文件将具有第二个webhook意大利语[1]。

我希望现在情况更加清楚! :)

2 个答案:

答案 0 :(得分:2)

counters是一个整数,而您的dict的键是字符串(并且大多数是AFAICT的任意键),因此显然这不能按预期工作。

如果您根本不关心排序(如果目录内容和test dict内容之间实际上没有真正的关系),则可以将dict的值用作列表:

test_list = list(test.values())
for i, fname in enumerate(os.listdir(...)):
    print("i : {} - fname : {} - value : {}".format(i, fname, test_list[i]))

请注意,如果目录中的条目比字典中的条目多,这将导致崩溃。

如果订购很重要,那么您还有其他问题...

第一个是Python字典在3.7.x之前是无序的,因此,如果您想要一个适用于较早版本的Python的解决方案,则不能使用普通字典-您需要collections.OrderedDict或仅使用普通字典(key, value)元组列表(您可以从中重建字典:vals = [("foo": "xxx"), ("bar: "yyy")]; test = dict(vals)

第二个问题是os.listdir()被明确记录为没有被排序(或者更确切地说,为“任意排序”),这意味着即使连续两次调用,您也不能依靠相同的顺序在同一过程中的同一路径上),除了最终手动对列表进行排序之外,您无能为力。

长话短说:如果目录的内容和数据之间应该存在任何关系,则必须以一种或另一种方式自己明确实现此关系。

编辑:鉴于您有更新的问题,正确的解决方案是反过来解决此问题:在python中配置url-> filename映射,然后从该映射中读取文件,即:

# We're going to need this to solve possible path issues
# (relying on the current working directory is a recipe for headaches)
# NB: we assume the json files are in _HERE/slack/)
_HERE = os.path.dirname(os.path.abspath(__file__))

discordHooks = {
    # list of `(url, filename)` pairs
    'italian':[
      ('https://discordapp.com/api/webhooks/xxxxxxxxxxxxxx/qwertyuiop', 'jsonfile1.json'),
      ('https://discordapp.com/api/webhooks/xxxxxxxxxxxxxxxx/lkjahgfdsa' , 'jsonfile2.js')
    ]
}

for url, filename in discordHooks["italian"]:
    path = os.path.join(_HERE, "slack", filename)
    if not os.path.exists(path):
        # Don't know how you want to handle the case...
        raise ValueError("file {} not found".format(path))
    print("url: {} - path: {}".format(url, path))

答案 1 :(得分:0)

from pathlib import Path


def make_language_dict(thrill_hook: str, helloworld_hook: str):
    return {
        "Thrill": thrill_hook
        "HelloWorld": helloworld_hook
    }


discord_hooks = {
                    'swedish': make_language_dict(
                        thrill_hook='https://discordapp.com/api/webhooks/xxxxxxxxxxxxxx/ASDFDFGDSFGSDFG',
                        helloworld_hook='https://discordapp.com/api/webhooks/xxxxxxxxxxxxxxxx/EAAEFAEFAFlF'
                    ),
                    'italian':make_language_dict(
                        thrill_hook='https://discordapp.com/api/webhooks/xxxxxxxxxxxxxx/qwertyuiop',
                        helloworld_hook='https://discordapp.com/api/webhooks/xxxxxxxxxxxxxxxx/lkjahgfdsa'
                    ),
                }

def send_to_discord(directory: Path = Path(r"./slack")):
    for filepath in directory.glob("*.json"):
        with open(filepath.resolve()) as slack_attachment:
            for language in discord_hooks:
                 discord_hook = discord_hooks[language][filepath.stem]
                 print(discord_hook)
                 # Do stuff with the file and the discord_hook here...