关于python:在不修改csv文件的情况下向dictreader添加列

Adding a column to dictReader without modifying the CSV file

我有一个csv文件,有3列。比如:abc。我使用csv.dictReader来读取它,并添加另一列,其中每一行只有文件名。

这是我的职责:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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中使用它。


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

  • "dict(d1,**d2)"一词中的"**"是什么意思?

基本上你可以这样做:

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

您不必对列名的级别进行迭代。您可以将for ... in reader返回的所有现有列值视为元组。然后:

1
2
3
4
5
6
7
8
9
10
11
   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并调用字典构造函数,这样我们就可以返回带有附加列的字典。