【问题标题】:TypeError: sequence item 0: expected str instance, bytes found类型错误:序列项 0:预期的 str 实例,找到的字节
【发布时间】:2015-11-11 08:07:21
【问题描述】:
for line in fo:
    line = " ".join(line.split())
    line = line.strip()

我收到一个错误

line = ''.join(line.split())
TypeError: sequence item 0: expected str instance, bytes found

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

【问题讨论】:

  • 将字节转换为 str,可能会有所帮助。
  • fo = open("input.txt", "rb")

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


【解决方案1】:

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

str.join返回一个字符串,它是字符串的连接 在iterable 可迭代。如果有任何 TypeError 将被提出 可迭代的非字符串值,包括 bytes 对象。分隔符 元素之间是提供此方法的字符串。

但是在这种情况下,由于您正在处理字节对象,因此您不能使用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

这就是使以下 sn-p 起作用的原因:

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

【讨论】:

  • 救命稻草 - 在连接字符串之前添加 b - 非常感谢!
【解决方案2】:

你可以使用str()函数:

lines=str(lines)

在运行命令之前避免错误。

这样您就可以将lines 变量转换为字符串。

【讨论】:

    【解决方案3】:

    如果您来这里寻找加入 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('_')
    

    【讨论】:

      猜你喜欢
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多