user9538877
user9538877

Reputation: 198

Read CSV with variable number of columns; assign all the excess columns to one variable

I have a CSV like this:

id,fname,lname,pdo,pdos,jabcode
1,doe,jon,10,20,10
2,dos,jons,10,20,10,11
3,de,ons,10,20,10,11,21,22
4,jam,jenn,10,20,11,22,44
5,mam,jane,10,20,16

For the last column in the CSV there could be multiple values, is there any way that I can put all the last column values into a tuple or a list?

I have written a code where I am taking all the CSV and making them into a list of dictionaries but in the last column value is returning only a single value.

My code

import csv 

pList = []

with open("data.csv", 'r') as csvfile: 
    csvreader = csv.reader(csvfile) 
    for i in csvreader:
        d = {}
        d["id"] = i[0]
        d["fname"] = i[1]
        d["lname"] = i[2]
        d["pdo"] = i[3]
        d["pdos"] = i[4]
        d["jabcode"] = i[5]
        pList.append(d)
print(pList)

This is returning

[{
    'id': 'id',
    'jabcode': 'jabcode',
    'lname': 'lname',
    'pdos': 'pdos',
    'pdo': 'pdo',
    'fname': 'fname'
}, {
    'id': '1',
    'jabcode': '10',
    'lname': 'jon',
    'pdos': '20',
    'pdo': '10',
    'fname': 'doe'
}, {
    'id': '2',
    'jabcode': '10',
    'lname': 'jons',
    'pdos': '20',
    'pdo': '10',
    'fname': 'dos'
}, {
    'id': '3',
    'jabcode': '10',
    'lname': 'ons',
    'pdos': '20',
    'pdo': '10',
    'fname': 'de'
}, {
    'id': '4',
    'jabcode': '11',
    'lname': 'jenn',
    'pdos': '20',
    'pdo': '10',
    'fname': 'jam'
},
{
    'id': '5',
    'jabcode': '16',
    'lname': 'jane',
    'pdos': '20',
    'pdo': '10',
    'fname': 'mam'
}] 

What I desire to get is

[{
    'id': 'id',
    'jabcode': 'jabcode',
    'lname': 'lname',
    'pdo': 'pdo',
    'pdos': 'pdos',
    'fname': 'fname'
}, {
    'id': '1',
    'jabcode': ('10'),
    'lname': 'jon',
    'pdos': '20',
    'pdo': '10',
    'fname': 'doe'
}, {
    'id': '2',
    'jabcode': ('10','11)',
    'lname': 'jons',
    'pdos': '20',
    'pdo': '10',
    'fname': 'dos'
}, {
    'id': '3',
    'jabcode': ('10','11','21','22'),
    'lname': 'ons',
    'pdos': '20',
    'pdo': '10',
    'fname': 'de'
}, {
    'id': '4',
    'jabcode': ('11','22','44'),
    'lname': 'jenn',
    'pdos': '20',
    'pdo': '10',
    'fname': 'jam'
},
{
    'id': '5',
    'jabcode': ('16'),
    'lname': 'jane',
    'pdos': '20',
    'pdo': '10',
    'fname': 'mam'
}]

Is there any pythonic way of doing it?

Upvotes: 0

Views: 54

Answers (1)

shotasenga
shotasenga

Reputation: 979

You can do it with tuple(i[5:])

import csv 

pList = []

with open("data.csv", 'r') as csvfile: 
    csvreader = csv.reader(csvfile) 
    for i in csvreader:
        d = {}
        d["id"] = i[0]
        d["fname"] = i[1]
        d["lname"] = i[2]
        d["pdo"] = i[3]
        d["pdos"] = i[4]
        d["jabcode"] = tuple(i[5:])
        pList.append(d)
print(pList)

Upvotes: 1

Related Questions