Orest
Orest

Reputation: 1

CSV file , can't add record from csv file

How can I add record from csv file into dictionary in function where the input attribute will be tha path fo that csv file?

Please help with this uncompleted function :

def csv_file (p):
    dictionary={}
    file=csv.reader(p)
    for rows in file:
        dictionary......(rows)
    return dictionary

Upvotes: 0

Views: 61

Answers (2)

Nafiul Islam
Nafiul Islam

Reputation: 82560

It seems as though you haven't even opened the file, you need to use open for that.

Try the following code:

import csv
from pprint import pprint

INFO_LIST = []
with open('sample.csv') as f:
    reader = csv.reader(f, delimiter=',', quotechar='"')
    for i, row in enumerate(reader):
        if i == 0:
            TITLE_LIST = [var for var in row]
            continue
        INFO_LIST.append({title: info for title, info in zip(TITLE_LIST, row)})

pprint(INFO_LIST)

I use the following csv file as an example:

"REVIEW_DATE","AUTHOR","ISBN","DISCOUNTED_PRICE"
"1985/01/21","Douglas Adams",0345391802,5.95
"1990/01/12","Douglas Hofstadter",0465026567,9.95
"1998/07/15","Timothy ""The Parser"" Campbell",0968411304,18.99
"1999/12/03","Richard Friedman",0060630353,5.95
"2001/09/19","Karen Armstrong",0345384563,9.95
"2002/06/23","David Jones",0198504691,9.95
"2002/06/23","Julian Jaynes",0618057072,12.50
"2003/09/30","Scott Adams",0740721909,4.95
"2004/10/04","Benjamin Radcliff",0804818088,4.95
"2004/10/04","Randel Helms",0879755725,4.50

You can put all that logic into a function like so:

def csv_file(file_path):

    # Checking if a filepath is a string, if not then we return None
    if not isinstance(file_path, str):
        return None

    # Creating a the list in which we will hold our dictionary's files
    _info_list = []
    with open(file_path) as f:
        # Setting the delimiter and quotechar
        reader = csv.reader(f, delimiter=',', quotechar='"')
        # We user enumerate here, because we know the first row contains data about the information
        for i, row in enumerate(reader):
            # The first row contains the headings
            if i == 0:
                # Creating a list from first row
                title_list = [var for var in row]
                continue
            # Zipping title_list and info_list together, so that a dictionary comprehension is possible
            _info_list.append({title: info for title, info in zip(title_list, row)})
    return _info_list

APPENDIX

  1. open()
  2. zip
  3. Dictionary Comprehension
  4. Delmiter, its the character that separates values, in this case ,.
  5. Quotechar, its the character, that holds values in a csv, in this case ".

Upvotes: 2

Tim Pietzcker
Tim Pietzcker

Reputation: 336438

You need to open the file first:

def csv_file(p):
    dictionary = {}
    with open(p, "rb") as infile:   # Assuming Python 2
        file = csv.reader(infile)   # Possibly DictReader might be more suitable,
        for row in file:            # but that...
            dictionary......(row)   # depends on what you want to do.
    return dictionary

Upvotes: 2

Related Questions