Вопрос или проблема
Я вручную конструирую JSON, и я хочу, чтобы последний элемент не имел разделителя ,
перед ]
.
Это мой код, и документация говорит, что len() работает для кортежей, но я не могу заставить его работать. data
— это кортеж, созданный с помощью SQLite.fetchall(), и он был проверен.
for row in data:
f.write("{\n")
f.write(f"'PUT':'{row[1]}'\n")
if row == len(data): # Я также пробовал len(data)-1, как предлагали в постах
f.write("}\n")
else:
f.write("},\n")
Этот код создает JSON, но все элементы, включая последний, имеют разделитель ,
.
Какой самый правильный способ сделать это на Python?
Используйте str.join
, чтобы помочь вам форматировать записи, это получит все, кроме последней, и вы можете объединить на \n
с последней записью:
# объедините последний `\n` в конце после соединения
records=",\n".join(
"{\n'PUT':'{value}'\n}".format(value=row[1])
for row in data
) + '\n'
with open(file) as fh:
fh.write(records)
Ответ или решение
Для решения вашей проблемы с формированием JSON в Python без запятой перед закрывающей квадратной скобкой, можно воспользоваться методом str.join()
, который поможет вам избежать добавления запятой после последнего элемента. В данном случае вы можете использовать генераторное выражение для создания строк JSON для каждой строки данных, а затем объединить их с помощью разделителя.
Вот пример кода, который выполняет требуемую задачу:
# Сначала мы генерируем все строки JSON из кортежа `data`, исключая запятую после последнего элемента.
records = ",\n".join(
"{\n'PUT':'{value}'\n}".format(value=row[1])
for row in data
)
# Далее записываем созданные записи в файл
with open('output.json', 'w') as fh:
fh.write(records + '\n') # Добавляем перевод строки в конце файла
Объяснение:
-
Генераторное выражение: Используя генераторное выражение внутри метода
join
, мы создаем строку JSON для каждой строки изdata
. Это позволяет избежать добавления запятой в конце, т.к.join
будет записывать только разделитель между элементами. -
Запись в файл: После генерации строки, мы открываем файл для записи и записываем туда результат. Для обеспечения корректного оформления, добавляем перевод строки в конце (это необязательно, но улучшает читаемость файла).
-
Избежание ошибок с длиной: Обратите внимание, что мы избегаем сложных условий, связанных с длиной кортежа. Вместо этого мы просто формируем запись, которая автоматически устранит ненужные запятые.
Таким образом, данный подход является более "питоническим" и эффективным для вашей задачи, особенно при работе с динамическими и неопределенными объемами данных.