Czytasz dane binarne, nie str
, więc trzeba rozszyfrować wyjście pierwsze. Jeśli ustawisz universal_newlines
argument True
, następnie stdout
jest automatycznie dekodowane przy użyciu wynik locale.getpreferredencoding()
method (tak samo jak w przypadku otwierania plików tekstowych):
cmd = subprocess.Popen(
'dir', shell=True, stdout=subprocess.PIPE, universal_newlines=True)
for line in cmd.stdout:
columns = line.decode().split()
if columns:
print(columns[-1])
Jeśli używasz Pythona 3.6 lub nowszy, można użyć jawne encoding
argumentem na wezwanie Popen()
do określenia innego kodeka użyć, jak, na przykład, UTF-8:
cmd = subprocess.Popen(
'dir', shell=True, stdout=subprocess.PIPE, encoding='utf8')
for line in cmd.stdout:
columns = line.split()
if columns:
print(columns[-1])
Jeśli trzeba użyć innego kodeka w Pythonie 3.5 lub wcześniej, nie używaj universal_newlines
, właśnie Dec Odtworzyć tekst z bajtów jawnie.
Próbowałeś podzielić wartość bytes
użyciu str
argumentu:
>>> b'one two'.split(' ')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Type str doesn't support the buffer API
Dzięki dekodowaniu można uniknąć tego problemu, a połączenie print()
nie będą musiały poprzedzić wyjście z b'..'
albo.
Jednakże, prawdopodobnie po prostu chcesz zamiast użyć modułu os
aby uzyskać informacje filesystem:
import os
for filename in os.listdir('.'):
print(filename)
Dzięki nim działa, ale każdy pomysł, dlaczego otrzymuję indeks listy poza zasięgiem błędu –
@NickLoach: linia ma mniej niż 3 kolumny? –
Dzięki Martijn linia ma ['03 -04-2013 ',' ', '19: 48', '', '', '', '