2013-02-14 13 views
18

muszę naszywka białe spacje z pliku csv, które czytam importu CSVtaśmy białe znaki z pliku 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) 

Odpowiedz

3

można zrobić:

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

To najlepsze możliwe rozwiązanie przy użyciu modułu 'csv'. Klasa 'Reader' zwrócona przez funkcję' csv.reader() 'nie jest widoczna w module' csv' lub '_csv', aby umożliwić nadpisanie jej metody' next() '. – CivFan

24

Istnieje również wbudowany parametr formatowania: skipinitialspace (domyślnie jest to fałsz) 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

Aby rozbarwić białe spacje: 'reader = csv.reader (f, skipinitialspace = True, delimiter = ',', quoting = csv.QUOTE_NONE)', prawda? – Caco

2

Możesz utworzyć wokół obiektu plik otoki, który usunie spacje przed odczytaniem ich przez czytnik CSV. W ten sposób możesz nawet użyć pliku csv z 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 

następnie używać go tak:

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

ja sztywno ";" się separator. Generowanie kodu do dowolnego ogranicznika jest pozostawione ćwiczeniu dla czytelnika.

+0

Rozszerzenie tego rozwiązania do ogólnego przypadku zakończyłoby się ponownym zapisaniem modułu 'csv'. – CivFan

6

W moim przypadku, ja tylko dbał o odpędzenie spacje z nazwami pól (aka nagłówków kolumn, vel słownika klucze), przy zastosowaniu csv.DictReader.

Utwórz klasę opartą na csv.DictReader i przesłonię właściwość fieldnames, aby usunąć białe znaki z każdej nazwy pola (zwanego również nagłówkiem kolumny, czyli słownikiem).

Wykonaj tę czynność, pobierając zwykłą listę nazw pól, a następnie powtarzając ją, tworząc nową listę z białymi znakami usuniętymi z nazwy każdego pola, a następnie ustawiając podstawowy atrybut _fieldnames na tę nową listę.

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 
Powiązane problemy