最近、Python 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の問題はほぼすべてすぐに解決できたのですが、この小さな文言が気になるんです。
バイナリーモードでファイルを開いたのですね:
with open(fname, 'rb') as f:
これは、ファイルから読み込んだすべてのデータが str
ではなく bytes
オブジェクトとして返されることを意味します。この場合、封じ込めテストに文字列を使用することはできません:
if 'some-pattern' in tmp: continue
代わりに tmp
に対してテストするために bytes
オブジェクトを使用する必要があります:
if b'some-pattern' in tmp: continue
を 'rb'
モードに置き換えて、代わりにテキストファイルとしてファイルを開くこともできます。
すでに述べたように、あなたはバイナリモードでファイルを読み、バイトのリストを作成しています。次のforループでは、文字列とバイトを比較していますが、ここでコードが失敗しています。
リストに追加しながらバイトをデコードするとうまくいくはずです。変更後のコードは以下のようになるはずです:
with open(fname, 'rb') as f:
lines = [x.decode('utf8').strip() for x in f.readlines()]
bytes型はPython 3で導入されたもので、そのためあなたのコードはPython 2で動作していました。Python 2ではbytesのデータ型はありませんでした:
>>> s=bytes('hello')
>>> type(s)
<type 'str'>
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'])
これを変更すると、エラーは消えますが、ファイルに書き込むことはできません(私の場合)。 結局のところ、私には答えがありません?
出典:https://stackoverflow.com/questions/3191289/how-to-remove-m/3191470#3191470。
「rb」に変更すると、もう1つのエラーが発生します。io.UnsupportedOperation:書き込み。
この小さな例では インポートソケット
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()
を前にして、"b"を追加する。 GET http://www.py4inf.com/code/romeo.txt HTTP/1.0.0 私の問題を解決した
バイナリモードでファイルを開きました。
次のコードがスローされます。 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')
ファイルをテキストとして開いてみませんか?
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。
本当にバイナリとして処理しようとしている場合は、文字列のエンコードを検討してください。