Saya baru-baru ini pindah ke Py 3.5. Kode ini berfungsi dengan baik di 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 meningkatkan ke 3.5, saya mendapatkan:
TypeError: a bytes-like object is required, not 'str'
kesalahan pada baris terakhir (kode pencarian pola).
Saya sudah mencoba menggunakan .decode()
fungsi di kedua sisi pernyataan, juga mencoba:
if tmp.find('some-pattern') != -1: continue
- tidak berhasil.
Saya dapat menyelesaikan hampir semua masalah 2: 3 dengan cepat, tetapi pernyataan kecil ini menggangguku.
result = requests.get
dan saya berusahax = result.content.split("\n")
. Saya sedikit bingung dengan pesan kesalahan karena tampaknya menyiratkan bahwa ituresult.content
adalah string dan.split()
memerlukan objek byte-suka .. ?? ("objek seperti byte diperlukan, bukan 'str"') ..Jawaban:
Anda membuka file dalam mode biner:
Ini berarti bahwa semua data yang dibaca dari file dikembalikan sebagai
bytes
objek, bukanstr
. Kemudian Anda tidak dapat menggunakan string dalam uji penahanan:Anda harus menggunakan
bytes
objek untuk diujitmp
sebagai gantinya:atau buka file sebagai file teks sebagai gantinya dengan mengganti
'rb'
mode dengan'r'
.sumber
'r'
vs'rb'
terlalu , beralih antara perilaku file biner dan teks (seperti menerjemahkan baris dan pada platform tertentu, bagaimana penanda EOF diperlakukan). Bahwaio
perpustakaan (menyediakan fungsionalitas I / O default di Python 3 tetapi juga tersedia di Python 2) sekarang juga menerjemahkan file teks secara default adalah perubahan nyata.'b'
flag ketika harus bekerja dengan file biner pada DOS / Windows (sebagai biner adalah POSIX default). Ada baiknya ada tujuan ganda saat menggunakanio
di 3.x untuk akses file.Anda dapat menyandikan string Anda dengan menggunakan
.encode()
Contoh:
sumber
Seperti yang telah disebutkan, Anda membaca file dalam mode biner dan kemudian membuat daftar byte. Dalam mengikuti Anda untuk loop Anda membandingkan string dengan byte dan di situlah kode gagal.
Decoding byte sambil menambahkan ke daftar harus berfungsi. Kode yang diubah akan terlihat sebagai berikut:
Tipe byte diperkenalkan di Python 3 dan itulah sebabnya kode Anda bekerja di Python 2. Dalam Python 2 tidak ada tipe data untuk byte:
sumber
Anda harus mengubah dari wb ke w:
untuk
Setelah mengubah ini, kesalahannya hilang, tetapi Anda tidak dapat menulis ke file (dalam kasus saya). Jadi, bagaimanapun juga, saya tidak punya jawaban?
Sumber: Cara menghapus ^ M
Mengubah ke 'rb' membawa saya kesalahan lain: io.UnsupportedOperation: write
sumber
untuk contoh kecil ini: import socket
menambahkan "b" sebelum 'GET http://www.py4inf.com/code/romeo.txt HTTP / 1.0 \ n \ n' memecahkan masalah saya
sumber
Gunakan fungsi encode () bersama dengan nilai String hardcoded yang diberikan dalam kutipan tunggal.
Ex:
ATAU
sumber
Anda membuka file dalam mode biner:
Kode berikut akan melempar TypeError: diperlukan objek seperti byte, bukan 'str'.
Kode berikut akan berfungsi - Anda harus menggunakan fungsi decode ():
sumber
mengapa tidak mencoba membuka file Anda sebagai teks?
Selain itu di sini adalah tautan untuk python 3.x di halaman resmi: https://docs.python.org/3/library/io.html Dan ini adalah fungsi terbuka: https://docs.python.org/3 /library/functions.html#open
Jika Anda benar-benar mencoba menanganinya sebagai biner maka pertimbangkan untuk menyandikan string Anda.
sumber
Saya mendapatkan kesalahan ini ketika saya mencoba mengonversi char (atau string) menjadi
bytes
, kodenya seperti ini dengan Python 2.7:Ini adalah cara Python 2.7 ketika berhadapan dengan karakter unicode.
Ini tidak akan berfungsi dengan Python 3.6, karena
bytes
memerlukan argumen tambahan untuk penyandian, tetapi ini bisa sedikit rumit, karena penyandian yang berbeda dapat menghasilkan hasil yang berbeda:Dalam kasus saya, saya harus menggunakan
iso_8859_1
ketika encoding byte untuk menyelesaikan masalah.Semoga ini bisa membantu seseorang.
sumber