Message173583
This is my use case:
I am creating a custom DictReader class for reading and accessing the columns white space and case insensitive.
For this I created a dict subclass (DictInsensitive) with a custom __getitem__ method. DictReaderInsensitive.__next__ overrides the original DictReader.__next__ by returning a DictInsensitive. I also override the DictReader.fieldnames property to lower/strip all fieldnames.
See http://stackoverflow.com/a/12970460/1251007 for an example.
This is all functional with the current csv.DictReader. All entries in DictReaderInsensitive.fieldnames are in lower case and without white space and by iterating over the lines I get dictionaries where I can access the keys white space/case insensitive.
Now, the problem is: If I want the check wether a specific fieldname is present in the input file, I have strip()/lower() "by hand":
csv_in = DictReaderInsensitive(open(input_file, 'rU'))
if "Fieldname to check".strip().lower() in csv_in.fieldnames
To do this automatically, I created a ListInsensitive as a subclass of list:
class ListInsensitive(list):
def __contains__(self, item):
return list.__contains__(self, item.strip().lower())
Now I want csv.DictReader to use that new class. I thought of overwriting the setter method, but here lies the current problem. I can overwrite the setter method, but csv.DictReader does not use the setter method internally.
My setter method looks like this:
@fieldnames.setter
def fieldnames(self, value):
if value == None:
self._fieldnames = None
else:
self._fieldnames = ListInsensitive()
for name in value:
self._fieldnames.append(name.strip().lower()) |
|
Date |
User |
Action |
Args |
2012-10-23 08:39:09 | tb | set | recipients:
+ tb, r.david.murray, berker.peksag |
2012-10-23 08:39:09 | tb | set | messageid: <1350981549.22.0.118017365998.issue16297@psf.upfronthosting.co.za> |
2012-10-23 08:39:09 | tb | link | issue16297 messages |
2012-10-23 08:39:08 | tb | create | |
|