Chuyển đổi byte thành một chuỗi


2310

Tôi đang sử dụng mã này để nhận đầu ra tiêu chuẩn từ một chương trình bên ngoài:

>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]

Phương thức truyền thông () trả về một mảng byte:

>>> command_stdout
b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2\n'

Tuy nhiên, tôi muốn làm việc với đầu ra như một chuỗi Python bình thường. Để tôi có thể in nó như thế này:

>>> print(command_stdout)
-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1
-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2

Tôi nghĩ đó là phương thức binascii.b2a_qp () để làm gì, nhưng khi tôi thử nó, tôi lại nhận được mảng byte tương tự:

>>> binascii.b2a_qp(command_stdout)
b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2\n'

Làm cách nào để chuyển đổi giá trị byte trở lại chuỗi? Ý tôi là, sử dụng "pin" thay vì làm thủ công. Và tôi muốn nó ổn với Python 3.


47
tại sao không str(text_bytes)làm việc Điều này có vẻ kỳ quái với tôi.
Charlie Parker

13
@CharlieParker Vì str(text_bytes)không thể chỉ định mã hóa. Tùy thuộc vào những gì trong text_bytes, text_bytes.decode('cp1250) `có thể dẫn đến một chuỗi rất khác nhau text_bytes.decode('utf-8').
Craig Anderson

6
vì vậy strhàm không chuyển đổi thành một chuỗi thực nữa. Một người đã nói một cách mã hóa rõ ràng vì một số lý do tôi lười đọc qua tại sao. Chỉ cần chuyển đổi nó utf-8và xem nếu mã ur hoạt động. ví dụvar = var.decode('utf-8')
Charlie Parker

1
@CraigAnderson: unicode_text = str(bytestring, character_encoding)hoạt động như mong đợi trên Python 3. Mặc dù vậy, unicode_text = bytestring.decode(character_encoding)tốt hơn là tránh nhầm lẫn với việc chỉ str(bytes_obj)tạo ra một biểu diễn văn bản bytes_objthay vì giải mã nó thành văn bản: str(b'\xb6', 'cp1252') == b'\xb6'.decode('cp1252') == '¶'str(b'\xb6') == "b'\\xb6'" == repr(b'\xb6') != '¶'
jfs

Câu trả lời:


3675

Bạn cần giải mã đối tượng byte để tạo chuỗi:

>>> b"abcde"
b'abcde'

# utf-8 is used here because it is a very common encoding, but you
# need to use the encoding your data is actually in.
>>> b"abcde".decode("utf-8") 
'abcde'

58
Việc sử dụng "windows-1252"cũng không đáng tin cậy (ví dụ, đối với các phiên bản ngôn ngữ khác của Windows), liệu có tốt nhất để sử dụng sys.stdout.encodingkhông?
nikow

12
Có lẽ điều này sẽ giúp ai đó hơn nữa: Đôi khi bạn sử dụng mảng byte cho giao tiếp TCP cũ. Nếu bạn muốn chuyển đổi mảng byte thành chuỗi cắt các ký tự '\ x00', câu trả lời sau đây là không đủ. Sử dụng b'example \ x00 \ x00'.decode ('utf-8'). Dải ('\ x00') sau đó.
Wookie88

2
Tôi đã lấp đầy một lỗi về việc ghi lại nó tại bug.python.org/su17860 - thoải mái đề xuất một bản vá. Nếu khó đóng góp - ý kiến ​​làm thế nào để cải thiện được chào đón.
anatoly techtonik

44
Trong Python 2.7.6 không xử lý b"\x80\x02\x03".decode("utf-8")-> UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 0: invalid start byte.
martineau

9
Nếu nội dung là giá trị nhị phân ngẫu nhiên, utf-8chuyển đổi có khả năng thất bại. Thay vào đó, hãy xem câu trả lời @techtonik (bên dưới) stackoverflow.com/a/27527728/198536
wallyk

215

Bạn cần giải mã chuỗi byte và chuyển nó thành chuỗi ký tự (Unicode).

Trên Python 2

encoding = 'utf-8'
'hello'.decode(encoding)

hoặc là

unicode('hello', encoding)

Trên Python 3

encoding = 'utf-8'
b'hello'.decode(encoding)

hoặc là

str(b'hello', encoding)

2
Trên Python 3, nếu chuỗi nằm trong một biến thì sao?
Alaa M.

1
@AlaaM.: Giống nhau. Nếu bạn có variable = b'hello', thìunicode_text = variable.decode(character_encoding)
jfs

182

Tôi nghĩ rằng cách này là dễ dàng:

>>> bytes_data = [112, 52, 52]
>>> "".join(map(chr, bytes_data))
'p44'

6
Cảm ơn bạn, phương pháp của bạn đã làm việc cho tôi khi không ai khác làm. Tôi đã có một mảng byte không được mã hóa mà tôi cần biến thành một chuỗi. Đã cố gắng tìm cách mã hóa lại nó để tôi có thể giải mã nó thành một chuỗi. Phương pháp này hoạt động hoàn hảo!
leetNightshade

5
@leetNightshade: tuy nhiên nó không hiệu quả lắm. Nếu bạn có một mảng byte, bạn chỉ cần giải mã.
Martijn Pieters

12
@Martijn Pieters Tôi chỉ thực hiện một điểm chuẩn đơn giản với các câu trả lời khác này, chạy nhiều 10.000 lần chạy stackoverflow.com/a/3646405353094 Và giải pháp trên thực sự nhanh hơn rất nhiều lần. Đối với 10.000 lần chạy trong Python 2.7.7, phải mất 8ms, so với các lần chạy khác ở mức 12ms và 18ms. Cấp có thể có một số biến thể tùy thuộc vào đầu vào, phiên bản Python, vv Có vẻ như không quá chậm đối với tôi.
leetNightshade

5
@Martijn Pieters Có. Vì vậy, với điểm đó, đây không phải là câu trả lời tốt nhất cho phần chính của câu hỏi đã được hỏi. Và tiêu đề là sai lệch, phải không? Anh ấy / cô ấy muốn chuyển đổi một chuỗi byte thành một chuỗi thông thường, không phải là một mảng byte thành một chuỗi. Câu trả lời này hoạt động tốt cho tiêu đề của câu hỏi đã được hỏi.
leetNightshade

5
Đối với python 3, giá trị này tương đương với bytes([112, 52, 52])- btw byte là tên xấu cho một biến cục bộ chính xác bởi vì đó là một p3 dựng sẵn
Mr_and_Mrs_D

92

Nếu bạn không biết mã hóa, thì để đọc đầu vào nhị phân thành chuỗi theo cách tương thích Python 3 và Python 2, hãy sử dụng mã hóa MS-DOS CP437 cổ đại :

PY3K = sys.version_info >= (3, 0)

lines = []
for line in stream:
    if not PY3K:
        lines.append(line)
    else:
        lines.append(line.decode('cp437'))

Vì mã hóa là không xác định, hy vọng các ký hiệu không phải tiếng Anh sẽ dịch sang các ký tự của cp437(các ký tự tiếng Anh không được dịch, vì chúng khớp với hầu hết các mã hóa byte đơn và UTF-8).

Giải mã đầu vào nhị phân tùy ý cho UTF-8 là không an toàn, bởi vì bạn có thể nhận được điều này:

>>> b'\x00\x01\xffsd'.decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 2: invalid
start byte

Điều tương tự cũng áp dụng cho latin-1, điều phổ biến (mặc định?) Cho Python 2. Xem các điểm còn thiếu trong Bố cục Codepage - đó là nơi Python bị nghẹt thở ordinal not in range.

CẬP NHẬT 20150604 : Có tin đồn rằng Python 3 có surrogateescapechiến lược lỗi để mã hóa công cụ thành dữ liệu nhị phân mà không mất dữ liệu và sự cố, nhưng nó cần kiểm tra chuyển đổi [binary] -> [str] -> [binary], để xác thực cả hiệu suất và độ tin cậy.

CẬP NHẬT 20170116 : Nhờ bình luận của Nearoo - cũng có khả năng gạch chéo thoát tất cả các byte không xác định bằng backslashreplacetrình xử lý lỗi. Điều đó chỉ hoạt động với Python 3, vì vậy ngay cả với cách giải quyết này, bạn vẫn sẽ nhận được đầu ra không nhất quán từ các phiên bản Python khác nhau:

PY3K = sys.version_info >= (3, 0)

lines = []
for line in stream:
    if not PY3K:
        lines.append(line)
    else:
        lines.append(line.decode('utf-8', 'backslashreplace'))

Xem Hỗ trợ Unicode của Python để biết chi tiết.

CẬP NHẬT 20170119 : Tôi đã quyết định triển khai giải mã thoát dấu gạch chéo hoạt động cho cả Python 2 và Python 3. Nó sẽ chậm hơn cp437giải pháp, nhưng nó sẽ tạo ra kết quả giống hệt nhau trên mọi phiên bản Python.

# --- preparation

import codecs

def slashescape(err):
    """ codecs error handler. err is UnicodeDecode instance. return
    a tuple with a replacement for the unencodable part of the input
    and a position where encoding should continue"""
    #print err, dir(err), err.start, err.end, err.object[:err.start]
    thebyte = err.object[err.start:err.end]
    repl = u'\\x'+hex(ord(thebyte))[2:]
    return (repl, err.end)

codecs.register_error('slashescape', slashescape)

# --- processing

stream = [b'\x80abc']

lines = []
for line in stream:
    lines.append(line.decode('utf-8', 'slashescape'))

6
Tôi thực sự cảm thấy như Python nên cung cấp một cơ chế để thay thế các biểu tượng bị thiếu và tiếp tục.
anatoly techtonik

@techtonik: Điều này sẽ không hoạt động trên một mảng như nó hoạt động trong python2.
dùng2284570

@ user2284570 có nghĩa là danh sách? Và tại sao nó nên làm việc trên mảng? Đặc biệt là mảng phao ..
anatoly techtonik

Bạn cũng có thể bỏ qua các lỗi unicode với b'\x00\x01\xffsd'.decode('utf-8', 'ignore')trong python 3.
Antonis Kalou

3
@anatolytechtonik Có khả năng rời khỏi chuỗi thoát trong chuỗi và tiếp tục: b'\x80abc'.decode("utf-8", "backslashreplace")sẽ dẫn đến '\\x80abc'. Thông tin này được lấy từ trang tài liệu unicode dường như đã được cập nhật kể từ khi viết câu trả lời này.
Nearoo

86

Trong Python 3 , mã hóa mặc định là "utf-8", vì vậy bạn có thể trực tiếp sử dụng:

b'hello'.decode()

tương đương với

b'hello'.decode(encoding="utf-8")

Mặt khác, trong Python 2 , mã hóa mặc định thành mã hóa chuỗi mặc định. Vì vậy, bạn nên sử dụng:

b'hello'.decode(encoding)

nơi encodinglà mã hóa mà bạn muốn.

Lưu ý: hỗ trợ cho các đối số từ khóa đã được thêm vào Python 2.7.


41

Tôi nghĩ rằng bạn thực sự muốn điều này:

>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
>>> command_text = command_stdout.decode(encoding='windows-1252')

Câu trả lời của Aaron là đúng, ngoại trừ việc bạn cần phải biết mã hóa để sử dụng. Và tôi tin rằng Windows sử dụng 'windows-1252'. Sẽ chỉ có vấn đề nếu bạn có một số ký tự bất thường (không phải ASCII) trong nội dung của mình, nhưng sau đó nó sẽ tạo ra sự khác biệt.

Nhân tiện, thực tế là nó vấn đề là lý do khiến Python chuyển sang sử dụng hai loại khác nhau cho dữ liệu nhị phân và dữ liệu văn bản: nó không thể chuyển đổi kỳ diệu giữa chúng, bởi vì nó không biết mã hóa trừ khi bạn nói với nó! Cách duy nhất BẠN sẽ biết là đọc tài liệu Windows (hoặc đọc tại đây).


3
open()chức năng cho các luồng văn bản hoặc Popen()nếu bạn vượt qua nó universal_newlines=Truesẽ quyết định một cách kỳ diệu mã hóa ký tự cho bạn ( locale.getpreferredencoding(False)trong Python 3.3+).
jfs

2
'latin-1'là một mã hóa nguyên văn với tất cả các điểm mã được đặt, vì vậy bạn có thể sử dụng mã đó để đọc một chuỗi byte hiệu quả vào bất kỳ loại chuỗi nào mà Python của bạn hỗ trợ (vì vậy nguyên văn trên Python 2, thành Unicode cho Python 3).
tripleee 17/2/2017

@tripleee: 'latin-1'là một cách tốt để có mojibake. Ngoài ra còn có sự thay thế kỳ diệu trên Windows: thật khó để chuyển dữ liệu từ quy trình này sang quy trình khác chưa được sửa đổi, ví dụ dir: \xb6-> \x14(ví dụ ở cuối câu trả lời của tôi)
jfs

32

Đặt Universal_newlines thành True, nghĩa là

command_stdout = Popen(['ls', '-l'], stdout=PIPE, universal_newlines=True).communicate()[0]

5
Tôi đã sử dụng phương pháp này và nó hoạt động. Mặc dù, đó chỉ là đoán mã hóa dựa trên sở thích của người dùng trên hệ thống của bạn, vì vậy nó không mạnh mẽ như một số tùy chọn khác. Đây là những gì nó đang làm, tham khảo docs.python.org/3.4/l Library / sub process.html: "Nếu Universal_newlines là True, [stdin, stdout và stderr] sẽ được mở dưới dạng luồng văn bản trong chế độ dòng mới phổ biến sử dụng mã hóa được trả về bởi miền địa phương .getpreferredencoding (Sai). "
twasbrillig

Trên 3.7 bạn có thể (và nên) làm text=Truethay vì universal_newlines=True.
Boris

23

Trong khi câu trả lời của @Aaron Maenpaa chỉ hoạt động, một người dùng gần đây đã hỏi :

Có cách nào đơn giản hơn không? 'fhand.read (). giải mã ("ASCII")' [...] Quá dài!

Bạn có thể dùng:

command_stdout.decode()

decode()có một đối số chuẩn :

codecs.decode(obj, encoding='utf-8', errors='strict')


.decode()việc sử dụng 'utf-8'có thể thất bại (đầu ra của lệnh có thể sử dụng mã hóa ký tự khác hoặc thậm chí trả về chuỗi byte không thể giải mã được). Mặc dù nếu đầu vào là ascii (một tập hợp con của utf-8) thì .decode()hoạt động.
jfs

23

Để diễn giải một chuỗi byte dưới dạng văn bản, bạn phải biết mã hóa ký tự tương ứng:

unicode_text = bytestring.decode(character_encoding)

Thí dụ:

>>> b'\xc2\xb5'.decode('utf-8')
'µ'

lslệnh có thể tạo đầu ra không thể hiểu là văn bản. Tên tệp trên Unix có thể là bất kỳ chuỗi byte nào ngoại trừ dấu gạch chéo b'/'và 0 b'\0':

>>> open(bytes(range(0x100)).translate(None, b'\0/'), 'w').close()

Cố gắng giải mã súp byte như vậy bằng cách sử dụng mã hóa utf-8 tăng UnicodeDecodeError.

Nó có thể tồi tệ hơn. Việc giải mã có thể thất bại trong âm thầm và tạo ra mojibake nếu bạn sử dụng mã hóa không tương thích sai:

>>> '—'.encode('utf-8').decode('cp1252')
'—'

Dữ liệu bị hỏng nhưng chương trình của bạn vẫn không biết rằng đã xảy ra lỗi.

Nói chung, mã hóa ký tự để sử dụng không được nhúng trong chính chuỗi byte. Bạn phải truyền đạt thông tin này ra khỏi ban nhạc. Một số kết quả có nhiều khả năng hơn các kết quả khác và do đó chardetmô-đun tồn tại có thể đoán mã hóa ký tự. Một tập lệnh Python có thể sử dụng nhiều mã hóa ký tự ở các vị trí khác nhau.


lsđầu ra có thể được chuyển đổi thành một chuỗi Python bằng cách sử dụng os.fsdecode() chức năng thành công ngay cả đối với tên tệp không thể giải mã được (nó sử dụng sys.getfilesystemencoding()surrogateescapexử lý lỗi trên Unix):

import os
import subprocess

output = os.fsdecode(subprocess.check_output('ls'))

Để có được các byte gốc, bạn có thể sử dụng os.fsencode().

Nếu bạn truyền universal_newlines=Truetham số thì subprocesssử dụng locale.getpreferredencoding(False)để giải mã byte, ví dụ, nó có thể có cp1252trên Windows.

Để giải mã luồng byte đang hoạt động, io.TextIOWrapper() có thể được sử dụng: ví dụ .

Các lệnh khác nhau có thể sử dụng mã hóa ký tự khác nhau cho đầu ra của chúng, ví dụ: dirlệnh nội bộ ( cmd) có thể sử dụng cp437. Để giải mã đầu ra của nó, bạn có thể chuyển mã hóa một cách rõ ràng (Python 3.6+):

output = subprocess.check_output('dir', shell=True, encoding='cp437')

Tên tệp có thể khác với os.listdir()(sử dụng API Unicode của Windows), vd, '\xb6'có thể được thay thế bằng các '\x14'bản đồ codec cp437 của HPPython b'\x14'để điều khiển ký tự U + 0014 thay vì U + 00B6 (). Để hỗ trợ tên tệp với các ký tự Unicode tùy ý, hãy xem Giải mã đầu ra PowerShell có thể chứa các ký tự Unicode không phải ASCII thành chuỗi Python


16

Vì câu hỏi này thực sự là hỏi về subprocessđầu ra, bạn có sẵn một cách tiếp cận trực tiếp hơn vì Popenchấp nhận từ khóa mã hóa (trong Python 3.6+):

>>> from subprocess import Popen, PIPE
>>> text = Popen(['ls', '-l'], stdout=PIPE, encoding='utf-8').communicate()[0]
>>> type(text)
str
>>> print(text)
total 0
-rw-r--r-- 1 wim badger 0 May 31 12:45 some_file.txt

Câu trả lời chung cho những người dùng khác là giải mã byte thành văn bản:

>>> b'abcde'.decode()
'abcde'

Không có đối số, sys.getdefaultencoding()sẽ được sử dụng. Nếu dữ liệu của bạn không phải sys.getdefaultencoding(), thì bạn phải chỉ định mã hóa rõ ràng trong decodecuộc gọi:

>>> b'caf\xe9'.decode('cp1250')
'café'

3
Hoặc với Python 3.7, bạn có thể chuyển text=Trueđể giải mã stdin, stdout và stderr bằng cách sử dụng mã hóa đã cho (nếu được đặt) hoặc hệ thống mặc định khác. Popen(['ls', '-l'], stdout=PIPE, text=True).
Boris

Giải mã lsđầu ra bằng cách sử dụng utf-8mã hóa có thể thất bại (xem ví dụ trong câu trả lời của tôi từ năm 2016 ).
jfs

1
@Boris: nếu encodingtham số được đưa ra, thì texttham số bị bỏ qua.
jfs

11

Nếu bạn nên có được những điều sau đây bằng cách thử decode():

AttributionError: đối tượng 'str' không có thuộc tính 'giải mã'

Bạn cũng có thể chỉ định loại mã hóa thẳng trong một nhóm:

>>> my_byte_str
b'Hello World'

>>> str(my_byte_str, 'utf-8')
'Hello World'

6

Khi làm việc với dữ liệu từ các hệ thống Windows (có \r\nkết thúc dòng), câu trả lời của tôi là

String = Bytes.decode("utf-8").replace("\r\n", "\n")

Tại sao? Hãy thử điều này với Input.txt đa dòng:

Bytes = open("Input.txt", "rb").read()
String = Bytes.decode("utf-8")
open("Output.txt", "w").write(String)

Tất cả các kết thúc dòng của bạn sẽ được nhân đôi (đến \r\r\n), dẫn đến các dòng trống thêm. Các hàm đọc văn bản của Python thường chuẩn hóa các kết thúc dòng để các chuỗi chỉ sử dụng \n. Nếu bạn nhận được dữ liệu nhị phân từ hệ thống Windows, Python không có cơ hội làm điều đó. Như vậy

Bytes = open("Input.txt", "rb").read()
String = Bytes.decode("utf-8").replace("\r\n", "\n")
open("Output.txt", "w").write(String)

sẽ sao chép tập tin gốc của bạn.


Tôi đã tìm kiếm .replace("\r\n", "\n")bổ sung rất lâu. Đây là câu trả lời nếu bạn muốn kết xuất HTML đúng cách.
mhlavacka

5

Tôi đã thực hiện một chức năng để làm sạch một danh sách

def cleanLists(self, lista):
    lista = [x.strip() for x in lista]
    lista = [x.replace('\n', '') for x in lista]
    lista = [x.replace('\b', '') for x in lista]
    lista = [x.encode('utf8') for x in lista]
    lista = [x.decode('utf8') for x in lista]

    return lista

6
Bạn thực sự có thể chuỗi tất cả các .strip, .replace, .encodecuộc gọi, vv trong một danh sách hiểu biết và chỉ lặp qua danh sách một lần thay vì iterating qua nó gấp năm lần.
Taylor Edmiston

1
@TaylorEdmiston Có thể nó tiết kiệm phân bổ nhưng số lượng hoạt động sẽ giữ nguyên.
JulienD

5

Đối với Python 3, đây là cách tiếp cận Pythonic an toàn hơn nhiều để chuyển đổi từ bytesang string:

def byte_to_str(bytes_or_str):
    if isinstance(bytes_or_str, bytes): # Check if it's in bytes
        print(bytes_or_str.decode('utf-8'))
    else:
        print("Object not of byte type")

byte_to_str(b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2\n')

Đầu ra:

total 0
-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1
-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2

5
1) Như @bodangly đã nói, kiểm tra loại không phải là pythonic. 2) Hàm bạn đã viết có tên " byte_to_str" ngụ ý rằng nó sẽ trả về một str, nhưng nó chỉ in giá trị được chuyển đổi nó sẽ in một thông báo lỗi nếu nó không thành công (nhưng không đưa ra một ngoại lệ). Cách tiếp cận này cũng là unpythonic và làm xáo trộn bytes.decodegiải pháp bạn cung cấp.
cosmicFluke

3

Từ sys - Các tham số và chức năng dành riêng cho hệ thống :

Để ghi hoặc đọc dữ liệu nhị phân từ / đến các luồng tiêu chuẩn, hãy sử dụng bộ đệm nhị phân cơ bản. Ví dụ, để viết byte vào thiết bị xuất chuẩn, hãy sử dụng sys.stdout.buffer.write(b'abc').


3
Các ống dẫn đến quy trình con đã là một bộ đệm nhị phân. Câu trả lời của bạn không giải quyết làm thế nào để có được một giá trị chuỗi từ bytesgiá trị kết quả .
Martijn Pieters

1
def toString(string):    
    try:
        return v.decode("utf-8")
    except ValueError:
        return string

b = b'97.080.500'
s = '97.080.500'
print(toString(b))
print(toString(s))

1
Mặc dù mã này có thể trả lời câu hỏi, việc cung cấp ngữ cảnh bổ sung về cách thức và / hoặc lý do giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai, không chỉ là người hỏi bây giờ! Vui lòng chỉnh sửa câu trả lời của bạn để thêm lời giải thích và đưa ra dấu hiệu về những hạn chế và giả định được áp dụng. Cũng không hại khi đề cập đến lý do tại sao câu trả lời này phù hợp hơn những câu trả lời khác.
Dev-iL

Một lời giải thích sẽ theo thứ tự.
Peter Mortensen

1

Đối với trường hợp cụ thể của bạn là "chạy lệnh shell và lấy đầu ra của nó dưới dạng văn bản thay vì byte", trên Python 3.7, bạn nên sử dụng subprocess.runvà truyền vào text=True(cũng như capture_output=Trueđể bắt đầu ra)

command_result = subprocess.run(["ls", "-l"], capture_output=True, text=True)
command_result.stdout  # is a `str` containing your program's stdout

textđã từng được gọi universal_newlinesvà được thay đổi (tốt, bí danh) trong Python 3.7. Nếu bạn muốn hỗ trợ các phiên bản Python trước 3.7, hãy chuyển qua universal_newlines=Truethay vìtext=True


0

Nếu bạn muốn chuyển đổi bất kỳ byte nào, không chỉ chuỗi được chuyển đổi thành byte:

with open("bytesfile", "rb") as infile:
    str = base64.b85encode(imageFile.read())

with open("bytesfile", "rb") as infile:
    str2 = json.dumps(list(infile.read()))

Điều này không phải là rất hiệu quả, tuy nhiên. Nó sẽ biến một hình ảnh 2 MB thành 9 MB.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.