我正在使用名为bonobo的轻型ETL库。 csv writer bonobo.CsvWriter类有一个工厂方法:
def writer_factory(self, file):
return csv.writer(file, **self.get_dialect_kwargs()).writerow
与文档:
class CsvWriter(FileWriter, CsvHandler):
@Method(
__doc__='''
Builds the CSV writer, a.k.a an object we can pass a field collection to be written as one line in the
target file.
Defaults to builtin csv.writer(...).writerow, but can be overriden to fit your special needs.
'''
)
我想添加一些额外的参数来自定义我的csv文件,所以我尝试覆盖它:
class quoCsvWriter(bonobo.CsvWriter):
def writer_factory(self, file):
return csv.writer(file, **self.get_dialect_kwargs(),quoting=csv.QUOTE_NONNUMERIC).writerow
当我将节点添加到链中时,程序显示:
Traceback (most recent call last):
File "geocoding.py", line 162, in <module>
get_graph(),
File "geocoding.py", line 135, in get_graph
quoCsvWriter('db_addresses.csv')
File "/Users/xxxx/xxxx/lib/python3.6/site-packages/bonobo/config/configurables.py", line 152, in __new__
missing.remove(name)
KeyError: 'writer_factory'
任何提示都表示赞赏。
更新
同时我试着做
bonobo.CsvWriter('filename.csv',quoting=csv.QUOTE_MINIMAL)
它抛出错误:
TypeError "quoting" must be an integer
答案 0 :(得分:2)
从bonobo 0.6开始,直接覆盖子类中的Method实例并非易事。相反,您应该在构造函数参数中提供重写实现。
def writer_factory(self, file):
return csv.writer(file, **{**self.get_dialect_kwargs(), 'quoting': csv.QUOTE_NONNUMERIC}).writerow
def get_graph(**options):
graph = bonobo.Graph()
graph.add_chain(
extract,
bonobo.CsvWriter('...', writer_factory=writer_factory),
)
return graph
如果您真的想要为此用例创建子类,可以通过覆盖get_dialect_kwargs()
方法来实现:
@use_context
class QuoteNonNumericCsvWriter(bonobo.CsvWriter):
def get_dialect_kwargs(self):
return {
**super().get_dialect_kwargs(),
'quoting': csv.QUOTE_NONNUMERIC,
}
这应该按预期工作。
当然,从bonobo 0.6.2开始,可以直接从编写器构造函数覆盖quoting
,之前有一个错误,但现在修复了。
def get_graph(**options):
graph = bonobo.Graph()
graph.add_chain(
extract,
bonobo.CsvWriter('...', quoting=csv.QUOTE_NONNUMERIC),
)
所有三种方法都有完全相同的行为,你应该赞成最后一种方法。
希望有所帮助。