【问题标题】:Adding a column to dictReader without modifying the CSV file在不修改 CSV 文件的情况下向 dictReader 添加列
【发布时间】:2018-08-01 04:16:48
【问题描述】:

我有一个包含 3 列的 CSV 文件。假设:abc。我正在使用csv.dictReader 来读取它并添加另一列,其中每一行都包含文件的名称。

这是我的功能:

def addFilename(self):
    with open(self.datafile, "r") as f:
        reader = csv.DictReader(f, delimiter='|')
        for a, b, c in reader:
            #Get filename
            filename = self.getFilename()
            yield {
                "_source": {
                    "a": a,
                    "b": b,
                    "c": c,
                    "filename": filename
                }
            }

现在我想将这种行为概括为许多不同的 CSV 文件。这些文件具有不同的列数和不同的列名。有办法吗?

我不想修改 CSV 文件。我唯一知道的是我可以使用reader.fieldnames 获取字段名(和字段数),但我不知道如何在yield 中使用它。

【问题讨论】:

    标签: python csv


    【解决方案1】:

    您不必在列名的级别上进行迭代。您可以将for ... in reader 返回的所有现有列值视为一个元组。那么:

       def addFilename2(self):
        with open(self.datafile, "r") as f:
            reader = csv.DictReader(f, delimiter='|')
            for column_dict in reader:
                #Get filename
                filename = self.getFilename()
                mapped_values =list(column_dict.items())
                mapped_values.append(("filename", filename,))
                yield {
                    "_source": dict(mapped_values)
                    }
    

    这种方法忽略了 CSV 文件中的名称和列数,并且总是将 filename 添加为最后一列。

    字典可以从我们使用zip根据特定行中的列名和值创建的2元组列表中创建。有了一个列表,我们可以附加重复的 filename 并调用字典构造函数,以便我们可以返回带有附加列的字典。

    【讨论】:

      【解决方案2】:

      这个问题可能会提供一些有用的见解:

      基本上你可以这样做:

      def foo(fname):
          with open(fname, "r") as f:
              reader = csv.DictReader(f, delimiter='|')
              for row in reader:
                  yield { "_source": dict(filename=fname, **row) }
      

      【讨论】:

        猜你喜欢
        • 2015-10-11
        • 2011-11-03
        • 1970-01-01
        • 1970-01-01
        • 2015-09-13
        • 1970-01-01
        • 1970-01-01
        • 2013-07-12
        • 1970-01-01
        相关资源
        最近更新 更多