我正在使用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?
答案 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)
我找到了一种解决方法,使用Keith和found 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