我有一个包含3列的CSV文件。让我们说:a
,b
,c
。我使用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
中使用它。
答案 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) }