首页 > 解决方案 > 如何从文本文件的中间反向迭代?

问题描述

问题
我正在编写一个程序,其最终目标是从 .json 文件的文本版本中提取几个特定的​​行。我想自动化复制/粘贴数十或数百行都共享相同关键字的手动过程,但其中有几行从该关键字中删除。

建议的解决方案

插图

<fields>
     <fullName>NAME KEYWORD</fullName> ##line I want to iterate backwards to so I can write it to another file##
     <label>example_label</label>
     <length>131072</length>
     <trackHistory>false</trackHistory> ##line with keyword to stop the iterating process#
     <type>example_type</type>
</fields>

一旦将带有“NAME KEYWORD”的行写入一个新文件,程序就会继续到下一个部分,该部分将有许多相同的字段,但有一个不同的“NAME KEYWORD”等。

尝试过的解决方案:
我一直在网上寻找有关如何从给定点反向遍历文本文件的明确信息。我找到了一个站点 ( kite.com ),它说明了如何使用 readlines() 和 reversed() 函数,但这些操作是在整个文档上执行的,而不是在一个不同的部分上执行。
我还查看了Python 自己的文档,但那里的建议似乎没有提出我在这里寻找的功能。(除非我有误解。)

TL;DR
有没有人知道是否存在允许 Python 从文本文件中间向后迭代的现有模块、函数或实践?

标签: pythonjsonloopstext

解决方案


正如评论中提到的其他人,最好使用原始 JSON 或使用 XML 解析器。但是如果这些都不可能(可能文件太大而无法立即加载到内存中),我认为您可以这样做而无需反向阅读。

saved_line = None
for line in oldfile:
    if 'NAME KEYWORD' in line:
        saved_line = line
    elif '<trackHistory>false</trackHistory>' in line and saved_line:
        newfile.write(saved_line)

saved_line如果您在找到该行后向后迭代,将始终包含您会找到的同一<trackHistory>false</trackHistory>行。


推荐阅读