将子进程的输出转换为 csv.reader 对象

Jer*_*emy 5 csv subprocess python-3.x

有没有办法获取子进程的输出并将其转换为可迭代的 csv.reader 或 csv.DictReader 对象?这是我一直在尝试的代码:

p2 = subprocess.Popen("sort command...", stdout=subprocess.PIPE)
output = p2.communicate()[0]
edits = csv.reader(output, delimiter="\t")
Run Code Online (Sandbox Code Playgroud)

基本上,我正在对一个大型 CSV 文件进行排序,然后我想将其作为 csv.reader 对象放入 Python 中。

我收到的错误是

错误:迭代器应该返回字符串,而不是整数(您是否以文本模式打开文件?)

有没有办法将此字节流视为 csv.reader 对象,或者我是否以错误的方式思考问题?

mha*_*wke 6

这是Python 3中的问题。CSV模块需要unicode输入,而不是字节字符串。除此之外,csv.reader()还需要一个可迭代的对象,例如打开的文件或字符串列表。尝试这个:

encoding = 'ascii'    # specify the encoding of the CSV data
p2 = subprocess.Popen(['sort', '/tmp/data.csv'], stdout=subprocess.PIPE)
output = p2.communicate()[0].decode(encoding)
edits = csv.reader(output.splitlines(), delimiter=",")
for row in edits:
    print(row)
Run Code Online (Sandbox Code Playgroud)

如果/tmp/data.csv包含(我使用逗号作为分隔符):

1,2,3,4
9,10,11,12
A B C D
5,6,7,8

那么输出将是:

[‘1’、‘2’、‘3’、‘4’]
['5'、'6'、'7'、'8']
['9'、'10'、'11'、'12']
['A B C D']