我正在使用一个名为bonobo的轻型ETL库。csv编写器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发布于 2018-03-29 10:01:27
从bonobo 0.6开始,在子类中直接重写方法实例是非常重要的。相反,您应该在构造函数参数中提供一个覆盖的实现。
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,
}这应如预期的那样起作用。
当然,可以直接从编写器构造函数(如bonobo0.6.2)重写quoting,在此之前存在一个bug,但现在fix已经发布。
def get_graph(**options):
graph = bonobo.Graph()
graph.add_chain(
extract,
bonobo.CsvWriter('...', quoting=csv.QUOTE_NONNUMERIC),
)这三种方法都有完全相同的行为,你应该赞成最后一种。
希望这能有所帮助。
https://stackoverflow.com/questions/49545257
复制相似问题