Lewati ke konten utama

Cara Mengonversi Bytes ke String di Python

Untuk mengonversi bytes ke string di Python, kita dapat menggunakan metode .decode(), dengan menentukan encoding yang sesuai.
· 8 mnt Baca

Jelajahi bersama AI

Salah satu urutan bawaan Python yang kurang dikenal adalah bytes, yaitu urutan integer yang tidak dapat diubah (immutable). Setiap integer mewakili satu byte data. Data sering dikirimkan melalui jaringan dan program sebagai bytes. Bytes tidak dapat dibaca manusia, dan kita sering perlu mengonversinya menjadi string dalam program Python kita.

Tutorial ini membahas teknik mengonversi bytes ke string di Python. Jika Anda tertarik dengan operasi kebalikannya, lihat tutorial saya tentang cara mengonversi string ke bytes di Python.

Mari mulai dengan jawaban singkat bagi Anda yang sedang terburu-buru.

Jawaban Singkat: Cara Mengonversi Bytes ke String di Python

Alat utama untuk mengonversi bytes ke string di Python adalah metode .decode():

data = b"\xc3\xa9clair"
text = data.decode(encoding="utf-8")
print(text)
éclair

Metode .decode() mengembalikan string yang merepresentasikan objek bytes. Pada contoh ini digunakan decoding UTF-8. UTF-8 adalah encoding default, jadi tidak wajib disebutkan pada contoh di atas, tetapi kita juga dapat menggunakan encoding lain.

Memahami Bytes dan String di Python

Python memiliki struktur data bawaan bytes, yaitu urutan integer yang tidak dapat diubah dalam rentang 0 hingga 255. Sebuah integer dalam rentang 256 angka ini dapat direpresentasikan menggunakan delapan bit data, yang setara dengan satu byte. Karena itu, setiap elemen dalam objek bytes adalah integer yang mewakili satu byte.

Mari gunakan konstruktor bytes() untuk membuat objek bytes dari sebuah list:

data = bytes([68, 97, 116, 97, 67, 97, 109, 112])
print(type(data))
<class 'bytes'>

Urutan integer ini bersifat immutable:

data[0] = 100
Traceback (most recent call last):
 ...
   data[0] = 100
   ~~~~^^^
TypeError: 'bytes' object does not support item assignment

Python akan memunculkan TypeError ketika kita mencoba mengubah nilai dalam urutan ini. Mari konfirmasi bahwa objek bytes hanya dapat berisi integer dalam rentang 0 hingga 255:

data = bytes([254, 255, 256])
Traceback (most recent call last):
 ...
   data = bytes([254, 255, 256])
          ^^^^^^^^^^^^^^^^^^^^^^
ValueError: bytes must be in range(0, 256)

ValueError menyatakan bahwa integer yang merepresentasikan sebuah byte harus merupakan anggota dari range(0, 256). Akhir rentang tidak disertakan, sesuai konvensi rentang angka di Python.

Kita dapat menampilkan objek bytes menggunakan print():

data = bytes([68, 97, 116, 97, 67, 97, 109, 112])
print(data)
b'DataCamp'

Representasi tersebut menampilkan objek bytes dalam bentuk karakter. Python menampilkan integer menggunakan karakter ASCII yang sesuai dengan nilai tersebut. Prefiks b di depan karakter dalam tanda kutip menunjukkan bahwa ini adalah objek bytes.

Kita juga dapat membuat objek bytes menggunakan literal bytes secara langsung:

data = b"DataCamp"
print(data)
print(data[0])
b'DataCamp'
68

Objek tersebut ditampilkan sebagai karakter, tetapi elemennya adalah integer.

Namun, objek bytes hanya dapat dibaca manusia jika menggunakan integer yang sesuai dengan karakter ASCII yang dapat dicetak. Karena ASCII adalah encoding 7-bit, ia memuat 128 kode, tetapi hanya 95 karakter ASCII yang dapat dicetak.

Integer antara 0 dan 127 yang tidak memiliki karakter ASCII yang dapat dicetak serta integer antara 128 dan 255 ditampilkan sebagai bilangan heksadesimal:

data = bytes([0, 68, 97, 116, 97, 67, 97, 109, 112, 200])
print(data)
b'\x00DataCamp\xc8'

Integer pertama dalam list sekarang bernilai 0, yang bukan karakter yang dapat dicetak dalam ASCII. Objek bytes menampilkan integer ini sebagai \x00, representasi heksadesimal dari 0. Integer terakhir adalah 200, yang berada di luar rentang ASCII tetapi masih dalam rentang integer yang dapat digunakan dalam bytes. Python menampilkan integer ini sebagai \xc8, yaitu 200 dalam heksadesimal.

Struktur data bytes dan string memiliki kesamaan. Keduanya merupakan urutan yang tidak dapat diubah, tetapi bytes berisi integer, sedangkan string berisi karakter:

data = bytes([68, 97, 116, 97, 67, 97, 109, 112])
print(data[0])

​text = "DataCamp"
print(text[0])
68
D

Bytes digunakan untuk mentransfer data melalui jaringan dan antarmuka yang berbeda. Bagian selanjutnya membahas cara mengonversi bytes ke string.

Mengonversi Bytes ke String: Metode .decode()

Objek bytes di Python hanya dapat dibaca manusia saat berisi karakter ASCII yang dapat dibaca. Dalam sebagian besar aplikasi, karakter-karakter ini tidak cukup. Kita dapat mengonversi objek bytes menjadi string menggunakan metode .decode():

data = bytes([68, 97, 116, 97, 67, 97, 109, 112])
text = data.decode()

print(text)
print(type(text))
DataCamp
<class 'str'>

Namun, ada berbagai encoding untuk konversi antara bytes dan string. Integer pada contoh di atas merepresentasikan karakter ASCII yang dapat dicetak. Akan tetapi, encoding default yang digunakan ketika tidak ada argumen yang diberikan ke .decode() adalah UTF-8, bukan ASCII. UTF-8 adalah encoding yang paling banyak digunakan untuk karakter Unicode.

128 kode UTF-8 pertama cocok dengan kode ASCII, itulah sebabnya objek bytes data didekodekan menjadi string "DataCamp" pada contoh di atas.

Namun, Unicode memuat hampir 150.000 karakter. UTF-8 mengenkode semua karakter non-ASCII di Unicode menggunakan dua byte atau lebih.

Mari buat objek bytes baru dan dekode:

data = bytes([195, 169])
print(data)

text = data.decode()
print(text)
b'\xc3\xa9'
é

Objek bytes tersebut berisi dua byte: integer 195 dan 169. Python menampilkan representasi heksadesimal dari byte-byte ini. Namun, .decode() mengembalikan sebuah string dengan mendekode objek bytes menggunakan encoding UTF-8. Sepasang byte b'\xc3\xa9' merepresentasikan huruf e dengan aksen akut, é.

Metode .decode() menerima argumen opsional untuk menentukan encoding:

text = data.decode("utf-8")
print(text)
é

UTF-8 adalah encoding default, tetapi encoding lain juga dapat digunakan. Kita juga dapat mengonversi string menjadi objek bytes menggunakan metode string .encode() dengan berbagai encoding:

text = "éclair"
data = text.encode("utf-8")
print(data)

data = text.encode("utf-16")
print(data)
b'\xc3\xa9clair'
b'\xff\xfe\xe9\x00c\x00l\x00a\x00i\x00r\x00'

String yang sama dikonversi menjadi objek bytes yang berbeda tergantung pada encoding karakter yang kita gunakan.

Kesalahan Encoding

Pilihan encoding karakter dapat menimbulkan kesalahan jika digunakan encoding yang berbeda saat konversi antara bytes dan string. Mari gunakan contoh dengan string "éclair" yang dienkode ke bytes menggunakan encoding UTF-8:

text = "éclair"
data = text.encode("utf-8")
print(data)
b'\xc3\xa9clair'

Urutan byte ini merepresentasikan karakter menggunakan encoding UTF-8. Metode .decode() akan memunculkan kesalahan jika kita menggunakan encoding yang salah:

text = data.decode("ascii")
print(text)
Traceback (most recent call last):
 ...
   text = data.decode("ascii")
          ^^^^^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)

Namun, kita dapat menyertakan argumen opsional errors untuk menangani kesalahan apa pun. Nilai default parameter errors adalah "strict", yang akan memunculkan kesalahan untuk karakter yang tidak valid.

Metode .decode() dapat dipanggil dengan errors="ignore" untuk mengabaikan semua karakter tidak valid:

text = data.decode("ascii", errors="ignore")
print(text)
clair

Karakter pertama dalam string asli adalah é, yang bukan karakter ASCII. Oleh karena itu, .decode() mengembalikan string tanpa karakter pertama.

Opsi lain adalah memanggil .decode() dengan errors="replace", yang mengganti byte tidak valid dengan �:

text = data.decode("ascii", errors="replace")
print(text)
��clair

Keluaran ini menunjukkan bahwa ada karakter yang hilang dari string. Pilihan penanganan kesalahan bergantung pada aplikasi.

Mengonversi Bytes ke String Dengan str()

Metode .decode() adalah jalur utama untuk mengonversi bytes menjadi string. Namun, kita juga dapat menggunakan konstruktor str() secara langsung. Menggunakan konstruktor str() pada objek bytes akan membuat representasi string dari bytes mentah:

data = b'\xc3\xa9clair'
text = str(data)

print(text)
print(type(text))
b'\xc3\xa9clair'
<class 'str'>

Namun, konstruktor str() juga menerima argumen encoding, yang dapat kita gunakan untuk membuat string berdasarkan encoding tertentu:

text = str(data, encoding='utf-8')
print(text)
éclair

Mengonversi Bytes ke String Dengan codecs.decode()

Modul codecs di pustaka standar Python menyediakan antarmuka untuk encoding dan decoding data. Modul ini juga menyediakan fungsi .decode() yang dapat digunakan untuk mengonversi bytes Python menjadi string:

import codecs

​data = b'\xc3\xa9clair'
text = codecs.decode(data, encoding='utf-8')
print(text)
éclair

Teknik konversi alternatif ini bukan merupakan metode dari tipe bytes, melainkan fungsi yang memerlukan objek bytes diteruskan sebagai argumen.

Kesimpulan

Data sering ditransfer sebagai bytes, dan banyak aplikasi Python perlu melakukan konversi antara bytes dan string. Objek bytes adalah urutan byte yang tidak dapat diubah yang dapat dikonversi menjadi string menggunakan salah satu dari beberapa encoding karakter.

Jalur utama untuk mengonversi bytes Python menjadi string adalah metode .decode(), yang memungkinkan pengguna memilih encoding dan strategi penanganan kesalahan.

Anda dapat melanjutkan pembelajaran Python dengan tutorial dan kursus berikut:

Stephen Gruppetta

Penulis

Stephen Gruppetta

Saya belajar Fisika dan Matematika pada tingkat sarjana di University of Malta. Kemudian, saya pindah ke London dan meraih gelar PhD dalam bidang Fisika dari Imperial College. Saya meneliti teknik optik baru untuk memindai retina manusia. Sekarang, saya berfokus menulis tentang Python, berkomunikasi tentang Python, dan mengajar Python.

Topik

Terkait

blogs

Tutorial Korelasi di R

blogs

Spaghetti Plot dan Jalur Badai