Python dictreader - How to make CSV column names lowercase?
我有一个csv文件,上面写着列名。我正在使用csv.dictleader读取数据,但需要使用小写的列名。
我在这里找到了访问csv头空白和不区分大小写的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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()) |
我的问题是当我用
1 2 3 4 5 6 | datafile = open(self.ifs_data_file,'rU') csvDict = DictReaderInsensitive(datafile) for row in csvDict: print row #self.db.ifs_data.insert(**row) #self.db.commit() |
我得到这个错误
1 2 3 4 5 6 7 8 | Traceback (most recent call last): File"D:\Development\python\supplier_review\supplier_review.py", line 239, in update_ifs_data for row in csvDict: File"D:\Python27_5\lib\csv.py", line 103, in next self.fieldnames File"D:\Development\python\supplier_review\supplier_review.py", line 288, in fieldnames return [field.strip().lower() for field in super(DictReaderInsensitive, self).fieldnames] TypeError: must be type, not classobj |
在将文件传递给
1 2 3 4 5 6 7 8 9 10 | import csv import itertools def lower_first(iterator): return itertools.chain([next(iterator).lower()], iterator) with open(ifs_data_file, 'rU') as datafile: csvDict = csv.DictReader(lower_first(datafile)) for row in csvDict: print row |
1 2 3 4 5 6 7 8 9 10 | 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 csv.DictReader.fieldnames.fget(self)] def next(self): return DictInsensitive(csv.DictReader.next(self)) |
演示:
1 2 3 4 5 6 7 8 9 | >>> example = '''\ ... foo,Bar,BAZ ... 42,3.14159,Hello world!'''.splitlines() >>> csvDict = DictReaderInsensitive(example) >>> row = next(csvDict) >>> print row {'bar': '3.14159', 'foo': '42', 'baz': 'Hello world!'} >>> row['BAZ'] 'Hello world!' |
对于更简单的方法,您可以在访问字典之前简单地更新dictleader.fieldnames属性,如:
1 2 3 4 5 6 7 8 9 | >>> f = open('example-x-y-time.csv', 'rb') >>> reader = csv.DictReader(f) >>> reader.fieldnames ['Latitude', 'Longitude', 'Date'] >>> print next(reader) {'Latitude': '44.8982391', 'Date': '2004-07-12', 'Longitude': '-117.7791061'} >>> reader.fieldnames = [name.lower() for name in reader.fieldnames] >>> print next(reader) {'latitude': '44.6637001', 'date': '1964-04-03', 'longitude': '-123.5997009'} |