2013-02-14 23 views
18

ho bisogno di eseguire lo striping gli spazi bianchi da un file CSV che ho letto importazione CSVstriscia spazi bianchi da file CSV

aList=[] 
with open(self.filename, 'r') as f: 
    reader = csv.reader(f, delimiter=',', quoting=csv.QUOTE_NONE) 
    for row in reader: 
     aList.append(row) 
    # i need to strip the extra white space from each string in the row 
    return(aList) 

risposta

3

Si può fare:

aList.append([element.strip() for element in row]) 
3
with open(self.filename, 'r') as f: 
    reader = csv.reader(f, delimiter=',', quoting=csv.QUOTE_NONE) 
    return [[x.strip() for x in row] for row in reader] 
+0

Questa è la migliore soluzione possibile utilizzando il modulo 'csv'. La classe 'Reader' restituita dalla funzione' csv.reader() 'non è esposta nel modulo' csv' o '_csv' per permettere di sovrascrivere il suo metodo' next() '. – CivFan

24

C'è anche la parametro di formattazione incorporato: skipinitialspace (il valore predefinito è false) http://docs.python.org/2/library/csv.html#csv-fmt-params

aList=[] 
with open(self.filename, 'r') as f: 
    reader = csv.reader(f, skipinitialspace=False,delimiter=',', quoting=csv.QUOTE_NONE) 
    for row in reader: 
     aList.append(row) 
    return(aList) 
+0

Per mettere a nudo spazi bianchi: 'reader = csv.reader (f, skipinitialspace = True, delimitatore = ',', quoting = csv.QUOTE_NONE)', giusto? – Caco

2

È possibile creare un oggetto wrapper attorno al file che rimuove gli spazi prima che il lettore CSV li veda. In questo modo, puoi anche utilizzare il file CSV con cvs.DictReader.

import re 

class CSVSpaceStripper: 
    def __init__(self, filename): 
    self.fh = open(filename, "r") 
    self.surroundingWhiteSpace = re.compile("\s*;\s*") 
    self.leadingOrTrailingWhiteSpace = re.compile("^\s*|\s*$") 

    def close(self): 
    self.fh.close() 
    self.fh = None 

    def __iter__(self): 
    return self 

    def next(self): 
    line = self.fh.next() 
    line = self.surroundingWhiteSpace.sub(";", line) 
    line = self.leadingOrTrailingWhiteSpace.sub("", line) 
    return line 

Quindi utilizzare in questo modo:

o = csv.reader(CSVSpaceStripper(filename), delimiter=";") 
o = csv.DictReader(CSVSpaceStripper(filename), delimiter=";") 

ho hard-coded ";" essere il delimitatore. La generalizzazione del codice a qualsiasi delimitatore viene lasciata come esercizio al lettore.

+0

L'espansione di questa soluzione al caso generale finirebbe con una riscrittura del modulo 'csv'. – CivFan

6

Nel mio caso, mi sono preoccupato solo di rimuovere gli spazi bianchi dai nomi dei campi (ovvero le intestazioni delle colonne, ovvero i tasti del dizionario), quando si utilizza csv.DictReader.

Creare una classe basata su csv.DictReader e sovrascrivere la proprietà fieldnames per eliminare gli spazi bianchi da ciascun nome di campo (ovvero intestazione di colonna, ovvero chiave di dizionario).

Effettuare questa operazione richiamando l'elenco regolare dei nomi di campo, quindi eseguendo il iterazione su di esso durante la creazione di un nuovo elenco con gli spazi bianchi eliminati da ciascun nome di campo e impostando l'attributo _fieldnames sottostante in questo nuovo elenco.

import csv 

class DictReaderStrip(csv.DictReader): 
    @property          
    def fieldnames(self): 
     if self._fieldnames is None: 
      # Initialize self._fieldnames 
      # Note: DictReader is an old-style class, so can't use super() 
      csv.DictReader.fieldnames.fget(self) 
      if self._fieldnames is not None: 
       self._fieldnames = [name.strip() for name in self._fieldnames] 
     return self._fieldnames