Làm cách nào để bạn chuyển đổi dữ liệu byte thô thành chuỗi trong python?

“Chuỗi” trong Python? . Tuy nhiên, bạn có biết có ít nhất bốn loại chuỗi trong Python nguyên thủy không?

Ở đây, hãy để tôi cố gắng giải tỏa một số nhầm lẫn của bạn dựa trên kinh nghiệm học tập của riêng tôi. Chúng tôi sẽ đề cập đến những chủ đề này

  1. Khái niệm “Mã hóa” và “Giải mã” là gì?
  2. Chuỗi thô (r) hoặc chuỗi định dạng (f) là gì và khi nào tôi nên sử dụng chúng?
  3. Sự khác biệt giữa chuỗi Numpy/Pandas và chuỗi Python nguyên thủy là gì?

Chuỗi byte và Chuỗi Unicode (chuỗi Python3 mặc định) — Đó là tất cả về Mã hóa

Để hiểu sự khác biệt giữa chuỗi byte và chuỗi Unicode, trước tiên chúng ta cần biết “Mã hóa” và “Giải mã” là gì

Mã hóa và giải mã (Hình ảnh của tác giả)

Để lưu trữ các ký tự mà con người có thể đọc được trên máy tính, chúng ta cần mã hóa chúng thành byte. Ngược lại, chúng ta cần giải mã các byte thành các ký tự mà con người có thể đọc được để biểu diễn. Byte, trong khoa học máy tính, biểu thị đơn vị 0/1, thường có độ dài 8. Vì vậy, các ký tự “Xin chào” thực sự được lưu trữ dưới dạng “01001000 01101001” trên máy tính, tiêu tốn 2 byte (16 bit)

Quy tắc xác định quy trình mã hóa được gọi là lược đồ mã hóa, những quy tắc thường được sử dụng bao gồm “ASCII”, “UTF-8”, v.v. Bây giờ, câu hỏi là các lược đồ mã hóa này trông như thế nào?

“ASCII” chuyển đổi từng ký tự thành một byte. Vì một byte bao gồm 8 bit và mỗi bit chứa 0/1. Tổng số ký tự “ASCII” có thể đại diện là 2⁸=256. Nó là quá đủ cho 26 chữ cái tiếng Anh cộng với một số ký tự thường dùng. Xem bảng “ASCII” để biết thông tin đầy đủ

Tuy nhiên, 256 ký tự rõ ràng là không đủ để lưu trữ tất cả các ký tự trên thế giới. Trước tình hình đó, người ta đã thiết kế Unicode trong đó mỗi ký tự sẽ được mã hóa thành một “điểm mã”. Chẳng hạn, “H” sẽ được biểu thị dưới dạng điểm mã “U+0048”. Theo Wikipedia, Unicode có thể bao gồm 144.697 ký tự. Nhưng một lần nữa, máy tính vẫn không thể nhận ra điểm mã, vì vậy chúng tôi có lược đồ mã hóa “UTF-8” hoặc các biến thể khác để chuyển đổi điểm mã thành byte. “UTF-8” có nghĩa là độ dài bit tối thiểu để biểu thị một ký tự là 8, vì vậy bạn có thể đoán, “UTF-16” có nghĩa là độ dài tối thiểu của bit là 16. UTF-8 phổ biến hơn nhiều so với UTF-16, vì vậy trong bài viết này và đối với hầu hết công việc của bạn vì chúng tương thích với tiêu chuẩn ASCII gốc cũ (một ký tự có thể được biểu diễn bằng một byte), hiểu UTF-8 là đủ. Xem bảng “UTF-8” để biết thông tin đầy đủ

Với các khái niệm cơ bản đã hiểu, hãy cùng tìm hiểu một số mẹo mã hóa thực tế trong Python. Trong Python3, chuỗi mặc định được gọi là chuỗi Unicode (u string), bạn có thể hiểu chúng là những ký tự mà con người có thể đọc được. Như đã giải thích ở trên, bạn có thể mã hóa chúng thành chuỗi byte (chuỗi b) và chuỗi byte có thể được giải mã trở lại chuỗi Unicode

u'Hi'.encode('ASCII')
> b'Hi'
b'\x48\x69'.decode('ASCII')
> 'Hi'

Trong Python IDE, thông thường, chuỗi byte sẽ được giải mã tự động bằng cách sử dụng “ASCII” khi được in ra, vì vậy đó là lý do tại sao kết quả đầu tiên có thể đọc được bằng con người (b’Hi'). Thường xuyên hơn, chuỗi Byte phải được biểu diễn dưới dạng mã hex (b’\x48\x69'), mã này có thể tìm thấy trong bất kỳ bảng “ASCII” nào

Để kết thúc phần này, chúng ta hãy xem một ví dụ “UTF-8”, một lần nữa mã hex cho mọi ký tự có thể được tìm thấy trong bảng UTF-8

b'\xe0\xb0\x86'.decode('utf-8')
> 'ఆ'
Chuỗi thô

Để bắt đầu với loại chuỗi này, chúng ta chỉ cần biết một điều về chuỗi Unicode mặc định (chuỗi u) — dấu gạch chéo ngược (“\”) là một ký tự đặc biệt trong chuỗi Unicode sao cho ký tự theo sau sẽ có ý nghĩa đặc biệt (i. e. \t, \n, v.v.). Vì vậy, để bỏ qua ý nghĩa đặc biệt của dấu gạch chéo ngược, chúng ta có chuỗi Nguyên (chuỗi r) trong đó dấu gạch chéo ngược chỉ là dấu gạch chéo ngược và nó sẽ không có tác dụng thay đổi ý nghĩa của các ký tự theo sau nó

Chuỗi Unicode và Nguyên (Hình ảnh của Tác giả)

Đây là đề xuất cá nhân của tôi, trừ khi trong trường hợp bạn cần xác định mẫu đối sánh biểu thức chính quy (Xem ví dụ bên dưới), tôi khuyên bạn nên sử dụng chuỗi Unicode có thoát (sử dụng dấu gạch chéo ngược để bỏ qua ký tự đặc biệt). Như được hiển thị trong ví dụ thứ ba, chúng tôi đã sử dụng dấu gạch chéo ngược để đảm bảo rằng chúng tôi xuất ra một chữ “\” thay vì một tab mới “\t”

Tại sao tôi muốn giới thiệu điều đó?

r'ttt'g''File "", line 1
r'ttt'g''
^
SyntaxError: invalid syntax

Tuy nhiên, sử dụng ý tưởng thoát cùng với chuỗi Unicode dường như là một cách tiếp cận tổng quát hơn

u'ttt\'g\''> "ttt'g'"

Nơi duy nhất mà Chuỗi thô (chuỗi r) có thể hữu ích là khi bạn đang xử lý biểu thức chính quy. Biểu thức chính quy là cả một hộp sâu và tôi không có ý định đề cập đến điều đó trong bài viết này. Nhưng khi sử dụng biểu thức chính quy, trước tiên chúng ta cần xác định một mẫu phù hợp trong đó chuỗi Nguyên sẽ được đề xuất

import re
pat = re.compile(r'ENSG\d+$')
string = 'ENSG00000555'
re.search(pat,string)
<_sre.SRE_Match object; span=(0, 12), match='ENSG00000555'>
Định dạng chuỗi

Đối với các lập trình viên Python có kinh nghiệm, chuỗi định dạng không phải là một khái niệm xa lạ, nó cho phép bạn định cấu hình động chuỗi mà chúng ta muốn in. Trước phiên bản Python 3. 5, cách tiếp cận được đề xuất để tạo chuỗi định dạng là như vậy

var = 'hello'
print('{} world'.format(var))
> hello world

Kể từ Python 3. 5 trở lên, có một “chuỗi f” mới để giúp chúng tôi đạt được mục tiêu tương tự

var = 'hello'
print(f'{var} world')
> hello world

Điều quan trọng mà tôi muốn lưu ý ở đây là, khi sử dụng chuỗi định dạng, dấu ngoặc nhọn “{}” trở thành một ký tự rất đặc biệt và chứa đựng ý nghĩa riêng của nó. Do đó, nếu chúng ta vẫn muốn xuất ra chữ “{}”, thì chúng ta cần thoát nó bằng cách sử dụng dấu ngoặc nhọn kép “{{}}”

'{{}}{}'.format(5)> '{}5'

Ngoài ra, hãy cẩn thận với cả

b'\xe0\xb0\x86'.decode('utf-8')
> 'ఆ'
3 trong chuỗi định dạng (hoặc các số khác sau dấu gạch chéo ngược)

# Make sure to write the command in a python file and execute the python file
'ttt {} \1'.format('rr')
> ttt rr
'ttt {} \\1'.format('rr')
> ttt rr \1

Xin lưu ý rằng trong đoạn mã trên nơi đầu ra được tạo bằng cách chạy tệp python, nếu bạn sử dụng bảng điều khiển Python tương tác, nó sẽ gây nhầm lẫn vì đầu ra thực sự được mã hóa tự động thành byte

# if using interactive python console
'ttt {} \1'.format('rr')
> 'ttt rr \x01'
'ttt {} \\1'.format('rr')
> 'ttt rr \\1'

Cuối cùng nhưng không kém phần quan trọng, có thể thực hiện chuỗi

b'\xe0\xb0\x86'.decode('utf-8')
> 'ఆ'
4, trong đó chúng tôi muốn xây dựng một chuỗi thô cho biểu thức chính quy nhưng chúng tôi muốn bọc một số biến trong đó

b'\xe0\xb0\x86'.decode('utf-8')
> 'ఆ'
0Chuỗi trong Numpy và Pandas

Những gì chúng tôi đã trình bày cho đến nay là tất cả về các kiểu chuỗi nguyên thủy trong Python, chúng tôi chưa đề cập đến cách xử lý chuỗi trong các gói Python phổ biến khác. Ở đây tôi sẽ chia sẻ một chút về các loại chuỗi trong Numpy và Pandas

Trong Numpy, thông thường, String có thể được chỉ định trong ba "dtypes" khác nhau

  1. Unicode có độ dài thay đổi (U)
  2. Byte có độ dài cố định (S)
  3. Đối tượng Python (O)
b'\xe0\xb0\x86'.decode('utf-8')
> 'ఆ'
1

b'\xe0\xb0\x86'.decode('utf-8')
> 'ఆ'
5 có nghĩa là chuỗi dài nhất là chuỗi có độ dài 5, tuy nhiên, một cách tiết kiệm bộ nhớ hơn là sử dụng
b'\xe0\xb0\x86'.decode('utf-8')
> 'ఆ'
6 có độ dài cố định, về cơ bản chuyển đổi chúng thành chuỗi byte. Đây là cách ưa thích nếu bạn đang cố gắng chuyển đổi nó sang cấu trúc dữ liệu kiểu mạnh (tôi. e. lưu trữ dưới dạng tệp h5). Ngoài ra, chúng ta có thể coi các chuỗi là các đối tượng Python và lưu trữ chúng trong mảng Numpy, vì mọi đối tượng Python đều có thể được lưu trữ trong mảng Numpy bằng cách sử dụng kiểu “đối tượng”.

Chuỗi trong gấu trúc có thể được biểu diễn theo hai cách

  1. đối tượng dtype (hầu hết thời gian sẽ ổn thôi)
  2. chuỗi dtype
b'\xe0\xb0\x86'.decode('utf-8')
> 'ఆ'
2

Hai loại này nói chung là tương tự nhau, sự khác biệt tinh tế được nêu trong

Phần kết luận

Tóm lại, chúng ta đã nói về các cách biểu diễn khác nhau của “chuỗi” trong Python. Bắt đầu với chuỗi Unicode mặc định (chuỗi u), chúng tôi đã chạm vào cách nó liên quan đến chuỗi Byte (chuỗi b). Hiểu chuyển đổi là rất quan trọng vì đôi khi đầu ra tiêu chuẩn từ các chương trình khác sẽ ở định dạng byte và trước tiên chúng ta cần giải mã chúng thành chuỗi Unicode để tiếp tục hoạt động Truyền phát. Sau đó chúng ta nói về Chuỗi thô (chuỗi r) và Chuỗi định dạng (chuỗi f) và những lưu ý chúng ta cần chú ý khi sử dụng chúng. Cuối cùng, chúng tôi đã tóm tắt các cách biểu diễn chuỗi khác nhau trong Numpy và Pandas, và cần đặc biệt cẩn thận khi khởi tạo các đối tượng Numpy hoặc Pandas bằng chuỗi vì các hành vi sẽ khác nhiều so với các chuỗi Python nguyên thủy

Đó là về nó. Tôi hy vọng bạn thấy bài viết này thú vị và hữu ích, cảm ơn vì đã đọc. Nếu bạn thích bài viết này, hãy theo dõi tôi trên phương tiện, cảm ơn bạn rất nhiều vì sự ủng hộ của bạn. Kết nối với tôi trên Twitter hoặc LinkedIn của tôi, đồng thời vui lòng cho tôi biết nếu bạn có bất kỳ câu hỏi nào hoặc loại hướng dẫn nào bạn muốn xem trong tương lai

Phương pháp nào được sử dụng để chuyển đổi dữ liệu byte thô thành chuỗi?

Sử dụng phương thức giải mã()

Làm cách nào để định dạng bytearray thành chuỗi trong Python?

Sử dụng hàm decode() để chuyển đổi Bytearray thành String trong Python. Một cách khác để chuyển đổi một mảng phụ thành chuỗi là sử dụng phương thức decode(). Phương thức giải mã (), khi được gọi trên một đối tượng bytearray, sẽ lấy định dạng mã hóa làm đầu vào và trả về chuỗi đầu ra.

Chúng ta có thể chuyển đổi byte thành chuỗi không?

Vì vậy, mã bên dưới cũng có thể được sử dụng để chuyển đổi mảng byte thành Chuỗi trong Java. String str = new String(byteArray, StandardCharsets. UTF_8); Lớp String cũng có một phương thức để chuyển đổi một tập con của mảng byte thành String.

Làm cách nào để chuyển đổi dữ liệu nhị phân thành chuỗi trong Python?

Dữ liệu nhị phân được chia thành bộ 7 bit vì bộ nhị phân này làm đầu vào, trả về giá trị thập phân tương ứng là mã ASCII của ký tự trong chuỗi. Mã ASCII này sau đó được chuyển đổi thành chuỗi bằng hàm chr() .