Accessing Csv Header White Space And Case Insensitive
I'm overriding the csv.Dictreader.fieldnames property like the following to read all headers from csv files without white space and in lower case. import csv class MyDictReader(csv
Solution 1:
Based on Pedro Romano's suggestion I coded the following example.
import csv
class DictReaderInsensitive(csv.DictReader):
# This class overrides the csv.fieldnames property.
# All fieldnames are without white space and in lower case
@property
def fieldnames(self):
return [field.strip().lower() for field in super(DictReaderInsensitive, self).fieldnames]
def __next__(self):
# get the result from the original __next__, but store it in DictInsensitive
dInsensitive = DictInsensitive()
dOriginal = super(DictReaderInsensitive, self).__next__()
# store all pairs from the old dict in the new, custom one
for key, value in dOriginal.items():
dInsensitive[key] = value
return dInsensitive
class DictInsensitive(dict):
# This class overrides the __getitem__ method to automatically strip() and lower() the input key
def __getitem__(self, key):
return dict.__getitem__(self, key.strip().lower())
For a file containing headers like
- "column_A"
- " column_A"
- "Column_A"
- " Column_A"
- ...
you can access the columns like this:
csvDict = DictReaderInsensitive(open('csv-file.csv', 'rU'))
for lineDict in csvDict:
print(lineDict[' Column_A']) # or
print(lineDict['Column_A']) # or
print(lineDict[' column_a']) # all returns the same
Solution 2:
You'll have to do it in two steps:
- Create your
dict
specialisation with a__getitem__
method that applies the.strip().lower()
to the itskey
parameter. - Override
__next__
on yourMyDictReader
specialised class to return one of your special dictionaries initialised with the dictionary returned by thecsv.DictReader
superclass's__next__
method.
Post a Comment for "Accessing Csv Header White Space And Case Insensitive"