web-dev-qa-db-ja.com

TypeError:シーケンス項目0:予想されるstrインスタンス、バイトが見つかりました

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で動作しない場合は、そのための適切なソリューションをご提案ください。

22
Muhammad Umer

_' '_は、バイトシーケンスでjoinメソッドを呼び出す文字列です。ドキュメントが述べているように、python-3.xで:

_str.join_ iterableiterable内の文字列の連結である文字列を返します。 bytes オブジェクトを含む、イテラブルに文字列以外の値がある場合、 TypeError が発生します。要素間のセパレータは、このメソッドを提供する文字列です。

ただし、この場合、バイトオブジェクトを処理しているため、str関連のメソッドを使用できません。バイトオブジェクト自体には join() が付属しています= _str.join_と同じ方法で使用できるメソッド。 _io.BytesIO_を使用することも、bytearrayオブジェクトとインプレース連結することもできます。ドキュメントが述べたようにbytearrayオブジェクトは可変であり、効率的なオーバーアロケーションメカニズムを持っています。

したがって、空の文字列にbプレフィックスを追加して、それをバイトオブジェクトにすることができます。

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

また、ファイルに文字列が含まれている場合、バイト(_'r'_)の代わりにstrモード(_'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'])
_
35
Kasramvd

行を追加する必要がありますlines = str(lines)

エラーを回避するためにコマンドを実行する前に。この方法では、最初は文字列に変換されます。

0
user3126530

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('_')
0
Adnan Y