通过使用上下文管理器,我的代码按降序(第二行而不是第一行)将文本写入文件

By using context manager, my code writes the text in descending order (second line first instead of first line) into the file

我正在尝试在 Python 中使用 class 编写 html。我的讲师已经给出了一些指导。当我尝试使用 with 函数将文本写入 HTML 文件时,第一个启动下面的行首先写入文件。我可以知道如何解决吗?

代码:

class DOM:
    class HtmlTable:
        def __init__(self, indent, tag_name):
            self.indent = indent
            self.tag_name = tag_name
            
        def __enter__(self):
            self.file = open('test.html', 'a')
            self.file.write(f'{self.indent*"  "}<{self.tag_name} >\n')
            return self.file

        def __exit__(self, exception_type, exception_value, traceback):
            self.file.write(f'{self.indent*"  "}</{self.tag_name}>\n')
            self.file.close()
    
    def __init__(self):
        self.indent = -2

    def tag(self, tag_name):
        self.indent += 2
        return self.HtmlTable(self.indent, tag_name)

测试:

if __name__ == '__main__':
    doc = DOM()
    with doc.tag('html'):
        with doc.tag('head'):
            #remaining code

输出:

    <head >
    </head>
<html >
</html>

期望的输出:

<html >
    <head >
    </head>
</html>

您可能想要 .flush() 您的文件 - 仅在“刷新”时将实际文件内容写入磁盘 - 直到那时文件对象缓存需要在其内部缓冲区中完成的操作:

class DOM: 
    class HtmlTable:
        def __init__(self, indent, tag_name):
            self.indent = indent
            self.tag_name = tag_name
            
        def __enter__(self):
            self.file = open('test.html', 'a+')
            self.file.write(f'{self.indent*"  "}<{self.tag_name} >\n') 
            self.file.flush()  ########## here ##########
            return self.file


        def __exit__(self, exception_type, exception_value, traceback):
            self.file.write(f'{self.indent*"  "}</{self.tag_name}>\n')
            self.file.close()

    # fixed indentation        
    def __init__(self):
        self.indent = -2

    # fixed indentation        
    def tag(self, tag_name):
        self.indent += 2        
        return self.HtmlTable(self.indent, tag_name)


def main():
    with open("test.html","w") as f:
        f.write("\n")

    doc = DOM()
    with doc.tag('html'):
        pass
        with doc.tag('head'):
            pass

    print(open("test.html").read())

if __name__ == '__main__':
    main()

==>

<html >
    <head >
    </head>
</html>

当前,文件本身会在需要时将其缓冲区刷新到光盘 - 当您在 __exit__() 中点击 self.file.close() 时,它“被需要”。第一个 __exit__ 是为标签 "head" 完成的。

在文件被“刷新”之前,“要写入的内容”保存在文件对象内部缓冲区中 - 这就是您获得输出的原因。