TypeError:序列项0:预期的str实例,找到的字节

时间:2015-08-18 11:46:14

标签: python string python-3.x byte typeerror

String[] temp;
//temp is the String array returned from/populated in your doInBackground method.
List<String> exlist = new ArrayList<>(Arrays.asList(temp));
dataAdapter = new ArrayAdapter(getApplicationContext(), R.layout.lst_layout, R.id.lstLayout, exList);
                lstView = (ListView) findViewById(R.id.listView);
                lstView.setAdapter(dataAdapter);

我收到错误

for line in fo:
    line = " ".join(line.split())
    line = line.strip()

它在python 2.x中运行良好,但不适用于3.4 请为此提出适当的解决方案

3 个答案:

答案 0 :(得分:30)

' '是一个字符串,您使用字节序列调用其join方法。正如文档中所述,在python-3.x中:

  

str.join返回一个字符串,它是字符串的串联   在iterable 可迭代中。如果有的话会TypeError   可迭代的非字符串值,包括bytes个对象。分隔符   elements之间是提供此方法的字符串。

但在这种情况下,由于您正在处理字节对象,因此无法使用str相关方法。字节对象本身带有join()方法,可以与str.join相同的方式使用。您也可以使用io.BytesIO,或者可以使用bytearray对象进行就地连接。正如文档中提到的 bytearray对象是可变的并且具有有效的分配机制。

因此,您只需在空字符串中添加b前缀即可使其成为字节对象:

line = b" ".join(line.split())

此外,如果您的文件包含字符串,则只需以str模式('r')而非字节('rb')打开文件。

with open("input.txt", "r") as f:
    # Do something with f

请注意,尽管python-3.x中的strbyte对象之间存在分离,但在python-2.x中只有str。您可以通过使用b前缀

检查字符串的类型来查看此内容
In [2]: type(b'')
Out[2]: str

这就是以下代码片段的作用:

"".join([b'www', b'www'])

答案 1 :(得分:0)

您应该添加一行 lines = str(lines)

在运行命令以避免错误之前。通过这种方式,您最初会转换为字符串本身。

答案 2 :(得分:0)

如果您是来这里寻找加入C / C ++实现的自定义类的解决方案的,那么最简单的方法是向该类本身添加一个join方法并创建与python的绑定。

例如,一个可以具有列表或映射的类,它们应该是可连接的,pybind11中的示例代码将如下所示:

py::class_<Data> _data(m, "Data");
_data.def(py::init<>())
    .def("join", [] (Data &d, const char *j = ' ') {
        std::string ret;
        if (d.isObject())
            for (auto &o: d.object())
                ret += o.first + j;
        else if (d.isList())
            for (auto &o: d.list())
                ret += o.stringValue() + j;
        return ret;
    })

然后在python中,只需为类调用join方法即可

data.join('_')