【问题标题】:split(os.linesep) error: TypeError: a bytes-like object is required, not 'str' [duplicate]split(os.linesep)错误:TypeError:需要一个类似字节的对象,而不是'str' [重复]
【发布时间】:2017-05-15 20:21:53
【问题描述】:

我有这个简单的代码:

import subprocess, os
cmd = ['java', '-cp', '/weka.jar', 'weka.classifiers.bayes.NaiveBayes', '-t' ,         
       '/MyData.arff']
print (' '.join(cmd))
data = subprocess.check_output(cmd)
data = [line.strip().split('\t') for line in data.split(os.linesep)][0:-1]
print (data) 

运行时出现此错误:

    data = [line.strip().split('\t') for line in data.split(os.linesep)][0:-1]
TypeError: a bytes-like object is required, not 'str'. 

有人知道怎么解决吗?

【问题讨论】:

标签: python


【解决方案1】:

默认情况下,subprocess 为您提供 bytes 作为标准输出。不能使用'...' 字符串进行剥离或拆分,需要使用bytes 对象。

要么告诉subprocess 为您将数据解码为文本(使用universal_newlines=True 或通过设置encoding 参数),或者使用bytes.splitlines() 拆分您的文本,并使用.split(b'\t') 拆分每一行.

【讨论】:

  • 我将代码更改为以下代码: data = [line.strip().split(b'\t') for line in bytes.splitlines(data)][0:-1] 但是数据全部打印在一行中。
  • @RZAKHK:您不想删除最后一行(使用str.split() 时,最后会得到一个空字符串,但bytes.splitlines() 更聪明)。您现在有一个列表列表,只需处理这些。如果你想在不同的行上打印这些东西,你可以使用for row in data: print(*row)
  • 是的,现在可以使用了。谢谢。
  • 很高兴能帮上忙!如果您觉得它对您有用,请随时 accept my answer。 :-)
猜你喜欢
  • 1970-01-01
  • 2016-01-05
相关资源
最近更新 更多