I've baru-baru ini bermigrasi ke Py 3.5. Kode ini bekerja dengan baik dengan 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
Setelah upgrade ke 3.5, saya'm mendapatkan:
TypeError: a bytes-like object is required, not 'str'
kesalahan pada baris terakhir (pola pencarian kode).
I've mencoba menggunakan .decode()
fungsi pada kedua sisi dari pernyataan itu, juga mencoba:
if tmp.find('some-pattern') != -1: continue
- tidak berhasil.
Saya mampu mengatasi hampir semua 2:3 masalah dengan cepat, tapi ini sedikit pernyataan menggangguku.
Anda membuka file tersebut dalam mode binary:
with open(fname, 'rb') as f:
Ini berarti bahwa semua data yang dibaca dari file tersebut dikembalikan sebagai byte
benda-benda, bukan str
. Anda tidak dapat menggunakan string dalam penahanan tes:
if 'some-pattern' in tmp: continue
Anda'd harus menggunakan byte
objek untuk menguji terhadap tmp
sebagai gantinya:
if b'some-pattern' in tmp: continue
atau membuka file sebagai textfile bukan dengan mengganti 'rb'
mode 'r'
.
Seperti itu sudah disebutkan, anda sedang membaca file dalam mode biner dan kemudian membuat daftar byte. Anda berikut untuk loop anda membandingkan string byte dan itu adalah di mana kode ini gagal.
Decoding byte sambil menambahkan ke daftar harus bekerja. Mengubah kode akan terlihat sebagai berikut:
with open(fname, 'rb') as f:
lines = [x.decode('utf8').strip() for x in f.readlines()]
Byte tipe diperkenalkan di Python 3 dan itulah mengapa kode anda bekerja di Python 2. Di Python 2 tidak ada tipe data untuk byte:
>>> s=bytes('hello')
>>> type(s)
<type 'str'>
Anda harus mengubah dari wb w:
def __init__(self):
self.myCsv = csv.writer(open('Item.csv', 'wb'))
self.myCsv.writerow(['title', 'link'])
untuk
def __init__(self):
self.myCsv = csv.writer(open('Item.csv', 'w'))
self.myCsv.writerow(['title', 'link'])
Setelah perubahan ini, kesalahan menghilang, tetapi anda dapat't menulis ke file (dalam kasus saya). Jadi setelah semua, saya don't memiliki jawaban?
Sumber: https://stackoverflow.com/questions/3191289/how-to-remove-m/3191470#3191470
Mengubah ke 'rb' membawa saya yang lain error: io.UnsupportedOperation: menulis
ini contoh kecil: impor 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()
menambahkan "b" sebelum 'MENDAPATKAN http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n' memecahkan masalah saya
Anda membuka file tersebut dalam mode binary:
Kode berikut akan membuang sebuah TypeError: a byte-seperti objek diperlukan, tidak 'str'.
for line in lines:
print(type(line))# <class 'bytes'>
if 'substring' in line:
print('success')
Kode berikut akan bekerja - anda harus menggunakan decode() fungsi:
for line in lines:
line = line.decode()
print(type(line))# <class 'str'>
if 'substring' in line:
print('success')
mengapa tidak mencoba membuka file sebagai teks?
with open(fname, 'rt') as f:
lines = [x.strip() for x in f.readlines()]
Selain itu berikut ini adalah link untuk python 3.x pada laman resmi: https://docs.python.org/3/library/io.html Dan ini adalah membuka fungsi: https://docs.python.org/3/library/functions.html#open
Jika anda benar-benar mencoba untuk menangani hal itu sebagai biner kemudian mempertimbangkan encoding string anda.