2014-01-10 3 views
1

Я создаю генератор отчетов, который запрашивает определенную информацию через API, а затем анализирует или записывает ответ в файл CSV.Python Report Builder

У меня все это хорошо работает.

Проблема в том, что в ответе API есть пустое поле. Это приводит к тому, что столбцы в CSV «сворачиваются».

Пример

URL CATEGORY USER 
URL USER 
URL CATEGORY USER 

Вот пример сырого ответа API, содержащего две линии (линия начинается с { "URL"). Второй отсутствуют «sales_tax_value» так что некоторые, как нужно пустое поле, вставив для компенсации:

{ 
    "expenses": [ 
     { 
      "url": "xxxxxx", 
      "user": " xxxxxx ", 
      "project": " xxxxxx ", 
      "category": "xxxxxx ", 
      "dated_on": "xxxxxx ", 
      "currency": "xxxxxx ", 
      "gross_value": "xxxxxx", 
      "native_gross_value": " xxxxxx ", 
      "sales_tax_rate": " xxxxxx ", 
      "sales_tax_value": " xxxxxx ", 
      "native_sales_tax_value": " xxxxxx", 
      "description": " xxxxxx ", 
      "mileage": " xxxxxx ", 
      "engine_size_index": "xxxxxx", 
      "engine_type_index": "xxxxxx", 
      "vehicle_type": "xxxxxx", 
      "initial_rate_mileage": " xxxxxx ", 
      "have_vat_receipt": "xxxxxx", 
      "updated_at": " xxxxxx ", 
      "created_at": " xxxxxx " 
     }, 
     { 
      "url": "xxxxxx", 
      "user": " xxxxxx ", 
      "project": " xxxxxx ", 
      "category": "xxxxxx ", 
      "dated_on": " xxxxxx ", 
      "currency": " xxxxxx ", 
      "gross_value": " xxxxxx ", 
      "native_gross_value": " xxxxxx ", 
      "sales_tax_rate": " xxxxxx ", 
      "description": " xxxxxx ", 
      "mileage": " xxxxxx ", 
      "engine_size_index": "xxxxxx", 
      "engine_type_index": "xxxxxx", 
      "vehicle_type": " xxxxxx ", 
      "initial_rate_mileage": " xxxxxx ", 
      "have_vat_receipt": "xxxxxx", 
      "updated_at": " xxxxxx ", 
      "created_at": " xxxxxx " 
     } 
    ] 
} 

Я попытался длинный ряд «если» заявление, чтобы проверить, если каждый «заголовок» присутствует, и если не добавлять это к линии, но это пока не увенчалось успехом. Это привело к созданию некоторых больших (1.1GB) CSV-файлов. Я поставил это на плохо написанные петли с моей стороны.

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

+0

показать нам свой код, чтобы мы могли определить, как его исправить. – dugres

ответ

1

Если вы используете csv.DictWriter() class, вы можете передать свои словари непосредственно писателю, и он будет обрабатывать недостающие ключи для вас:

import csv 

with open(outputfilename, 'wb') as outfh: 
    writer = csv.DictWriter(outfh, fieldnames=('url', 'category', 'user'), extrasaction='ignore') 
    writer.writerows(data['expenses']) 

Примечание:

  1. fieldnames аргумент определяет, какие ключи csv.DictWriter() будет использовать для записи в файл CSV.
  2. Аргумент ключевого слова extrasaction='ignore' говорит писателю просто игнорировать любые другие ключи в словаре.
  3. Любые отсутствующие ключи во входном словаре используют аргумент restval, который по умолчанию соответствует пустой строке. Это означает, что, если отсутствует ключ категории, столбец по-прежнему будет добавлен в выходной файл как пустое значение.
  4. Вы можете просто пройти в всегоexpenses всего за один шаг до writer.writerows().
+0

Большое спасибо за большой совет. Я использовал модуль CSV, но прочитал ответ с помощью json.loads, прежде чем передавать его через csv writer. Еще раз спасибо за помощь. – Karl

1

Declare из списка полей, которые вы хотите, чтобы выводиться в файл CSV:

fields = ['url', 'category', 'user'] 

Затем цикл по элементам в ответ, и получить значение или по умолчанию это:

for expense in response['expenses']: 
    data = [expense.get(field, '') for field in fields] 
    # do whatever 
Смежные вопросы