Variable umcodieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
jake-the-snake

Abend Leute

Es geht um diesen keinen Code:

Code: Alles auswählen

import subprocess

# Terminal-in Variable-Packen
output = subprocess.check_output("lsusb")
print(output)

usbid = output
usbid.find('1234:1234')
Terminalausgabe in Variable packen: ok
zum Test ins Terminal drucken: ok

Meine Vermutungen:
Der Inhalt von output ist ein Byte-Objekt. Er kann nicht an usbid übergeben werden bzw. spätestens bei der Suchaktion ist Schluss.

Fehlermeldung dazu:
[codebox=bash file=Unbenannt.bsh]File "./xyz.py", line 30, in <module>
usbid.find('1234:1234')
TypeError: a bytes-like object is required, not 'str'
[/code]
String-Behandlung auf Byte-Objekt nicht möglich. Ich habe recherchiert und decode / encode gefunden.
Für meine Zwecke - also Byte-Objekt in String utf8 bräuchte ich den Befehl "decode" <- Richtig?
Außerdem habe ich hier Python3 am Start - da braucht man utf8 gar nicht angeben? <- Richtig?

Wie schreibe ich den die Variable output als String in die Variable usbid?

Gruss jts
jake-the-snake

Abend Forum

Das umcodieren hat geklappt:

Code: Alles auswählen

# Byte-Werte umwandeln in String-Werte
output = output.decode('utf8')
print (output)
In der angesammelten "Datenflut" der USB-Geräte, suche ich nach einer Serien-Nummer eines spezifischen USB-Sticks:

Code: Alles auswählen

usbid = output
usbid = usbid.find('054c:019e')
print (usbid)
So, jetzt kommt es:
Ist der USB-Stick mit der Seriennummer 054c:019e ausgesteckt, liefert mir der Print Befehl "-1" - das ist gut so.
Ist der USB-Stick mit der Seriennummer 054c:019e eingesteckt, wird der Wert "123" ausgedruckt - Warum?
Müsste die Variable usbid nicht die in der Zeichenkette gefundene Seriennummer "054c:019e" enthalten?

Gruß jts
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@jake-the-snake: solche Fragen lassen sich ganz leicht beantworten, wenn man die Dokumentation zu `find` durchliest.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

jake-the-snake hat geschrieben:Meine Vermutungen:
Der Inhalt von output ist ein Byte-Objekt.
Welche Art von Objekt das ist, findest du mittels type(output) heraus.
jake-the-snake hat geschrieben:Er kann nicht an usbid übergeben werden bzw. spätestens bei der Suchaktion ist Schluss.
Auch Byte-Objekte können an Namen gebunden werden.
jake-the-snake hat geschrieben:Fehlermeldung dazu:
[codebox=bash file=Unbenannt.bsh]File "./xyz.py", line 30, in <module>
usbid.find('1234:1234')
TypeError: a bytes-like object is required, not 'str'
[/code]
Das verstehst du anscheind falsch herum: Das Problem ist nicht, dass usbfind ein Byte-Objekt ist, sondern dass das übergebene Argument von find() ein String ist. Denn die find()-Methode von Byte-Objekten arbeitet nur mit Bytes als Parameter.

Die Byte-Thematik ist also lösbar mittels:

Code: Alles auswählen

usbid.find(b'1234:1234')
...dann sparst du dir das Umkodieren.
Antworten