在不修改CSV文件的情况下向dictReader添加列

时间:2018-02-21 14:27:06

标签: python csv

我有一个包含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中使用它。

2 个答案:

答案 0 :(得分: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添加为最后一列。

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

答案 1 :(得分:1)

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

基本上你可以这样做:

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