python - 如何从文本文件的中间反向迭代?
问题描述
问题:
我正在编写一个程序,其最终目标是从 .json 文件的文本版本中提取几个特定的行。我想自动化复制/粘贴数十或数百行都共享相同关键字的手动过程,但其中有几行从该关键字中删除。
建议的解决方案:
- python 程序遍历 .txt 文件以查找特定关键字
- 一旦找到该单词,它就会停止并从该行向后迭代,直到找到 SECOND 关键字。
- 当找到第二个关键字时,程序将关键字所在的整行写入一个新文件,然后从初始关键字的行开始再次遍历文件。
插图:
<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 从文本文件中间向后迭代的现有模块、函数或实践?
解决方案
正如评论中提到的其他人,最好使用原始 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>
行。
推荐阅读
- c# - 如何在 C# 中将多个自定义对象组合到一个数组中?
- android - 自定义 Google 助理突然在设备上不可用,但在输入提示时有效
- mongodb - laravel 中的并发用户注册到 mongodb
- botframework - 如何使用 Microsoft Teams 沉浸式阅读器读取自适应卡片内容?
- corda - UTC以外的corda 4中如何使用本地时区
- python - 使用 pymysql 不会从本地磁盘更新数据库
- python - pylint 如何在 argparse 中不引发无成员消息?
- xml - 如何显着提高 xsltproc 命令的速度?
- spring - 没有映射的 Spring MVC 请求将发送到控制器
- java - java - 如何在java ping pong游戏中使桨的一侧成为机器人?