2016-02-12 23 views
9

Si suppone di aggiungere un'etichetta specifica al mio file CSV in base alle condizioni. Il file CSV ha 10 colonne e le colonne terza, quarta e quinta sono quelle che influiscono maggiormente sulle condizioni e aggiungo la mia etichetta sulla decima colonna. Ho qui il codice che si è conclusa in un ciclo infinito:CSV Writing to File Difficoltà

import csv 
import sys 

w = open(sys.argv[1], 'w') 
r = open(sys.argv[1], 'r') 

reader = csv.reader(r) 
writer = csv.writer(w) 

for row in reader: 
    if row[2] or row[3] or row[4] == '0': 
     row[9] == 'Label' 
     writer.writerow(row) 

w.close() 
r.close() 

Non so il motivo per cui sarebbe andata a finire in un loop infinito.

EDIT: ho fatto un errore e il mio programma ciclo infinito originale avuto questa linea:

w = open(sys.argv[1], 'a') 

ho cambiato 'a'-'w' ma questo ha finito per cancellare l'intero file CSV stesso. Quindi ora ho un problema diverso.

+1

'se riga [2] == '0' o riga [3] == '0' o riga [4] == '0':' –

+1

Che lingua è questa? –

+0

@EricJ. Mi dispiace per quello L'ho aggiunto ai tag – Reginsmal

risposta

8

hai un problema qui if row[2] or row[3] or row[4] == '0': e qui row[9] == 'Label', è possibile utilizzare any per controllare diverse variabili pari allo stesso valore, e utilizzare = per assegnare un valore, anche io consiglierei di usare with open.

Inoltre non è possibile leggere e scrivere allo stesso tempo in csv di file, quindi è necessario salvare le modifiche in un nuovo file CSV, è possibile rimuovere l'originale dopo e rinominare il nuovo utilizzando os.remove e os.rename:

import csv 
import sys  
import os 

with open('some_new_file.csv', 'w') as w, open(sys.argv[1], 'r') as r: 
    reader, writer = csv.reader(r), csv.writer(w) 
    for row in reader: 
     if any(x == '0' for x in (row[2], row[3], row[4])): 
      row[9] = 'Label' 
     writer.writerow(row) 

os.remove('{}'.format(sys.argv[1])) 
os.rename('some_new_file.csv', '{}'.format(sys.argv[1])) 
+0

Grazie, questo ha impedito il ciclo infinito nel programma in modalità append. Tuttavia, non sembra che abbia funzionato correttamente poiché l'etichetta non è stata aggiunta. – Reginsmal

+1

c'è un altro problema, non è possibile aprire lo stesso file per scrivere e leggere – tinySandy

+0

Ho provato a cambiare 'sys.argv [1]' da scrivere in 'test.csv' con il file che devo leggere. Tuttavia 'test.csv' ha avuto la stessa fine dell'originale. – Reginsmal

0

Credo che il problema è in linee

w = open(sys.argv[1], 'w') 
r = open(sys.argv[1], 'r') 

Si sta aprendo lo stesso file per la lettura e writing.So provare a utilizzare diversi nomi di file.

4

È possibile scrivere su un tempfile.NamedTemporaryFile e basta usare in per verificare la "0" come si sta corrispondente ad una stringa completa, non una stringa in modo da non salvare nulla utilizzando qualsiasi come si crea una tupla di tre elementi quindi si può anche tagliare o semplicemente testare l'appartenenza indipendentemente, quindi basta sostituire il file originale con shutil.move:

import csv 
import sys  
from shutil import move 
from tempfile import NamedTemporaryFile 

with NamedTemporaryFile("w", dir=".", delete=False) as w, open(sys.argv[1]) as r: 
    reader, writer = csv.reader(r), csv.writer(w) 
    writer.writerows(row[:-1] + ['Label'] if "0" in row[2:5] else row 
        for row in reader) 

move(w.name, sys.argv[1]) 

sys.argv[1] è anche il nome del file e una stringa in modo che sia tutto il necessario per passare.

+0

ti sto dando la mia generosità, visto che sei l'unico che ha postato una buona risposta oltre a me – tinySandy