【问题标题】:Accessing csv header white space and case insensitive访问 csv 标头空白和不区分大小写
【发布时间】:2012-10-18 14:26:08
【问题描述】:

我正在重写csv.Dictreader.fieldnames 属性,如下所示,以读取 csv 文件中的所有标题,不带空格且为小写。

import csv
class MyDictReader(csv.DictReader):

    @property
    def fieldnames(self):
        return [field.strip().lower() for field in super(MyDictReader, self).fieldnames]

现在我的问题是,如何使用自动strip()lower() 查询访问字段名?

这是,我如何手动操作:

csvDict = MyDictReader(open('csv-file.csv', 'rU'))

for lineDict in csvDict:
    query = ' Column_A'.strip().lower()
    print(lineDict[query])

有什么想法吗?

【问题讨论】:

    标签: python csv python-3.x


    【解决方案1】:

    根据 Pedro Romano 的建议,我编写了以下示例。

    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())
    

    对于包含像

    这样的标题的文件
    • “column_A”
    • “column_A”
    • “Column_A”
    • “Column_A”
    • ...

    您可以像这样访问列:

    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
    

    【讨论】:

    • 当我尝试运行它时,我得到以下错误: return [field.strip().lower() for field in super(MyDictReader, self).fieldnames] TypeError: must be type, not类对象
    • @PrestonDocks:我从this question 了解到super 在 Python2 和 Python3 中的行为不同。该代码应适用于 Python3。你试过了吗?
    • 问题在于,DictReader 在 Python2 中是“旧式”类,在 Python3 中是“新式”类。您可以通过从对象继承来解决此问题:DictReaderInsensitive(csv.DictReader, object ):
    【解决方案2】:

    您必须分两步完成:

    1. 使用将.strip().lower() 应用于其key 参数的__getitem__ 方法创建您的dict 特化。
    2. 在您的 MyDictReader 专用类上覆盖 __next__ 以返回您的特殊字典之一,该字典由 csv.DictReader 超类的 __next__ 方法返回的字典初始化。

    【讨论】:

      猜你喜欢
      • 2012-10-07
      • 2018-07-31
      • 2015-07-06
      • 1970-01-01
      • 2021-08-22
      • 2013-03-06
      • 2020-02-18
      • 2015-01-10
      相关资源
      最近更新 更多