递归文件结构爬网超出最大递归深度

时间:2016-09-16 08:43:57

标签: python recursion

这是我的代码,其目的是抓取给定的文件夹并查找.md和.pdf文件,并构建一个描述它的树状结构。

我可能真的过度思考它,所以我真的可以使用第二眼。

class Resource_Item:
    def __init__(self, name=None, stub=None, path=None, parent=None, html_file_location=None, documents=[], children=[]):
      self.name = name
      self.stub = stub
      self.path = path
      self.parent = parent
      self.html_file_location = html_file_location
      self.documents = documents
      self.children = children

    def add_child(self, c):
      self.children.append(c)

    def to_json(self):
      o = {
        'name' : self.name,
        'stub' : self.stub,
        'path' : self.path,
        'parent' : self.parent,
        'html_file_location' : self.html_file_location,
        'documents' : self.documents,
        'children' : [c.to_json() for c in self.children] } #len(self.children)
      return json.dumps(o)



def walk_dir(root, parent = None):
  """
  >>> walk_dir("./test_docs/folder containing pdfs/").documents
  ['dummy_pdf 2.pdf', 'dummy_pdf 3.pdf', 'dummy_pdf 4.pdf', 'dummy_pdf.pdf']
  >>> len(walk_dir("./test_docs/folder containing pdfs/").children)
  0
  >>> walk_dir("./test_docs/folder containing markdown and pdfs/").stub is None
  False
  >>> walk_dir("./test_docs/folder containing markdown and pdfs/").children
  ['dummy_pdf 2.pdf', 'dummy_pdf 3.pdf', 'dummy_pdf 4.pdf', 'dummy_pdf.pdf']
  """
  file_or_folder_name_no_ext = os.path.splitext(os.path.basename(root))[0]
  entry = Resource_Item( name=file_or_folder_name_no_ext, parent=parent, path=os.path.abspath(root) )
  for item in os.listdir(root):
    path = os.path.join(os.path.abspath(root), item)

    if os.path.isfile(path):
      if item.endswith(".pdf"):
        entry.documents.append(item)
      elif item.endswith(".md"):
        entry.stub = read_markdown_file_as_html(path)
    elif os.path.isdir(path):
      if dir_contains_pdf(path):
        print('found a path to contain PDFs: "'+str(path)+'"')
        entry.add_child(walk_dir(path))   # broken!
        #entry.add_child(path)
  return entry

似乎正在发生的事情是,在entry.add_child(walk_dir(path))行,walk_dir没有正确创建Resource_Item的新实例,因为我的测试显示{{1} }使用 all 填充该文件树中的pdf,而不仅仅是直接文件夹中的那些。

至于我的支持功能,我很确定它们能正常工作,但这里是为了完整性:

Resource_Item.children

作为另一种关于这种递归应该如何工作的观点,我以相同的方式构建了这个其他程序以确认它是否有效,并且它确实正常工作,所以我猜测这个问题与我的方式有什么关系#39; m使用Python文件API:

def dir_contains_pdf(root):
  """
  >>> dir_contains_pdf("./test_docs/folder containing pdfs/")
  True
  >>> dir_contains_pdf("./test_docs/folder containing nothing/")
  False
  >>> dir_contains_pdf("./test_docs/folder containing folders, markdown, and pdf/")
  True
  >>> dir_contains_pdf("./test_docs/folder containing markdown and pdfs/")
  True
  """
  root = os.path.abspath(root)
  for item in os.listdir(root):
    item_path = os.path.join(root, item)
    if os.path.isfile(item_path):
      if item.endswith(".pdf"):
        return True
    elif os.path.isdir(item_path):
      if dir_contains_pdf(item_path):
        return True
  return False

def read_markdown_file_as_html(markdown_filename):
  f = open(markdown_filename, 'r')
  markdown_content = f.read()
  return markdown.markdown(markdown_content)

0 个答案:

没有答案