在Python 3.x中写入文件

som*_*ody 0 python file-io tree-traversal python-3.x

from arrayheap import ArrayHeap
    def generateTable(self, node, table):
        def codeTable(node, codeString):
            if node.isLeaf:
                table[node._char] = codeString
                return
            if node.getleft() is not None:
                table(node.getLeft(), codeString + '0')
            if node.getRight() is not None:
                table(node.getRight(), codeString + '1')
        codeTable(node, '')
        return(table)

def main():
    with open('codetable.txt', 'w') as cdt:
        codeTable = {}
        codeTable = HTree.generateTable(HTree, codeTable)
        for i in sorted(codeTable):
            cdt.write(str(i) + '\t' + str(codeTable[i]) + '\n')
main()
Run Code Online (Sandbox Code Playgroud)

我试图输出到文件的二进制遍历树中的每个单独节点.我已将预订和后序遍历方法留在文件中以供参考.我的问题是我的generateTable()方法出了什么问题(大部分代码都是提供给我的)我想输出它,以便它以格式列出遍历,0左边1是正确的<ascii value> : <binary path>.问题是,当我运行此代码时,我的输出文件codetable.txt为空.我究竟做错了什么?

Mar*_*ers 5

generateTable()返回table不变; 你传入一个空字典,该函数除了返回同一个对象外什么都不做.

codeTable()不使用嵌套函数; 什么都没有实际称它.即使你不缩进的codeTable(node, '')电话是外面的嵌套函数,该函数有几个缺陷:

  • codeTable()只接受一个参数,但codeTable(node, '')调用传入两个参数.
  • 它只引用node.isLeaf但不称之为.
  • 它把table既是一本字典和调用.

怀疑你是打算以递归方式称呼它; 或许类似下面的事情?

def generateTable(self, node, table):
    def codeTable(node, codeString):
        if node.isLeaf():
            table[node._char] = codeString
            return
        if node.getleft() is not None:
            codeTable(node.getLeft(), codeString + '0')
        if node.getRight() is not None:
            codeTable(node.getRight(), codeString + '1')
    codeTable(node, '')
    return(table)
Run Code Online (Sandbox Code Playgroud)

现在,这将生成一个映射,其中包含叶节点的路径,由叶子节点的值键入; 路径由表示树上左右节点的字符01字符组成.

生成表后,可以将对文件的写入简化为:

for i in sorted(codeTable):
    cdt.write(str(i) + '\t' + str(codeTable[i]) + '\n')
Run Code Online (Sandbox Code Playgroud)