Search code examples
pythonjsoncsvplaid

JSON Single Line Parse to Multi-Line CSV with Python


I am a Python noob, and working with the Plaid API to get bank transactions. I would like each transaction to be it's own line, and I only want to pull four values per record: date, _account, name & amount, and populate a CSV file with that data. I have the below code which populates a single line CSV (JSON file also attached). I can't seem to figure out what I am looking for as far as examples on how to do this after a bit of Googling. Any help is much appreciated.

import csv

#Configuration
from plaid import Client

Client.config({
    'url': 'https://api.plaid.com'
})

#Connect to Plaid
from plaid import Client
from plaid import errors as plaid_errors
from plaid.utils import json

client = Client(client_id='test_id', secret='test_secret')
account_type = 'suntrust'

try:
    response = client.connect(account_type, {
    'username': 'plaid_test',
    'password': 'plaid_good'
    })
except plaid_errors.PlaidError:
     pass
else:
    connect_data = response.json()

#Get transactions from Plaid
response = client.connect_get()
transactions = response.json()

#Save the transactions JSON response to a csv file in the Python Projects directory
with open('transactions.csv', 'w') as outfile:
    json.dump(transactions, outfile)

csvfile = open('transactions.csv', 'r')
jsonfile = open('transactions.json', 'w')

fieldnames = ("date", "_account","name","amount")
reader = csv.DictReader(csvfile, fieldnames)
for row in reader:
    json.dump(row, jsonfile)
    jsonfile.write('\n')

JSON FILE


Solution

  • I think you are making this over-complicated and confusing JSON with CSV. Hat tip to @thalesmallo who beat me to the punch on using the DictWriter class. Try this:

    import csv
    from plaid import Client
    
    Client.config({
        'url': 'https://api.plaid.com'
    })
    
    #Connect to Plaid
    from plaid import Client
    from plaid import errors as plaid_errors
    from plaid.utils import json
    
    client = Client(client_id='test_id', secret='test_secret')
    account_type = 'suntrust'
    
    try:
        response = client.connect(account_type, {
            'username': 'plaid_test',
            'password': 'plaid_good'
        })
    except plaid_errors.PlaidError:
         pass
    else:
        connect_data = response.json()
    response = client.connect_get()
    data = response.json()
    transactions = data['transactions'] # see https://plaid.com/docs/api/#data-overview
    
    #Save the transactions JSON response to a csv file in the Python Projects directory
    header = ("date", "_account", "name", "amount")
    with open('transactions.csv', 'w') as f:
        writer = csv.DictWriter(f, fieldnames=header, extrasaction='ignore')
        writer.writeheader()
        for x in transactions:
            writer.writerow(x)