Comment pourrais-je ajouter 2 des mêmes clés juste avec screenshoturl2 et screenshoturl1 d'un dict à un fichier JSON ?

C'est le code que j'ai en ce moment et il fonctionne mais il n'ajoute que le premier screenshoturl1 et non screenshoturl2 et je n'ai aucune idée de comment le faire ajouter. Voir les réponses ici pour plus d'informations et peut-être utiles sur mon sujet

    #!/usr/bin/env python3
import os
import sys
import json
import fileinput

def NumberofScreenshots():
    global numberofscreenshots
    while True:
        try:
            numberofscreenshots = input("Number of Screenshots?: ")
            if numberofscreenshots == '':
                print("Please enter how much screenshots to include.")
                continue
            elif numberofscreenshots.isalpha():
                print("Please enter a number not a string.")
                continue
            else:
                break
        except ValueError:
            break
def ScreenshotURL():
    global screenshoturl1, screenshoturl2
    if numberofscreenshots == "1":
        screenshoturl1 = input("Screenshot URL: ")
    elif numberofscreenshots == "2":
        screenshoturl1 = input("Screenshot URL: ")
        screenshoturl2 = input("Screenshot URL: ")
    else:
        pass
def NumberofScreenshots1():
    if numberofscreenshots == "1":
        with open('path/to/json/file','r') as f:
            data = json.loads(f.read())

        data['tabs'][0]['views'][1]['screenshots'][0]

        data['tabs'][0]['views'][1]['screenshots']  =  data['tabs'][0]['views'][1]['screenshots'][0]

        data['tabs'][0]['views'][1]['screenshots'] = {"accessibilityText": "Screenshot","url": screenshoturl1,"fullSizeURL": screenshoturl1}

        with open('path/to/json/file', 'w') as f:
            f.write(json.dumps(data))
    else:
        print("Try again.")
def NumberofScreenshots2():
    global data
    if numberofscreenshots == "2":
        with open('path/to/json/file','r') as f:
            data = json.loads(f.read())

        data['tabs'][0]['views'][1]['screenshots'][0]
        print(data)

        data['tabs'][0]['views'][1]['screenshots'] = data['tabs'][0]['views'][1]['screenshots'][0]
        print(data)


        data['tabs'][0]['views'][1]['screenshots'].update({"accessibilityText": "Screenshot","url": screenshoturl1,"fullSizeURL": screenshoturl1, "accessibilityText": "Screenshot","url": screenshoturl2,"fullSizeURL": screenshoturl2})
        print(data)

        with open('path/to/json/file', 'w') as f:
            f.write(json.dumps(data))
    else:
        print("Try again.")


print("Pick Template:")
print("1. Default")
template = input("Template Name/Number: ")

if (template == "1"):
    NumberofScreenshots()
    ScreenshotURL()

    NumberofScreenshots1()
    NumberofScreenshots2()

# Show the user a error if they enter a number for a template that can't be found.
else:
    print("The template you are looking for can not be found!")

Nous regardons la fonction appelée NumberofScreenshots2

Fichier JSON:

{
  "tabs": [
    {
      "tabname": "Details",
      "views": [
        {
          "title": "Some Name",
          "useBoldText": true,
          "useBottomMargin": false,
          "class": "DepictionSubheaderView"
        },
        {
          "itemCornerRadius": 6,
          "itemSize": "",
          "screenshots": [
            {
              "accessibilityText": "Screenshot",
              "url": "Screenshot URL 1",
              "fullSizeURL": "Screenshot URL 1"
            },
            {
              "accessibilityText": "Screenshot",
              "url": "Screenshot URL 2",
              "fullSizeURL": "Screenshot URL 2"
            },
            {
              "accessibilityText": "Screenshot",
              "url": "Screenshot URL 3",
              "fullSizeURL": "Screenshot URL 3"
            },
            {
              "accessibilityText": "Screenshot",
              "url": "Screenshot URL 4",
              "fullSizeURL": "Screenshot URL 4"
            },
            {
              "accessibilityText": "Screenshot",
              "url": "Screenshot URL 5",
              "fullSizeURL": "Screenshot URL 5"
            }
          ],
          "ipad": {
            "itemCornerRadius": 9,
            "itemSize": "{320, 550.8266666666667}",
            "screenshots": [
              {
                "accessibilityText": "Screenshot",
                "url": " Screenshot URL?size=640",
                "fullSizeURL": "Screenshot URL"
              }
            ],
            "class": "DepictionScreenshotView"
          },
          "class": "DepictionScreenshotsView"
        },
        {
          "markdown": " Description",
          "useSpacing": true,
          "class": "DepictionMarkdownView"
        },
        {
          "class": "DepictionSeparatorView"
        },
        {
          "title": "Known Issues",
          "class": "DepictionHeaderView"
        },
        {
          "markdown": "None",
          "useSpacing": true,
          "class": "DepictionMarkdownView"
        },
        {
          "class": "DepictionSeparatorView"
        },
        {
          "title": "Latest Version",
          "class": "DepictionHeaderView"
        },
        {
          "title": "1.0",
          "text": "Latest Version Number",
          "class": "DepictionTableTextView"
        },
        {
          "title": "Released",
          "text": "3/10/19",
          "class": "DepictionTableTextView"
        },
        {
          "title": "Price",
          "text": "Free",
          "class": "DepictionTableTextView"
        },
        {
          "title": "Developer",
          "text": "TestDev",
          "class": "DepictionTableTextView"
        },
        {
          "title": "Contact Support",
          "action": "",
          "class": "DepictionTableButtonView"
        },
        {
          "spacing": 16,
          "class": "DepictionSpacerView"
        },
        {
          "spacing": 20,
          "class": "DepictionSpacerView"
        }
      ],
      "class": "DepictionStackView"
    },
    {
      "tabname": "Changelog",
      "views": [
        {
          "title": "1.0",
          "useBoldText": true,
          "useBottomMargin": true,
          "class": "DepictionSubheaderView"
        },
        {
          "markdown": "\t\n\u2022 Initial Release",
          "useSpacing": false,
          "class": "DepictionMarkdownView"
        },
        {
          "markdown": "<small style=\"color: #999; margin-top: -8px;\">Released 3/10/2019</small>",
          "useRawFormat": true,
          "class": "DepictionMarkdownView"
        }
      ],
      "class": "DepictionStackView"
    }
  ],
  "class": "DepictionTabView"
}

Je veux qu'il supprime tout dans screenshots et le rajoute avec l'entrée utilisateur qu'il a saisie dans screenshoturl1 et screenshoturl2 afin qu'il supprime tout comme les espaces réservés dans screenshots et n'ajoutez que 2 avec l'URL que l'utilisateur entre dans screenshoturl1 et screenshoturl2 et l'aide sera agréable.

Merci!

0
user11204574 14 mars 2019 à 20:22

2 réponses

Meilleure réponse

Si je comprends ce que vous essayez de faire ici, il semble que vous voudriez mettre à jour une ou deux des URL, une à la fois.

Ce que vous pouvez faire est de parcourir chaque élément de capture d'écran, un à la fois, et de le mettre à jour ou de l'arrêter. C'est plus facile et vous permet également de tous les mettre à jour si vous le souhaitez. Cela signifie également que nous n'avons pas à demander combien en faire à l'avance (nous nous arrêtons juste quand nous n'en avons plus).

import json

# Load the data
file_name = 'path/to/json/file'
with open(file_name) as fh:
    full_data = json.load(fh)

# Dig into the data to find the screenshots
screen_shots = full_data['tabs'][0]['views'][1]['screenshots']

# Loop over each screen shot, updating each one
for number, screen_shot in enumerate(screen_shots):
    print("Screenshot", number)
    print('\tCurrent data:', screen_shot)

    new_url = input(
        "\tPlease enter new URL (leave empty and press return to stop): "
    ).strip()

    if new_url:
        # Updating the data here will also update the 'full_data' object
        # as we are just referencing a part of it, not making copies
        screen_shot.update({"url": new_url, "fullSizeURL": new_url})
    else:
        print("\tAll done!")
        break

# Remove all entries which we did not update
screen_shots = screen_shots[:number]

# Save the data
with open(file_name, 'w') as fh:
    json.dump(full_data, fh, indent=4)

Une autre chose que vous voudrez peut-être examiner est le retour des résultats de vos fonctions au lieu d'utiliser des variables globales, car cela peut rapidement devenir très déroutant avec des scripts plus volumineux.

0
Jon Betts 22 mars 2019 à 11:54

Vous pouvez avoir votre valeur une collection (comme une liste ou un tuple). Pour plus de commodité, vous pouvez utiliser defaultdict. Donc si vous vouliez avoir deux valeurs pour une clé :

from collections import defaultdict

multiValueDict = defaultdict(list)

multiValueDict[1].append(1)
multiValueDict[1].append(2)
print(multiValueDict[1])

Et cela produit:

[1, 2]
0
hoodakaushal 14 mars 2019 à 17:57