print elementu listy wyświetla w ASCII | konwertowanie listy do string

0

Witam,
staram się obrobić treść zwracaną z serwera ssh przy pomocy biblioteki paramiko.
Mam dwa problemy.
1:

    stdin, stdout, stderr = client.exec_command(command)
    bufor = stdout.read()
    print(bufor)
    print(bufor[0], bufor[1], bufor[2])

Dlaczego print elementu listy powoduje wyświetlanie znaków w postaci kodów ASCII, natomiast print całej listy nie.

2:
Chciałbym wyszukać pewnego ciągu w zmiennej bufor, jednak nie wiem jak to zrobić. Chciałbym wykorzystać coś podobnego str.find z C++, nawet widziałem że jest identyczna funkcja w takiej samej klasie, jednak przy próbie wrzucenia listy do stringa, dostaję błąd:
TypeError: sequence item 0: expected str instance, int found

Przez co przestaję rozumieć co się dzieje w kodzie który piszę :) Wynika z tego, z bufor jest lista intów ?

Tak przypisuję bufor do stringa:

''.join(bufor)
0

Wygląda, że elementy listy są typu integer, Możesz to sprawdzić: type(bufor[0]). W takim razie tak jak Próbowałeś, nie skonwertuje, ale tak, tak:

string_val = ''.join(str(elem) for elem in bufor)

Co do punktu 1, to jakis listing? Co się drukuje, są jakieś błędy?

0

Nie, błędów nie ma. Po prostu print(bufor) printuje cały bufor, w tym wypadku stdout z połaczenia ssh, a print(bufor[0]) pierwszy znak tego stdout, jednak w postaci kodów ASCII. Kolejno dla bufor[n] jest taka sama sytuacja
Generalnie, problem rozwiązałem inaczej, jednak ciekawi mnie jego istota.

0

Punkt 2. rozwiązałem w ten sposób:

temp = str(bufor)

Czy żle, czy dobrze - nie wiem, ale działa.

0
Smutny Krawiec napisał(a):

Nie, błędów nie ma. Po prostu print(bufor) printuje cały bufor, w tym wypadku stdout z połaczenia ssh, a print(bufor[0]) pierwszy znak tego stdout, jednak w postaci kodów ASCII. Kolejno dla bufor[n] jest taka sama sytuacja
Generalnie, problem rozwiązałem inaczej, jednak ciekawi mnie jego istota.

Pewnie dlatego, że to sa bajty.

0

Brzmi to dla mnie jak: "bo tak". Dalej nie rozumiem. Skoro print(bufor) wyświetla znaki, to czemu print(bufor[n]) wyświetla w postaci dziesiętnej ?

0

Bo tak Python drukuje tablicę bajtów.

0

Ok.

type(bufor[0])

czy jakakolwiek inna zmienna, nic nie zwraca przy użyciu type.

0
Świetny Kot napisał(a):

Ok.

type(bufor[0])

czy jakakolwiek inna zmienna, nic nie zwraca przy użyciu type.

Hm... Pokaz caly kod.

0
lion137 napisał(a):
Świetny Kot napisał(a):

Ok.

type(bufor[0])

czy jakakolwiek inna zmienna, nic nie zwraca przy użyciu type.

Hm... Pokaz caly kod.

import sys, paramiko, re

hostname "8.8.8.8"
user = "asd"
password = "asd"
port = "123"
regtable = "costamcostam"

try:    
    client = paramiko.SSHClient()
    client.load_system_host_keys()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(hostname, port=port, username=user, password=password)
    print("zalogowano\n")
    stdin, stdout, stderr = client.exec_command(regtable)
    bufor = stdout.read()
    f = open('test.txt', 'wb') #ignoruj mnie
    f.write(bufor) #ignoruj mnie
    f.close() #ignoruj mnie
    temp = str(bufor)  
    print(temp) 
    temp2 = ([m.start() for m in re.finditer('mac-address=', temp)])
    for x in temp2:
        temp3 = str(temp)[int(x):16]
        print('x:', x)
        print('temp :', temp)
        print('temp2: ', temp2)
        print('temp3: ', temp3)
        print('tempx: ', temp[21:16])
        type(bufor[0])      
  
except paramiko.ssh_exception.AuthenticationException as ssherr:
	print (ssherr)
except paramiko.ssh_exception.SSHException as ssherr:
	print (ssherr)
except paramiko.ssh_exception.socket.error as ssherr:
	print (ssherr)
except paramiko.ssh_exception.BadHostKeyException as ssherr:
    print (ssherr)
finally:
    client.close()   
print ("done") 

Kod jak widać, jest mocno roboczy.
Mój problem zaczął się od:

bufor = stdout.read()

ponieważ spodziewałem się że będzie to string, bądź tablica znaków, a się okazuje że chyba nie jest. Stąd kolejno konwertowanie na string, następnie próbuję wyciąć interesujące mnie rzeczy, jednak bez powodzenia. Męczę się drugi dzień.
Ponad to, czytając artykuł:
Napisy (strings)
i realizując pierwszy przykład, na konsoli wypluwa mi znak, a nie bajt. W związku z czym, dalej nie rozumiem czemu print(bufor) wyświetla znaki z wyniku działania stdout.read(), natomiast, print(bufor[n]) kod ASCII.

0

Przepraszam, zapomniałem podejrzeć jak wygląda post i wygląda jak wygląda.
Swoją drogą, nieintuicyjnie to działa, za każdym razem musiałem poprawiać cytaty lub kody źródłowe.

0

Moglbys dac print(type...).

0
 print(type(bufor))
 print(type(bufor[4]))

<class 'bytes'>
<class 'int'>

0

Tak to jest zrobione. Odwoływanie się po indeksie do obiektu typu bytes zwraca int. Jeśli chcesz operować na zwróconych bajtach, to zdekoduj je do stringa:

buf_str = bufor.decode('utf-8') # lub inny kodek, w razie potrzeby
print(type(buf_str), buf_str, buf_str[0], type(buf_str[0]))
0

Ok, wiele rzeczy stało się jasnych, jednak celu dalej nie osiągnąłem.
Pytanie, dlaczego nie mogę zrobić czegoś takiego i jak to rozwiązać:

wynik = buf_str[x:16]

Gdzie x to int.

0
Świetny Kot napisał(a):

Ok, wiele rzeczy stało się jasnych, jednak celu dalej nie osiągnąłem.
Pytanie, dlaczego nie mogę zrobić czegoś takiego i jak to rozwiązać:

wynik = buf_str[x:16]

Gdzie x to int.

Głupi błąd. Drugi parametr w nawiasie kwadratowym jest liczony od 0, przy czym podawałem wartości mniejsze niż wynosił x od pierwszej iteracji, stąd też wynik był pusty.
Dziękuje bardzo za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1