python-3.x - 从子进程命令行逐行输出数据
问题描述
我正在尝试使用预先构建的(C 语言)例程读取一个大型数据文件(= 数百万行,以非常特定的格式)。然后我想通过生成器函数逐行生成结果。
我可以正常读取文件,但在哪里运行:
<command> <filename>
直接在linux中会在找到结果时逐行打印结果,我没有运气尝试在我的生成器函数中复制它。它似乎将整个批次输出为我需要在换行符上拆分的单个字符串,当然,在我可以产生第 1 行之前,所有内容都需要阅读。
此代码将读取文件,没问题:
import subprocess
import config
file_cmd = '<command> <filename>'
for rec in (subprocess.check_output([file_cmd], shell=True).decode(config.ENCODING).split('\n')):
yield rec
(编码在 config.py 中设置为 iso-8859-1 - 这是一个瑞典站点)
我的代码有效,因为它为我提供了数据,但这样做,它试图将全部内容保存在内存中。我有比这更大的文件要处理,这些文件可能会耗尽可用内存,所以这不是一个选择。
我在 Popen 上玩过 bufsize,但没有任何成功(而且,我无法在 Popen 之后解码或拆分,尽管我想我现在需要拆分的事实实际上是我的问题!)。
解决方案
我想我现在有这个工作,所以如果其他人稍后正在寻找这个,我会回答我自己的问题......
proc = subprocess.Popen(shlex.split(file_cmd), stdout=subprocess.PIPE)
while True:
output = proc.stdout.readline()
if output == b'' and proc.poll() is not None:
break
if output:
yield output.decode(config.ENCODING).strip()
推荐阅读
- arrays - 将 numpy.ndarray 中的两个单元格连接到一个单元格中
- json - vue js 数据设计策略 - 来自 API 的复杂 JSON 对象或具有 PK/FK 关系的简单 JSON 对象
- graalvm - GraalVM Polyglot 无法加载 Java 类
- flutter - 颤振导航到其他页面中的特定选项卡
- git - GitLab:防止推送分支,除非标记
- python - 对 csv 对象的列表理解
- html - 使用 Internet Explorer 的 Excel VBA 错误 462
- javascript - 如何导入有用但未使用的文件或文件夹
- python-3.x - 如何在 Windows 的 Anaconda 上的虚拟环境中安装和使用 PyOCR
- sql - 如果它是另一个字符串的子字符串,如何删除子字符串