Konvertieren Sie Bytes in eine Zeichenfolge

2308

Ich verwende diesen Code, um die Standardausgabe eines externen Programms zu erhalten:

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

Die Methode communic () gibt ein Array von Bytes zurück:

>>> 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'

Ich möchte jedoch mit der Ausgabe als normaler Python-String arbeiten. Damit ich es so ausdrucken kann:

>>> 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

Ich dachte, dafür ist die binascii.b2a_qp () -Methode gedacht , aber als ich es versuchte, bekam ich wieder das gleiche Byte-Array:

>>> 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'

Wie konvertiere ich den Bytewert zurück in einen String? Ich meine, die "Batterien" zu verwenden, anstatt es manuell zu tun. Und ich möchte, dass Python 3 in Ordnung ist.

Tomas Sedovic
quelle
47
warum nicht str(text_bytes)funktioniert? Das kommt mir bizarr vor.
Charlie Parker
13
@CharlieParker Da str(text_bytes)die Codierung nicht angegeben werden kann. Abhängig davon, was in text_bytes enthalten ist, kann text_bytes.decode('cp1250) `zu einer ganz anderen Zeichenfolge führen als text_bytes.decode('utf-8').
Craig Anderson
6
Die strFunktion wird also nicht mehr in eine echte Zeichenfolge konvertiert. Man muss aus irgendeinem Grund explizit eine Kodierung sagen. Ich bin zu faul, um durchzulesen, warum. Konvertieren Sie es einfach in utf-8und prüfen Sie, ob Ihr Code funktioniert. zBvar = var.decode('utf-8')
Charlie Parker
1
@CraigAnderson: Funktioniert unicode_text = str(bytestring, character_encoding)wie erwartet unter Python 3. Es unicode_text = bytestring.decode(character_encoding)ist jedoch vorzuziehen, Verwechslungen zu vermeiden, da nur str(bytes_obj)eine Textdarstellung erstellt wird, bytes_objanstatt sie in Text zu dekodieren: str(b'\xb6', 'cp1252') == b'\xb6'.decode('cp1252') == '¶'undstr(b'\xb6') == "b'\\xb6'" == repr(b'\xb6') != '¶'
jfs

Antworten:

3674

Sie müssen das Byte-Objekt dekodieren, um eine Zeichenfolge zu erstellen:

>>> 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'
Aaron Maenpaa
quelle
58
Die Verwendung "windows-1252"ist auch nicht zuverlässig (z. B. für andere Sprachversionen von Windows). Wäre die Verwendung nicht am besten sys.stdout.encoding?
Nikow
12
Vielleicht hilft dies jemandem weiter: Manchmal verwenden Sie ein Byte-Array für die Ex-TCP-Kommunikation. Wenn Sie ein Byte-Array in einen String konvertieren möchten, der nachgestellte '\ x00'-Zeichen abschneidet, reicht die folgende Antwort nicht aus. Verwenden Sie dann b'example \ x00 \ x00'.decode ('utf-8'). Strip ('\ x00').
Wookie88
2
Ich habe einen Fehler bezüglich der Dokumentation unter bugs.python.org/issue17860 behoben. Sie können gerne einen Patch vorschlagen. Wenn es schwierig ist, einen Beitrag zu leisten, sind Kommentare zur Verbesserung willkommen.
Anatoly Techtonik
44
In Python 2.7.6 nicht behandelt b"\x80\x02\x03".decode("utf-8")-> UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 0: invalid start byte.
Martineau
9
Wenn es sich bei dem Inhalt um zufällige Binärwerte handelt, schlägt die utf-8Konvertierung wahrscheinlich fehl. Siehe @techtonik Antwort (unten) stackoverflow.com/a/27527728/198536
wallyk
215

Sie müssen die Byte-Zeichenfolge dekodieren und in eine Zeichenfolge (Unicode) umwandeln.

Auf Python 2

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

oder

unicode('hello', encoding)

Auf Python 3

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

oder

str(b'hello', encoding)
dF.
quelle
2
Was ist unter Python 3, wenn sich die Zeichenfolge in einer Variablen befindet?
Alaa M.
1
@AlaaM.: Das gleiche. Wenn variable = b'hello'unicode_text = variable.decode(character_encoding)
ja
182

Ich denke, dieser Weg ist einfach:

>>> bytes_data = [112, 52, 52]
>>> "".join(map(chr, bytes_data))
'p44'
Sisso
quelle
6
Vielen Dank, Ihre Methode hat bei mir funktioniert, als es keine andere tat. Ich hatte ein nicht codiertes Byte-Array, das ich brauchte, in eine Zeichenfolge umgewandelt. Ich habe versucht, einen Weg zu finden, es neu zu codieren, damit ich es in einen String dekodieren kann. Diese Methode funktioniert perfekt!
leetNightshade
5
@leetNightshade: dennoch ist es schrecklich ineffizient. Wenn Sie ein Byte-Array haben, müssen Sie nur dekodieren.
Martijn Pieters
12
@Martijn Pieters Ich habe gerade einen einfachen Benchmark mit diesen anderen Antworten durchgeführt und mehrere 10.000 Läufe ausgeführt. Stackoverflow.com/a/3646405/353094 Und die obige Lösung war jedes Mal viel schneller. Für 10.000 Läufe in Python 2.7.7 dauert es 8 ms, gegenüber den anderen bei 12 ms und 18 ms. Zugegeben, es kann je nach Eingabe, Python-Version usw. einige Abweichungen geben. Scheint mir nicht zu langsam.
leetNightshade
5
@ Martinij Pieters Ja. In diesem Punkt ist dies nicht die beste Antwort für den Hauptteil der gestellten Frage. Und der Titel ist irreführend, nicht wahr? Er / sie möchte eine Byte-Zeichenfolge in eine reguläre Zeichenfolge konvertieren, kein Byte-Array in eine Zeichenfolge. Diese Antwort funktioniert für den Titel der gestellten Frage in Ordnung.
leetNightshade
5
Für Python 3 sollte dies gleichbedeutend sein mit bytes([112, 52, 52])- Übrigens ist Bytes ein schlechter Name für eine lokale Variable, genau weil es sich um eine integrierte p3 handelt
Mr_and_Mrs_D
92

Wenn Sie die Codierung nicht kennen, verwenden Sie die alte MS-DOS CP437- Codierung , um binäre Eingaben in Zeichenfolgen in Python 3- und Python 2-kompatibler Weise zu lesen :

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

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

Da die Codierung unbekannt ist, erwarten Sie, dass nicht englische Symbole in Zeichen von übersetzt werden cp437(englische Zeichen werden nicht übersetzt, da sie in den meisten Einzelbyte-Codierungen und UTF-8 übereinstimmen).

Das Dekodieren eines beliebigen Binäreingangs in UTF-8 ist unsicher, da dies möglicherweise auftritt:

>>> 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

Gleiches gilt für das latin-1, was für Python 2 beliebt war (Standardeinstellung?). Siehe die fehlenden Punkte im Codepage-Layout - hier erstickt Python mit berüchtigten ordinal not in range.

UPDATE 20150604 : Es gibt Gerüchte, dass Python 3 die surrogateescapeFehlerstrategie zum Codieren von Daten in Binärdaten ohne Datenverlust und Abstürze hat. Es sind jedoch Konvertierungstests erforderlich [binary] -> [str] -> [binary], um sowohl die Leistung als auch die Zuverlässigkeit zu überprüfen .

UPDATE 20170116 : Dank des Kommentars von Nearoo besteht auch die Möglichkeit, alle unbekannten Bytes mit dem backslashreplaceFehlerhandler zu verkleinern. Dies funktioniert nur für Python 3, sodass Sie auch mit dieser Problemumgehung eine inkonsistente Ausgabe von verschiedenen Python-Versionen erhalten:

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'))

Weitere Informationen finden Sie in der Unicode-Unterstützung von Python .

UPDATE 20170119 : Ich habe mich für die Implementierung einer Schrägstrich- Escape- Dekodierung entschieden, die sowohl für Python 2 als auch für Python 3 funktioniert. Sie sollte langsamer als die cp437Lösung sein, aber bei jeder Python-Version identische Ergebnisse liefern .

# --- 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'))
anatoly techtonik
quelle
6
Ich bin wirklich der Meinung, dass Python einen Mechanismus bereitstellen sollte, um fehlende Symbole zu ersetzen und fortzufahren.
Anatoly Techtonik
@techtonik: Dies funktioniert nicht auf einem Array wie in Python2.
user2284570
@ user2284570 meinst du Liste? Und warum sollte es auf Arrays funktionieren? Besonders Arrays von Schwimmern ..
Anatoly Techtonik
Sie können auch Unicode-Fehler mit b'\x00\x01\xffsd'.decode('utf-8', 'ignore')in Python 3 einfach ignorieren .
Antonis Kalou
3
@anatolytechtonik Es besteht die Möglichkeit, die Escape-Sequenz in der Zeichenfolge zu belassen und fortzufahren: b'\x80abc'.decode("utf-8", "backslashreplace")führt zu '\\x80abc'. Diese Informationen stammen aus der Unicode-Dokumentationsseite, die seit dem Schreiben dieser Antwort aktualisiert worden zu sein scheint.
Nearoo
86

In Python 3 lautet die Standardcodierung "utf-8", sodass Sie direkt Folgendes verwenden können:

b'hello'.decode()

das ist äquivalent zu

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

In Python 2 wird für die Codierung standardmäßig die Standard-Zeichenfolgencodierung verwendet. Daher sollten Sie verwenden:

b'hello'.decode(encoding)

Wo encodingist die gewünschte Codierung?

Hinweis: Die Unterstützung für Schlüsselwortargumente wurde in Python 2.7 hinzugefügt.

lmiguelvargasf
quelle
41

Ich denke du willst das wirklich:

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

Aarons Antwort war richtig, außer dass Sie wissen müssen, welche Codierung Sie verwenden sollen. Und ich glaube, dass Windows 'Windows-1252' verwendet. Es spielt nur eine Rolle, wenn Ihr Inhalt ungewöhnliche (Nicht-ASCII-) Zeichen enthält, aber dann macht es einen Unterschied.

By the way, die Tatsache , dass es tut Materie ist der Grund , dass Python mit zwei verschiedenen Typen für binäre und Textdaten verschoben: es magisch zwischen ihnen nicht konvertieren kann, weil es nicht die Kodierung nicht wissen , wenn Sie ihm sagen! Sie können nur die Windows-Dokumentation lesen (oder hier lesen).

mcherm
quelle
3
open()Funktion für Textströme oder Popen()wenn Sie sie bestehen universal_newlines=True, entscheiden Sie auf magische Weise über die Zeichenkodierung für Sie ( locale.getpreferredencoding(False)in Python 3.3+).
JFS
2
'latin-1'ist eine wörtliche Codierung, bei der alle Codepunkte festgelegt sind. Sie können diese also verwenden, um eine Byte-Zeichenfolge effektiv in den von Python unterstützten Zeichenfolgentyp einzulesen (also wörtlich in Python 2, in Unicode für Python 3).
Tripleee
@tripleee: 'latin-1'ist ein guter Weg, um Mojibake zu bekommen. Es gibt auch magische Ersetzungen unter Windows: Es ist überraschend schwierig, Daten von einem Prozess zu einem anderen unverändert weiterzuleiten, z. B dir.: \xb6-> \x14(das Beispiel am Ende meiner Antwort)
jfs
32

Setzen Sie universal_newlines auf True, dh

command_stdout = Popen(['ls', '-l'], stdout=PIPE, universal_newlines=True).communicate()[0]
ContextSwitch
quelle
5
Ich habe diese Methode verwendet und es funktioniert. Obwohl die Codierung nur anhand der Benutzereinstellungen auf Ihrem System erraten wird, ist sie nicht so robust wie einige andere Optionen. Dies geschieht unter Bezugnahme auf docs.python.org/3.4/library/subprocess.html: "Wenn universal_newlines True ist, werden [stdin, stdout und stderr] unter Verwendung der vom Gebietsschema zurückgegebenen Codierung als Textströme im Universal Newlines-Modus geöffnet .getpreferredencoding (False). "
Twasbrillig
Auf 3.7 können (und sollten) Sie text=Truestattdessen tun universal_newlines=True.
Boris
23

Während die Antwort von @Aaron Maenpaa gerade funktioniert, hat ein Benutzer kürzlich gefragt :

Gibt es einen einfacheren Weg? 'fhand.read (). decode ("ASCII")' [...] Es ist so lang!

Sie können verwenden:

command_stdout.decode()

decode()hat ein Standardargument :

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

serv-inc
quelle
.decode()'utf-8'Diese Verwendung kann fehlschlagen (die Ausgabe des Befehls verwendet möglicherweise eine andere Zeichenkodierung oder gibt sogar eine nicht dekodierbare Bytesequenz zurück). Wenn die Eingabe jedoch ascii ist (eine Teilmenge von utf-8), .decode()funktioniert dies.
JFS
22

Um eine Bytefolge als Text zu interpretieren, müssen Sie die entsprechende Zeichenkodierung kennen:

unicode_text = bytestring.decode(character_encoding)

Beispiel:

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

lsDer Befehl kann eine Ausgabe erzeugen, die nicht als Text interpretiert werden kann. Dateinamen unter Unix können eine beliebige Folge von Bytes sein, außer Schrägstrich b'/'und Null b'\0':

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

Der Versuch, eine solche Bytesuppe mit utf-8-Codierungserhöhungen zu dekodieren UnicodeDecodeError.

Es kann schlimmer sein. Die Dekodierung schlägt möglicherweise stillschweigend fehl und erzeugt Mojibake, wenn Sie eine falsche inkompatible Codierung verwenden:

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

Die Daten sind beschädigt, aber Ihr Programm weiß nicht, dass ein Fehler aufgetreten ist.

Im Allgemeinen ist die zu verwendende Zeichenkodierung nicht in die Bytesequenz selbst eingebettet. Sie müssen diese Informationen außerhalb des Bandes kommunizieren. Einige Ergebnisse sind wahrscheinlicher als andere, und daher gibt es ein chardetModul, das die Zeichenkodierung erraten kann . Ein einzelnes Python-Skript kann mehrere Zeichencodierungen an verschiedenen Stellen verwenden.


lsAusgabe kann an eine Python Zeichenfolge umgewandelt werden unter Verwendung von os.fsdecode() Funktion , die auch für gelingt es nicht decodierbaren Dateinamen (es verwendet sys.getfilesystemencoding()und surrogateescapeFehler - Handler auf Unix):

import os
import subprocess

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

Um die ursprünglichen Bytes zu erhalten, können Sie verwenden os.fsencode().

Wenn Sie einen universal_newlines=TrueParameter übergeben, subprocesswird er locale.getpreferredencoding(False)zum Dekodieren von Bytes verwendet, z. B. unter cp1252Windows.

Um den Byte-Stream im laufenden Betrieb zu dekodieren, io.TextIOWrapper() könnte Folgendes verwendet werden: Beispiel .

Unterschiedliche Befehle können unterschiedliche Zeichencodierungen für ihre Ausgabe verwenden, z. B. kann dirinterner Befehl ( cmd) cp437 verwenden. Um die Ausgabe zu dekodieren, können Sie die Codierung explizit übergeben (Python 3.6+):

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

Die Dateinamen können von os.listdir()denen abweichen (die die Windows-Unicode-API verwenden), z. B. '\xb6'können sie durch '\x14'die cp437-Codec-Zuordnungen von Python ersetzt werden b'\x14', um das Zeichen U + 0014 anstelle von U + 00B6 (¶) zu steuern. Informationen zur Unterstützung von Dateinamen mit beliebigen Unicode-Zeichen finden Sie unter Decodieren der PowerShell-Ausgabe, die möglicherweise Nicht-ASCII-Unicode-Zeichen enthält, in eine Python-Zeichenfolge

jfs
quelle
16

Da diese Frage tatsächlich die subprocessAusgabe betrifft , steht Ihnen ein direkterer Ansatz zur Verfügung, da Popenein Codierungsschlüsselwort (in Python 3.6+) akzeptiert wird :

>>> 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

Die allgemeine Antwort für andere Benutzer besteht darin , Bytes in Text zu dekodieren :

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

Ohne Argument sys.getdefaultencoding()wird verwendet. Wenn Ihre Daten nicht vorhanden sind sys.getdefaultencoding(), müssen Sie die Codierung im decodeAufruf explizit angeben :

>>> b'caf\xe9'.decode('cp1250')
'café'
wim
quelle
3
Oder mit Python 3.7 können Sie text=Truestdin, stdout und stderr mit der angegebenen Codierung (falls festgelegt) oder dem anderen Systemstandard dekodieren. Popen(['ls', '-l'], stdout=PIPE, text=True).
Boris
Die Dekodierung der lsAusgabe mithilfe der utf-8Codierung schlägt möglicherweise fehl (siehe Beispiel in meiner Antwort von 2016 ).
JFS
1
@Boris: Wenn ein encodingParameter angegeben wird, wird der textParameter ignoriert.
JFS
11

Wenn Sie Folgendes versuchen sollten decode():

AttributeError: Das Objekt 'str' hat kein Attribut 'decode'.

Sie können den Codierungstyp auch direkt in einer Besetzung angeben:

>>> my_byte_str
b'Hello World'

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

Wenn \r\nich mit Daten von Windows-Systemen (mit Zeilenenden) arbeite , lautet meine Antwort

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

Warum? Versuchen Sie dies mit einer mehrzeiligen Input.txt:

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

Alle Ihre Zeilenenden werden verdoppelt (bis \r\r\n), was zu zusätzlichen leeren Zeilen führt. Die Textlesefunktionen von Python normalisieren normalerweise Zeilenenden, sodass nur Zeichenfolgen verwendet werden \n. Wenn Sie Binärdaten von einem Windows-System empfangen, hat Python keine Möglichkeit dazu. Somit,

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

repliziert Ihre Originaldatei.

bers
quelle
Ich habe .replace("\r\n", "\n")so lange nach einem Zusatz gesucht . Dies ist die Antwort, wenn Sie HTML richtig rendern möchten.
Mhlavacka
5

Ich habe eine Funktion zum Bereinigen einer Liste erstellt

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
eafloresf
quelle
6
Sie können die Kette tatsächlich alle die .strip, .replace, .encodeusw. Anrufe in einer Liste Verständnis und Iterierte nur über die Liste einmal statt Iterieren über fünfmal.
Taylor Edmiston
1
@ TaylorEdmiston Vielleicht spart es bei der Zuordnung, aber die Anzahl der Operationen würde gleich bleiben.
JulienD
5

Für Python 3 ist dies ein viel sicherer und Pythonic Ansatz zur Umwandlung von bytezu 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')

Ausgabe:

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
Inconnu
quelle
5
1) Wie @bodangly sagte, ist die Typprüfung überhaupt nicht pythonisch. 2) Die von Ihnen geschriebene Funktion heißt " byte_to_str", was bedeutet, dass sie einen str zurückgibt, aber nur den konvertierten Wert ausgibt und eine Fehlermeldung ausgibt, wenn dies fehlschlägt (aber keine Ausnahme auslöst). Dieser Ansatz ist auch unpythonisch und verschleiert die von bytes.decodeIhnen bereitgestellte Lösung.
CosmicFluke
3

Von sys - Systemspezifische Parameter und Funktionen :

Verwenden Sie den zugrunde liegenden Binärpuffer, um Binärdaten von / in die Standard-Streams zu schreiben oder zu lesen. Verwenden Sie beispielsweise, um Bytes in stdout zu schreiben sys.stdout.buffer.write(b'abc').

Zhichang Yu
quelle
3
Die Pipe zum Unterprozess ist bereits ein Binärpuffer. In Ihrer Antwort wird nicht angesprochen, wie aus dem resultierenden bytesWert ein Zeichenfolgenwert abgerufen werden kann.
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))
Leonardo Filipe
quelle
1
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern. Denken Sie daran, dass Sie in Zukunft die Frage für die Leser beantworten, nicht nur für die Person, die jetzt fragt! Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, und geben Sie an, welche Einschränkungen und Annahmen gelten. Es tut auch nicht weh zu erwähnen, warum diese Antwort angemessener ist als andere.
Dev-iL
Eine Erklärung wäre angebracht.
Peter Mortensen
1

Für Ihren speziellen Fall "Führen Sie einen Shell-Befehl aus und erhalten Sie seine Ausgabe als Text anstelle von Bytes" sollten Sie in Python 3.7 verwenden subprocess.runund übergeben text=True(sowie capture_output=Truedie Ausgabe erfassen).

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

textwurde früher aufgerufen universal_newlinesund in Python 3.7 geändert (naja, alias). Wenn Sie Python-Versionen vor 3.7 unterstützen möchten, übergeben Sie universal_newlines=Truestatttext=True

Boris
quelle
0

Wenn Sie Bytes konvertieren möchten, konvertieren Sie nicht nur Zeichenfolgen in Bytes:

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

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

Dies ist jedoch nicht sehr effizient. Aus einem 2-MB-Bild werden 9 MB.

HCLivess
quelle
-1

Versuche dies

bytes.fromhex('c3a9').decode('utf-8') 
Victor Choy
quelle