python - 在python中的特定行之后拆分文本文件
问题描述
我正在尝试编写代码来读取 Fresco 文件并绘制结果。Fresco 生成一个看起来像这样的大文件
theta sigma
1 0.1
2 0.1
3 0.2
...
END
some text...
theta sigma
1 0.3
2 0.2
...
END
more data...
我想在每个“END”之后生成一个新文件来分别分析数据。我尝试了一些针对其他答案的解决方案,例如
with open('fort.16', 'r') as infile, open('output_fort.16', 'w') as outfile:
copy= False
for line in infile:
if line.strip() == '# legend':
copy = True
continue
elif line.strip()=='End':
copy = False
elif copy:
outfile.write(line)
但这不是我需要的。我对python相当陌生,所以非常感谢任何帮助。
解决方案
我设法用嵌套生成器解决了这个问题:
import re
SECTION_START = re.compile(r'^\s*theta\s+sigma\s*$')
SECTION_END = re.compile(r'^\s*END\s*$')
def fresco_iter(stream):
def inner(stream):
# Yields each line until an end marker is found (or EOF)
for line in stream:
if line and not SECTION_END.match(line):
yield line
continue
break
# Find a start marker, then break off into a nested iterator
for line in stream:
if line:
if SECTION_START.match(line):
yield inner(stream)
continue
break
该fresco_iter
方法返回一个可以循环的生成器。它为每theta sigma
对的部分返回 1 个生成器。
>>> with open('fort.16', 'r') as fh:
... print(list(fresco_iter(fh)))
[<generator object fresco_iter.<locals>.inner at 0x7fbc6da15678>,
<generator object fresco_iter.<locals>.inner at 0x7fbc6da15570>]
因此,要利用这一点,您可以创建自己的嵌套循环来处理嵌套生成器。
filename = 'fort.16'
with open(filename, 'r') as fh:
for nested_iter in fresco_iter(fh):
print('--- start')
for line in nested_iter:
print(line.rstrip())
print('--- end')
会输出...
--- start
1 0.1
2 0.1
3 0.2
--- end
--- start
1 0.3
2 0.2
--- end
这种策略一次只能在内存中保存 1 行输入文件,因此适用于任何大小的文件,即使是在最小的设备上……因为生成器很棒。
因此,一路走来......将输出分成单独的文件:
with open(filename, 'r') as fh_in:
for (i, nested_iter) in enumerate(fresco_iter(fh_in)):
with open('{}.part-{:04d}'.format(filename, i), 'w') as fh_out:
for line in nested_iter:
fh_out.write(line)
将仅输出数字以分隔名为fort.16.part-0000
和的文件fort.16.part-0001
。
我希望这会有所帮助,快乐的编码!
推荐阅读
- intellij-idea - 没有行号的 Flutter IntelliJ 错误
- angular - 错误:PERMISSION_DENIED - Angular 7 和 Firebase
- php - 如何修复左右侧边栏并保持中心主要内容可向上滚动?
- python - 熊猫多索引数据框条件列连接
- javascript - 仅通过更改文本来进行 HTML 和 JavaScript 导航
- performance - 查找具有至少一个具有特定属性的子节点的有效方法
- python - 将字典列表转换为更适合下拉列表的格式
- javascript - JQuery on keydown 事件聚焦到一个按钮似乎自动按下按钮?
- css - IE11 中的问题(使用 flexbox),不会停留在下方,而是覆盖第一行
- python - python tkinter for循环使用并且图像未加载