2013-02-14 13 views
18

Ich brauche die weißen Räume aus einer CSV-Datei Streifen, der i Import csv lesenStreifen weißen Räume aus der Datei 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) 

Antwort

3

Sie tun können:

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

Dies ist die bestmögliche Lösung mit dem 'csv' Modul. Die Klasse 'Reader', die von der Funktion' csv.reader() 'zurückgegeben wird, ist im' csv'- oder '_csv'-Modul nicht verfügbar, um das Überschreiben der' next() '-Methode zu ermöglichen. – CivFan

24

Es gibt auch die eingebetteter Formatierungsparameter: skipinitialspace (der Standardwert ist 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

Um weiße Leerzeichen zu streichen: 'reader = csv.reader (f, skipinitialspace = True, Trennzeichen = ',', quoting = csv.QUOTE_NONE)', oder? – Caco

2

Sie können ein Wrapper-Objekt um Ihre Datei erstellen, das die Leerzeichen entfernt, bevor der CSV-Reader sie sieht. Auf diese Weise können Sie sogar die csv-Datei mit cvs.DictReader verwenden.

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 

Dann ist es wie folgt verwenden:

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

I ";" fest einprogrammiert das Trennzeichen zu sein. Die Verallgemeinerung des Codes für jedes Trennzeichen wird dem Leser als Übung überlassen.

+0

Die Erweiterung dieser Lösung auf den allgemeinen Fall würde zu einem Umschreiben des 'csv'-Moduls führen. – CivFan

6

In meinem Fall kümmerte ich mich nur um das Entfernen der Leerzeichen aus den Feldnamen (aka die Spaltenüberschriften, alias die Wörterbuchschlüssel), wenn Sie csv.DictReader verwenden.

Erstellen Sie eine Klasse basierend auf csv.DictReader, und überschreiben Sie die fieldnames-Eigenschaft, um die Leerzeichen aus jedem Feldnamen (aka Spaltenkopf, alias Wörterbuchschlüssel) zu entfernen.

Führen Sie dazu die normale Liste der Feldnamen aus und durchlaufen Sie sie beim Erstellen einer neuen Liste, wobei der Leerraum von jedem Feldnamen entfernt wird, und legen Sie das zugrunde liegende Attribut _fieldnames dieser neuen Liste fest.

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 
Verwandte Themen