Python выполняет что-то другое в последней строке кортежа

Вопрос или проблема

Я вручную конструирую 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')  # Добавляем перевод строки в конце файла

Объяснение:

  1. Генераторное выражение: Используя генераторное выражение внутри метода join, мы создаем строку JSON для каждой строки из data. Это позволяет избежать добавления запятой в конце, т.к. join будет записывать только разделитель между элементами.

  2. Запись в файл: После генерации строки, мы открываем файл для записи и записываем туда результат. Для обеспечения корректного оформления, добавляем перевод строки в конце (это необязательно, но улучшает читаемость файла).

  3. Избежание ошибок с длиной: Обратите внимание, что мы избегаем сложных условий, связанных с длиной кортежа. Вместо этого мы просто формируем запись, которая автоматически устранит ненужные запятые.

Таким образом, данный подход является более "питоническим" и эффективным для вашей задачи, особенно при работе с динамическими и неопределенными объемами данных.

Оцените материал
Добавить комментарий

Капча загружается...