python - 如何使用 struct.unpack 将 POpen 的输出作为流处理?

标签 python stream

Possible Duplicate:
subprocess.Popen.stdout - reading stdout in real-time, again!

我正在处理二进制文件的输出,但我使用临时字符串来表示输出。由于理论上输出可能相当大,因此我更愿意使用 unpack 或 unpack_from 将输出作为流处理。

代码是这样的:

file = '/home/t/FinancialData/GBPUSD/2007/05/01/20070501_01h_ticks.bi5';
command = ('lzma', '-kdc', '-S', 'bi5', file);
p = subprocess.Popen(command, stdout=subprocess.PIPE);
out, err = p.communicate();
for s in (out[x:x+20] for x in range(0, len(out), 20)):
    values = struct.unpack(">3L2f", s)
    with open(csvfilename, 'wb') as csvfile:
        csvwriter = csv.writer(csvfile, delimiter=',',
                               quotechar='|', quoting=csv.QUOTE_MINIMAL)
        csvwriter.writerow(values);

有没有办法重写它,这样它就不必将整个输出存储在 out 中,而是将其作为流处理?

最佳答案

您可以在 stdout 属性周围放置一个 select 调用 Popen 对象并轮询直到进程完成。例如:

from subprocess import Popen, PIPE
from select import select

cmd = ('lzma', '-kdc', '-S', 'bi5', 'path/to/datafile')
p = Popen(cmd, stdout=PIPE)

while p.poll() == None:
    r,w,e = select([p.stdout], [], [])
    if r:
        data = p.stdout.read(512)
        # unpack and append to csv file ...

干杯,

关于python - 如何使用 struct.unpack 将 POpen 的输出作为流处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13155893/

相关文章:

python - 向 Django 项目添加调试页面?

C++:将 istream 和 ostream + 覆盖流运算符捆绑在一起

java - 为什么 AudioInputStream 读取永远不会返回 -1?

c# - WCF - 返回带有流数据的对象

python - 在 SQLite3 更新中使用实例变量?

python - Pyspark 从现有数组列创建一定长度的数组列

python - 如何使用 Ctypes 将此 numpy 数组传递给 C?

javascript - 可视化来自远程对等连接的媒体流

node.js - Node js-将数据写入可写流

python - 需要帮助的一个简单的python错误