de-vraag
  • Pytania
  • Tagi
  • Użytkownicy
Powiadomienia
Nagrody
Rejestracja
Po zarejestrowaniu się, będziesz otrzymywać powiadomienia o odpowiedziach i komentarzach do swoich pytań.
Zaloguj się
Brak tłumaczeń pasujących do Twojego wyszukiwania Jeśli masz już konto, zaloguj się, aby sprawdzić nowe powiadomienia.
Za dodane pytania, odpowiedzi i komentarze przewidziane są nagrody.
Więcej
Źródło
Edytuj
Tomas Sedovic
Tomas Sedovic
Question

Konwertuj bajty na ciąg znaków

I'm using this code to get standard output from an external program:

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

Metoda communicate() zwraca tablicę bajtów:

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

Chciałbym jednak pracować z wyjściem jako normalnym ciągiem znaków Pythona. Tak, że mógłbym go wydrukować w ten sposób:

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

Myślałem, że do tego właśnie służy metoda binascii.b2a_qp(), ale kiedy ją wypróbowałem, otrzymałem ponownie tę samą tablicę bajtów:

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

Jak przekonwertować wartość bajtów z powrotem na ciąg? Mam na myśli użycie "akumulatorów" zamiast robienia tego ręcznie. I chciałbym, żeby to było OK z Pythonem 3.

1923 2009-03-03T12:23:01+00:00 3
Peter Mortensen
Peter Mortensen
Edytowane pytanie 28. września 2019 в 10:52
Programowanie
python
string
python-3.x
To pytanie ma 1 odpowiedź w języku angielskim, aby je przeczytać zaloguj się na swoje konto.
Solution / Answer
Aaron Maenpaa
Aaron Maenpaa
3. marca 2009 в 12:26
2009-03-03T12:26:18+00:00
Więcej
Źródło
Edytuj
#8867718

Musisz zdekodować obiekt bajtów, aby uzyskać ciąg znaków:

>>> 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
Aaron Maenpaa
Edytowana odpowiedź 24. lipca 2015 в 6:14
3123
0
 dF.
dF.
3. marca 2009 в 12:28
2009-03-03T12:28:31+00:00
Więcej
Źródło
Edytuj
#8867719

Musisz zdekodować ciąg bajtów i przekształcić go w ciąg znaków (Unicode).

W Pythonie 2

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

lub

unicode('hello', encoding)

W Pythonie 3

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

lub

str(b'hello', encoding)
Peter Mortensen
Peter Mortensen
Edytowana odpowiedź 28. września 2019 в 10:52
176
0
 mcherm
mcherm
18. lipca 2011 в 7:51
2011-07-18T19:51:15+00:00
Więcej
Źródło
Edytuj
#8867721

Myślę, że naprawdę tego chcesz:

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

Aaron's odpowiedź była poprawna, z wyjątkiem tego, że musisz wiedzieć, którego kodowania użyć. I wierzę, że Windows używa 'windows-1252'. Będzie to miało znaczenie tylko wtedy, gdy masz jakieś nietypowe (nieASCII) znaki w swojej zawartości, ale wtedy będzie to miało znaczenie.

Przy okazji, fakt, że ma to znaczenie, jest powodem, dla którego Python zaczął używać dwóch różnych typów dla danych binarnych i tekstowych: nie może magicznie konwertować między nimi, ponieważ nie zna kodowania, dopóki mu go nie podasz! Jedynym sposobem, w jaki TY byś wiedział, jest przeczytanie dokumentacji Windows (lub przeczytanie jej tutaj).

Peter Mortensen
Peter Mortensen
Edytowana odpowiedź 28. września 2019 в 10:54
38
0
Dodaj pytanie
Kategorie
Wszystkie
Technologia
Kultura / Rekreacja
Życie / Sztuka
Nauka
Profesjonalny
Biznes
Użytkownicy
Wszystkie
Nowy
Popularny
1
mohidil qodirova
Zarejestrowany 5 godzin temu
2
Jasur Fozilov
Zarejestrowany 19 godzin temu
3
Zuxriddin Muydinov
Zarejestrowany 1 dzień temu
4
Денис Анненский
Zarejestrowany 3 dni temu
5
365
Zarejestrowany 1 tydzień temu
BG
DE
EL
ES
FI
FR
ID
IT
JA
KO
LV
NL
PL
PT
RU
TR
ZH
© de-vraag 2022
Źródło
stackoverflow.com
na podstawie licencji cc by-sa 3.0 z przypisaniem