#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...