将终端输出捕获到pandas数据帧而不创建外部文本文件

时间:2018-02-23 11:09:12

标签: python pandas ffmpeg terminal popen

我正在使用ffmpeg的extract_mvs文件来生成一些文本信息。我会在终端中使用这样的命令:

/extract_mvs input.mp4 > output.txt

我想将此命令与Popen或python中的其他子进程一起使用,使得数据不会直接传递给pandas数据帧,而是实际生成文本文件而不是output.txt。

我的想法是多次自动化,因此,我试图避免生成许多.txt文件,因此必须逐个open()

我想到了这样的事情:

import subprocess
cmd = ['./extract_mvs', 'input.mp4']
a = subprocess.Popen(cmd, stdout=subprocess.PIPE)
df = pd.read_csv(a.communicate()[0], sep=',')

但后来我收到一个错误:OSError: Expected file path name or file-like object, got <class 'bytes'> type

是否可以修复和扩展以便直接从子进程读取到pandas?

3 个答案:

答案 0 :(得分:1)

更新的答案:

我对你的问题和我建议的第一个答案的输出越多,我认为你的问题就越多不是解码问题,也许更多的是未能向pd.read_csv()提供正确的输入。作为替代方案,您可以尝试完全跳过pd.read_csv()。相反,您可以尝试逐行读取子进程的输出到数据帧。

这样的事情:

cmd = ['./extract_mvs', 'input.mp4']

df = pd.DataFrame()

a = subprocess.Popen(cmd, stdout=subprocess.PIPE)

for line in a.stdout:
    df = pd.concat([df, line])

a.wait()

同样,我自己没有测试过这段代码(因为我现在正在旅行并使用手机),但我希望这能让你更接近解决方案。

原始答案:

我没有对此进行测试,但我认为您只需要解码执行子进程返回的结果。具体而言,您需要将结果从bytes解码为utf-8

您可以尝试: pd.read_csv(a.communicate()[0].decode('utf-8'))

答案 1 :(得分:1)

我找到了一种解决方法,使用Keithfound here的部分答案,将信息从字符串传递到pandas数据帧。

最终的工作代码是:

import sys
import subprocess
import pandas as pd

cmd = ['./extract_mvs', 'input.mp4']
a = subprocess.Popen(cmd, stdout=subprocess.PIPE)

if sys.version_info[0] < 3: 
    from StringIO import StringIO
else:
    from io import StringIO

b = StringIO(a.communicate()[0].decode('utf-8'))

df = pd.read_csv(b, sep=",")

答案 2 :(得分:0)

import os
import subprocess
import pandas as pd
import sys
cmd = 'NSLOOKUP email.fullcontact.com'
df = pd.DataFrame()
a = subprocess.Popen(cmd, stdout=subprocess.PIPE)

if sys.version_info[0] < 3: 
    from StringIO import StringIO
else:
    from io import StringIO

b = StringIO(a.communicate()[0].decode('utf-8'))

df = pd.read_csv(b, sep=",")
column = list(df.columns)
name = list(df.iloc[1])[0].strip('Name:').strip()
name