web-dev-qa-db-ja.com

TypeError:バイト3のようなオブジェクトが必要です。Python3でファイルに書き込むときは 'str'ではありません

私はごく最近Py 3.5に移行しました。このコードはPython 2.7では正しく動作していました。

with open(fname, 'rb') as f:
    lines = [x.strip() for x in f.readlines()]

for line in lines:
    tmp = line.strip().lower()
    if 'some-pattern' in tmp: continue
    # ... code

3.5にアップグレードした後、私は手に入れました:

TypeError: a bytes-like object is required, not 'str'

最後の行にエラー(パターン検索コード)があります。

私は、文の両側で.decode()関数を使ってみました。

if tmp.find('some-pattern') != -1: continue

- 無駄に。

私は2:3の問題をほとんどすべてすばやく解決することができましたが、この小さな文は私を悩ますものです。

384
masroore

バイナリモードでファイルを開きました。

with open(fname, 'rb') as f:

これは、ファイルから読み込まれたすべてのデータがbytesではなくstrオブジェクトとして返されることを意味します。その後、包含テストで文字列を使用することはできません。

if 'some-pattern' in tmp: continue

bytesに対してテストするには、代わりにtmpオブジェクトを使用する必要があります。

if b'some-pattern' in tmp: continue

または、'rb'モードを'r'に置き換えて、テキストファイルとしてファイルを開きます。

379
Martijn Pieters

.encode()を使って文字列をエンコードすることができます

例:

'Hello World'.encode()
112
theofpa

すでに説明したように、ファイルをバイナリモードで読み込んでからバイトのリストを作成しています。次の for ループでは、文字列をバイト数と比較していますが、それがコードの失敗箇所です。

リストに追加している間にバイトをデコードすることはうまくいくはずです。変更されたコードは次のようになります。

with open(fname, 'rb') as f:
    lines = [x.decode('utf8').strip() for x in f.readlines()]

Bytes型はPython 3で導入され、それがあなたのコードがPython 2で動作した理由です。Python2ではbytesのデータ型はありませんでした:

>>> s=bytes('hello')
>>> type(s)
<type 'str'>
30
Suresh

この小さな例では:import socket

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('www.py4inf.com', 80))
mysock.send(**b**'GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n')

while True:
    data = mysock.recv(512)
    if ( len(data) < 1 ) :
        break
    print (data);

mysock.close()

「GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n」の前に「b」を追加して問題を解決

12
starter

Wbからwに変更する必要があります。

def __init__(self):
    self.myCsv = csv.writer(open('Item.csv', 'wb')) 
    self.myCsv.writerow(['title', 'link'])

def __init__(self):
    self.myCsv = csv.writer(open('Item.csv', 'w'))
    self.myCsv.writerow(['title', 'link'])

これを変更した後、エラーは消えますが、ファイルに書き込むことはできません(私の場合)。だから、結局のところ、私は答えがないのですか?

ソース: ^ Mを削除する方法

'rb'に変更すると、他のエラーが発生します。io.UnsupportedOperation:write

9
meck373

バイナリモードでファイルを開きました。

次のコードはTypeErrorを投げます。 'str'ではなく、バイトのようなオブジェクトが必要です。

for line in lines:
    print(type(line))# <class 'bytes'>
    if 'substring' in line:
       print('success')

次のコードが動作します - decode()関数を使用する必要があります。

for line in lines:
    line = line.decode()
    print(type(line))# <class 'str'>
    if 'substring' in line:
       print('success')
3
Matan Hugi

ファイルをテキストとして開いてみませんか?

with open(fname, 'rt') as f:
    lines = [x.strip() for x in f.readlines()]

また、公式ページにpython 3.xへのリンクがあります。 https://docs.python.org/3/library/io.html そして、これがオープン関数です。 https:// docs .python.org/3/library/functions.html#open

あなたが本当にそれをバイナリとして扱おうとしているのなら、あなたの文字列をエンコードすることを検討してください。

3

一重引用符で囲まれたハードコードされた文字列値とともにencode()関数を使用します。

例:

file.write(answers[i] + '\n'.encode())

OR

line.split(' +++$+++ '.encode())
0
ShivBuyya