我试图循环浏览PDF书签,并将它们保存在一个对象中,包括它们的父书签
多亏了PyPDF4,我可以在数组中以数组的形式获取这些书签
例如:
[]
0: Root 1
1: []
0: Child layer 1.1
1: Child layer 1.2
2: []
0: Child layer 1.2.1
1: Child layer 1.2.2
1: Child layer 1.2.3
2: Root 2
由于这些数组因文件而异,我不知道这个数组是如何构造的。所以我最终选择了一个递归函数来保存它们
功能
def __iterate_through_bookmarks(outlines, bookmarks, layer = 0, parent = None):
layer += 1
print(layer)
if isinstance(outlines, list):
for item in outlines:
__iterate_through_bookmarks(item, bookmarks, layer, parent)
return bookmarks
print(outlines.title)
bookmarks.append(bookmark(outlines, parent))
我做了一点实验,但没有做对。但是看到函数中的层计数器如何正确地获得层,我就有了希望,这是可能的
图层输出:
1
2
Root 1
2
3
Child layer 1.1
3
Child layer 1.2
3
4
Child layer 1.2.1
4
Child layer 1.2.2
4
Child layer 1.2.3
2
Root 2
由于递归函数的工作方式,子层1.x具有相同的层计数器。但是,我找不到一个解决方案来解决如何在对象中保存它们的(相同的)父对象
最终目标是返回带有书签对象的数组。存储大纲的标题、位置和父级的类
有人有什么建议吗
带有显式的“children”字段
递归浏览嵌套的dict列表,其中每个dict都有一个“name”和一个“children”字段
或者,如果要存储对父对象的引用,而不仅仅是父对象的名称,请执行以下操作:
请注意
print
的输出看起来非常冗余,并且充满了副本,但事实并非如此。每个书签都包含对其父书签的引用;它不包含其父级的副本没有明确的“children”字段:顺序相关
现在假设您没有一个显式的
'children'
字段,并且您的嵌套列表只是一个列表列表;子列表被认为是前一个元素的子元素我们可以从相关问题中得到启发:Flatten an irregular list of lists
现在书签列表被展平,每个书签都有其深度。深度
depth
处给定书签的父书签是深度depth-1
处最近的上一个书签。轻松找到父级的有效方法是在当前分支中维护一个祖先堆栈相关问题 更多 >
编程相关推荐