J'ai 25 fichiers json dans un dossier, nommés 0.json à 24.json, et j'essaie d'ouvrir par lots et de renommer une "image" de périmètre à l'intérieur de chacun, qui ont actuellement tous un espace réservé de "https://" dans le champ "image".

Le .json apparaît actuellement comme suit pour chaque fichier json :


{"image": "https://", "attributes": [{"trait_type": "box color", "value": "blue"}, {"trait_type": "box shape", "value": "square"}]}

Mais devrait être

{"image": "https://weburlofnewimage/0", "attributes": [{"trait_type": "box color", "value": "blue"}, {"trait_type": "box shape", "value": "square"}]}

J'ai un dossier central sur un site comme dropbox, qui a une structure d'url de https://weburlofnewimage/0, /1, /2 etc. Et donc je voudrais ouvrir chaque fichier et changer la valeur de l'"image " à remplacer par "https://weburlofnewimage/ + numéro de fichier actuel + '.png'".

Jusqu'à présent, je suis capable de parcourir les fichiers et de modifier le périmètre de l'image avec succès dans les fichiers json, mais les fichiers semblent itérer dans un ordre aléatoire, donc sur la boucle 1, j'obtiens le fichier 20, et par conséquent le fichier 20 est URL de l'image du fichier 0 donné.

Code comme suit:

import json
import os

folderPath = r'/path/FolderWithJson/'
fileNumber = 0

for filename in os.listdir(folderPath):
    print('currently on file ' + str(fileNumber))
    if not filename.endswith(".json"): continue
    filePath = os.path.join(folderPath, filename)
 
    with open(filePath, 'r+') as f:
        data = json.load(f)
        data['image'] = str('https://weburlofnewimage/' + str(fileNumber) + '.png')
    print('opening file ' + str(filePath))
    
    os.remove(filePath)
    with open(filePath, 'w') as f:
        json.dump(data, f, indent=4)
    print('removing file ' + str(filePath))

    fileNumber +=1

Ce qui me permet d'obtenir les impressions suivantes :

currently on file 10 (on loops 10)
currently preparing file 2.json (its working on file #2...)
opening file /path/FolderWithJson/2.json
removing file /path/FolderWithJson/2.json

Et puis quand je regarde dans 2.json, je vois que l'image est changée en "https://weburlofnewimage/10.png" au lieu de "https://weburlofnewimage/2.png"

0
Meowsleydale 3 oct. 2021 à 03:56

2 réponses

Meilleure réponse

Tirez simplement le numéro du nom du fichier. N'utilisez pas votre propre compte. Et n'oubliez pas que vous n'avez jamais besoin d'utiliser la fonction str sur une chaîne. Beaucoup de gens semblent avoir cette mauvaise habitude.

import json
import os

folderPath = '/path/FolderWithJson/'

for filename in os.listdir(folderPath):
    if not filename.endswith(".json"): 
        continue
    fileNumber = os.path.splitext(filename)[0]
    print('currently on file', fileNumber)
    filePath = os.path.join(folderPath, filename)

    print('opening file', filePath)
    with open(filePath, 'r') as f:
        data = json.load(f)
        data['image'] = 'https://weburlofnewimage/'+fileNumber +'.png'

    print('rewriting file', filePath)
    with open(filePath, 'w') as f:
        json.dump(data, f, indent=4)
1
Tim Roberts 3 oct. 2021 à 01:05

Vous pouvez ouvrir un fichier avec un chemin direct, au lieu d'itérer dans le répertoire. J'utiliserais une boucle for pour insérer les nombres dans le chemin, de cette façon ils itéreraient dans l'ordre.

for fileNumber in range(0,24):
  with open(f'my_file/{fileNumber}.json') as f:
    ...doMyCode...
1
Owen Dostie 3 oct. 2021 à 01:05