Domanda

Ho un file che ho letto da che assomiglia:

1   value1
2   value2
3   value3

Il file può o non può avere un finale \ n nell'ultima riga.

Il codice che sto utilizzando grandi opere, ma se c'è un finale \ n fallisce.
Che cosa è il modo migliore per prendere questo?

Il mio codice di riferimento:

r=open(sys.argv[1], 'r');
for line in r.readlines():
    ref=line.split();
    print ref[0], ref[1]

Quali fallirebbe con un:
Traceback (chiamata più recente scorso):
  File "./test", la linea 14, in
    stampa ref [0], ref [1]
IndexError: indice di lista fuori intervallo

È stato utile?

Soluzione

È possibile ignorare le righe che contengono solo spazi bianchi:

for line in r.readlines():
    line = line.rstrip()      # Remove trailing whitespace.
    if line:                  # Only process non-empty lines.
        ref = line.split();
        print ref[0], ref[1]

Altri suggerimenti

Non credo che ci avete raccontato tutta la storia. line.split() darà lo stesso risultato indipendentemente dal fatto che l'ultima riga è terminato da \n o meno.

Si noti che l'ultima riga in un file che viene risolto da \n è il comportamento del solito, e le persone sono di tanto in tanto infastidito da una linea che non è così terminato.

Se si dovesse fare qualcosa di simile:

print repr(line), repr(ref)

anziché

print ref[0], ref[1]

si sarebbe in grado di rilevare da soli esattamente cosa sta succedendo, invece di lasciandoci intuire.

Se come @ Mark Byers congetture, la tua ultima riga è vuota o costituito solo da spazi bianchi, è possibile ignorare che la linea (e tutti gli altri tali linee) per questo un po 'più semplice codice:

for line in r: # readlines is passe
    ref = line.split() # split() ignores trailing whitespace
    if ref:
        print ref[0], ref[1]

Si prega di considerare anche la possibilità che si ha un solo campo, non 0 o 2, nella tua ultima riga.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top