我有一个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]因此,为了清楚起见,id为a的对象是在CSV的第1、2和3行命名的,因此对象a的LinesField属性需要列出这些行id(该行上的第一个数字)。
理想情况下,我希望使用Transmogrifier导入此信息(并避免事先在Excel中进行任何操作),理论上,我可以看到两种方法,但我不知道如何在实践中做到这一点。如果能给我一些例子的指点,我将不胜感激。我认为要么我需要转换整个管道,使项目反映我的Plone对象的结构,然后使用ATSchemaUpdater蓝图,但我看不到任何关于如何向管道添加项目的示例(我需要编写自己的蓝图吗?)或者,我也可以循环遍历存在的项,并将左侧列中的值附加到右侧列表中的项。为此,我需要一种用ATSchemaUpdater附加值而不是覆盖它们的方法--再说一次,有没有这样的蓝图?
下面是一些示例csv代码行:
"Name","Themes"
"Bessie Brown","cah;cab;cac"
"Fred Blogs","cah;cac"
"Dinah Washington","cah;cab"Plone对象将是一个主题,而lines字段将是一个名称列表:
cah, ['Bessie Brown', 'Fred Boggs' etc etc]发布于 2011-08-31 04:04:04
我不太确定您是否想要使用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'};keys将包含所有可能的值集合(‘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部分。
https://stackoverflow.com/questions/7245251
复制相似问题