Stai leggendo i dati binari, non str
, quindi è necessario per decodificare l'uscita prima. Se si imposta l'argomento universal_newlines
-True
, poi stdout
viene decodificato automaticamente utilizzando il risultato del locale.getpreferredencoding()
method (come per l'apertura di file di testo):
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])
Se si utilizza Python 3.6 o più recente, è possibile utilizzare un esplicito encoding
argomento per la chiamata Popen()
per specificare un codec diverso da usare, come, per esempio, 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])
Se è necessario utilizzare un codec diverso in Python 3.5 o precedente, non usare universal_newlines
, solo dec ode esplicitamente il testo dai byte.
si stava tentando di dividere un valore bytes
utilizzando un argomento str
:
>>> b'one two'.split(' ')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Type str doesn't support the buffer API
Decodificando si evita questo problema, e la chiamata print()
non dovrà anteporre l'uscita con b'..'
sia.
Tuttavia, probabilmente vuole solo utilizzare il modulo os
invece per ottenere informazioni filesystem:
import os
for filename in os.listdir('.'):
print(filename)
Thanks it funziona, ma qualsiasi idea, perché sto ricevendo l'indice di lista fuori intervallo errore –
@NickLoach: la linea ha meno di 3 colonne? –
Grazie Martijn la linea ha ['03 -04-2013 ',' ', '19: 48', '', '', '', '