afkbowflexin
afkbowflexin

Reputation: 4089

Map over csv in python

I'm trying to use "map" on a csv file in python.

However, the line map(lambda x: x, reseller_csv) gives nothing.

I've tried iterating over the csv object, and it works fine and can print the rows.

Here's the code.

# imports
import csv

# Opens files
ifile = open('C:\Users\josh.SCL\Desktop\Records.csv', 'r')
ofile = open('C:\Users\josh.SCL\Desktop\RecordsNew.csv', 'w')
resellers_file = open('C:\Users\josh.SCL\Desktop\Reseller.csv', 'r')


# Setup CSV objects
csvfile = csv.DictReader(ifile, delimiter=',')
reseller_csv = csv.DictReader(resellers_file, delimiter=',')

# Get names only in resellers
resellers = map(lambda x: x.get('Reseller'), reseller_csv)

Upvotes: 2

Views: 3444

Answers (3)

Nas Banov
Nas Banov

Reputation: 29019

First on your specific problem: try checking if there is actually a key named 'Reseller', chances are its there with different capitalization or extra space. See list of all the keys (assuming non-exhausted DictReader):

>>> csvfile.next().keys()

Otherwise the map() should work fine. But i'd argue it's more readable (and faster!) done like this:

resellers = [x['Reseller'] for x in reseller_csv]

Upvotes: 0

John Machin
John Machin

Reputation: 82992

A csv.DictReader is a use-once gadget. You probably ran it a second time.

>>> import csv
>>> iterable = ['Reseller,cost', 'fred,100', 'joe,99']
>>> reseller_csv = csv.DictReader(iterable)
>>> map(lambda x: x.get('Reseller'), reseller_csv)
['fred', 'joe']
>>> map(lambda x: x.get('Reseller'), reseller_csv)
[]
>>>

While we're here:

(1) [Python 2.x] Always open csv files in BINARY mode.
[Python 3.x] Always open csv files in text mode (the default), and use newline=''

(2) If you insist on hardcoding file paths in Windows, use r"...." instead of "...", or use forward slashes -- otherwise \n and \t will be interpreted as control characters.

Upvotes: 4

Skurmedel
Skurmedel

Reputation: 22159

The following works for me:

>>> data = ["name,age", "john,32", "bob,45"]
>>> list(map(lambda x: x.get("name"), csv.DictReader(data))) # Python 3 so using list to see values.
['john', 'bob']

Are you sure you get any data at all from your DictReader? Do you read any data from it prior to that, exhausting the reader perhaps?

Upvotes: 0

Related Questions