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で動作しない場合は、そのための適切なソリューションをご提案ください。
_' '
_は、バイトシーケンスで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ではstr
とbyte
オブジェクトが分離されていますが、python-2.xではstr
しかありません。これは、b
プレフィックスを含む文字列のタイプを確認することで確認できます。
_In [2]: type(b'')
Out[2]: str
_
そして、それが次のスニペットを機能させるものです:
_"".join([b'www', b'www'])
_
行を追加する必要がありますlines = str(lines)
エラーを回避するためにコマンドを実行する前に。この方法では、最初は文字列に変換されます。
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('_')