read_csv pandas 函数的输入

Bra*_*don 7 python subprocess pandas

我需要将我使用 Popen 执行的一个命令的输出提供给 pandas read_csv。

p = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
stdout, stderr = p.communicate()
pandas.read_csv(stdout,index_col=0)
Run Code Online (Sandbox Code Playgroud)

但显然 stdout 是一个字符串,它被解释为路径。在 API 文档中,它说“任何具有 read() 方法的对象(例如文件句柄或 StringIO)”都可以作为 read_csv 函数的输入。如何从 Popen 命令中获取这样的对象?最终目标是不写入磁盘。

另外,当我将 stdout 的内容写入磁盘时,我可以看到 csv 每行都有双引号

alvarobrandon$ head csvfile.csv
"1507109453,<,java,12447,a3e9c495869d,docker,9.0.4.130,9.0.2.131,9.0.2.131,9.0.4.130,56182,9092,9092,56182,tcp"
"1507109453,<,java,1244,a3e9c495869d,docker,9.0.4.130,9.0.2.131,9.0.2.131,9.0.4.130,56182,9092,9092,56182,tcp"
"1507109453,<,java,12447,a3e9c495869d,docker,9.0.4.130,9.0.2.131,9.0.2.131,9.0.4.130,56182,9092,9092,56182,tcp"
Run Code Online (Sandbox Code Playgroud)

Bar*_*oon 5

您需要的是从标准输出读取并将该数据存储到类似文件的StringIO对象中。这是一个最小的工作示例。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import io
import subprocess
import pandas

cmd = ('cat', '/tmp/csvfile')
process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
csv = io.StringIO(process.stdout.read().decode())
data = pandas.read_csv(csv, index_col=0)
csv.close()
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

编辑(输出并不是真正的 CSV,所以我们必须在解析之前对其进行一些清理):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import io
import subprocess
import pandas

cmd = ('cat', '/tmp/csvfile')
process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
csv = io.StringIO()
for line in process.stdout:
    csv.write(line.decode().strip('"\n') + '\n')
csv.seek(0)
data = pandas.read_csv(csv, index_col=0)
csv.close()
Run Code Online (Sandbox Code Playgroud)