TypeError:Python3でファイルに書き込む場合、「str」ではなく、バイトのようなオブジェクトが必要です

2015年10月10日に質問されました。  ·  閲覧回数 1.3M回  ·  ソース

masroore picture
2015年10月10日

ごく最近、Py3.5に移行しました。 このコードはPython2.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の問題をすばやく解決することができましたが、この小さな声明は私を悩ませています。

回答

Martijn Pieters picture
2015年10月10日
609

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

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

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

if 'some-pattern' in tmp: continue

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

if b'some-pattern' in tmp: continue

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

theofpa picture
2016年05月23日
237

.encode()を使用して文字列をエンコードできます

例:

'Hello World'.encode()
Suresh picture
2016年05月17日
57

すでに述べたように、バイナリモードでファイルを読み取り、バイトのリストを作成しています。 次のforループでは、文字列とバイトを比較していますが、ここでコードが失敗します。

リストへの追加中にバイトをデコードすると機能するはずです。 変更されたコードは次のようになります。

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

バイトタイプはPython3で導入されたため、コードはPython 2で機能しました。Python2では、バイトのデータ型はありませんでした。

>>> s=bytes('hello')
>>> type(s)
<type 'str'>
meck373 picture
2017年04月28日
29

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

starter picture
2016年03月22日
16

この小さな例の場合:

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」を追加すると問題が解決しました

Shiv Buyya picture
2019年04月20日
12

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

例:

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

または

line.split(' +++$+++ '.encode())
Matan Hugi picture
2018年05月16日
10

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

次のコードは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')
Fernando D Jaime picture
2017年12月01日
5

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

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

さらに、公式ページにpython 3.xへのリンクがあります: httpshttps

本当にバイナリとして処理しようとしている場合は、文字列をエンコードすることを検討してください。

Ibrahim.H picture
2020年05月05日
1

文字(または文字列)をbytesに変換しようとしたときにこのエラーが発生しました。コードは、Python2.7では次のようになりました。

# -*- coding: utf-8 -*-
print( bytes('ò') )

これは一つの方法ですPythonの2.7 Unicodeの文字を扱います。

bytesはエンコードに追加の引数を必要とするため、これはPython 3.6では機能しませんが、エンコードが異なると出力が異なる可能性があるため、少し注意が必要です。

print( bytes('ò', 'iso_8859_1') ) # prints: b'\xf2'
print( bytes('ò', 'utf-8') ) # prints: b'\xc3\xb2'

私の場合、問題を解決するためにバイトをエンコードするときにiso_8859_1を使用する必要がありました。

これが誰かを助けることを願っています。