Как изменить файлы в последовательном порядке цикла

#python

Вопрос:

У меня есть 25 файлов json в папке с именами от 0.json до 24.json, и я пытаюсь пакетно открыть и переименовать «изображение» периметра внутри каждого из них, в настоящее время все они имеют заполнитель «https://» в поле «изображение».

В настоящее время файл .json отображается следующим образом для каждого файла json:

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

 

но должно быть

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

У меня есть центральная папка на сайте, таком как dropbox, которая имеет структуру URL https://weburlofnewimage/0, /1, /2 и т.д. И поэтому я хотел бы открыть каждый файл и изменить значение ключа «изображение», который будет заменен на «https://weburlofnewimage/ текущий номер файла ‘.png'».

До сих пор мне удавалось перебирать файлы и успешно изменять периметр изображения в файлах json, однако файлы, похоже, повторяются в случайном порядке, поэтому в цикле 1 я получаю файл 20, и в результате файлу 20 присваивается URL-адрес изображения файла 0.

Код выглядит следующим образом:

 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
 

Что приводит к тому, что я получаю следующие распечатки:

 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

 

А затем, когда я смотрю в 2.json, я вижу, что изображение изменилось на «https://weburlofnewimage/10.png» вместо «https://weburlofnewimage/2.png»

Комментарии:

1. Да, os.listdir не сортирует его вывод. Если в названиях файлов указан номер, просто извлеките номер из имени. Я покажу вам ниже.

Ответ №1:

Просто вытяните номер из имени файла. Не используйте свой собственный счет. И, пожалуйста, помните, что вам никогда не нужно использовать str функцию для строки. Похоже, у многих людей появляется эта дурная привычка.

 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)
 

Ответ №2:

Вы можете открыть файл с прямым путем, вместо того, чтобы перебирать каталог. Я бы использовал цикл for для вставки чисел в путь, чтобы они повторялись по порядку.

 for fileNumber in range(0,24):
  with open(f'my_file/{fileNumber}.json') as f:
    ...doMyCode...