我有一个这样的CSV数据文件:
1, [a, b, c]
2, [a, b, d]
3, [a]
和一些应该像这样更新的Plone对象:
ID, LinesField
a, [1,2,3]
b, [1,2]
c, [1]
d, [2]
因此,为了澄清,具有标识a
的对象在CSV的第1,2和3行上命名,因此对象LinesField
的{{1}}属性需要具有列出的那些行ID(行上的第一个数字)。
理想情况下,我想使用Transmogrifier来导入这些信息(并避免事先在Excel中进行任何操作),我可以看到两种方法,理论上这样做,但我无法弄清楚如何在实践。我要感谢一些例子。我认为要么我需要转换整个管道,以便项目反映我的Plone对象的结构,然后使用ATSchemaUpdater蓝图,但我看不到任何关于如何将项目添加到管道的示例(我是否需要写我自己的蓝图?)或者,我可以循环遍历项目,并将左栏中的值附加到右侧列表中的项目。为此,我需要一种用ATSchemaUpdater附加值而不是覆盖它们的方法 - 再次,是否有任何蓝图?
以下是一些示例csv行:
a
Plone对象将是一个主题,而行将列出一个名称列表:
"Name","Themes"
"Bessie Brown","cah;cab;cac"
"Fred Blogs","cah;cac"
"Dinah Washington","cah;cab"
答案 0 :(得分:2)
我不确定您是否想要使用transmogrifier读取CVS文件,但我认为您可以创建一个部分,使用如下函数将这些值插入管道中的项目:
def transpose(cvs):
keys = []
[keys.extend(v) for v in cvs.values()]
keys = set(keys)
d = {}
for key in keys:
values = [k for k, v in cvs.iteritems() if key in v]
d[key] = values
return d
在这种情况下, cvs 是{1:['a','b','c'],2:['a','b','d'],3 : ['一个']}; 键将包含所有可能设置的值(['a','c','b','d']); d 将是您想要的{'a':[1,2,3],'c':[1],'b':[1,2],'d':[ 2]}。
可能有更好的方法可以做到,但我不是Python魔术师。
插入部分可能如下所示:
class Insert(object):
"""Insert new keys into items.
"""
classProvides(ISectionBlueprint)
implements(ISection)
def __init__(self, transmogrifier, name, options, previous):
self.previous = previous
self.new_keys = transpose(cvs)
def __iter__(self):
for item in self.previous:
item.update(self.new_keys)
yield item
之后,您可以使用SchemaUpdater部分。