Подтвердить что ты не робот

Вырезать пробелы из файла CSV

Мне нужно перечеркнуть пробелы из файла CSV, который я прочитал

import 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)
4b9b3361

Ответ 1

Также имеется встроенный параметр форматирования: skipinitialspace (по умолчанию - 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)

Ответ 2

В моем случае я только заботился об удалении пробелов из названий полей (также называемых заголовками столбцов, а также ключами словаря) при использовании csv.DictReader.

Создать класс, основанный на csv.DictReader, и переопределить fieldnames свойство вырезать пробелы из каждого имени поля ( так называемый заголовок столбца, также известный как словарь ключ).

Сделайте это, получив обычный список имен полей, а затем повторите его, создавая новый список с пробелом, удаленным из каждого имени поля, и установите для этого нового списка базовый атрибут _fieldnames.

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

Ответ 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]

Ответ 4

Вы можете сделать:

aList.append([element.strip() for element in row])

Ответ 5

Вы можете создать объект-оболочку вокруг вашего файла, который удаляет пробелы перед тем, как их увидит читатель CSV. Таким образом, вы даже можете использовать файл csv с 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

Затем используйте его следующим образом:

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

Я жестко обозначил ";" как разделитель. Обобщение кода на любой разделитель оставляется в качестве упражнения для читателя.

Ответ 6

Прочтите CSV (или файл Excel) с помощью Pandas и обрезайте его, используя эту настраиваемую функцию.

#Definition for strippping whitespace
def trim(dataset):
    trim = lambda x: x.strip() if type(x) is str else x
    return dataset.applymap(trim)

Теперь вы можете применить обрезку (CSV/Excel) к вашему коду, как это (как часть цикла и т.д.),

dataset = trim(pd.read_csv(dataset))
dataset = trim(pd.read_excel(dataset))

Ответ 7

Самый эффективный для памяти способ форматирования ячеек после разбора - через генераторы. Что-то вроде:

with open(self.filename, 'r') as f:
    reader = csv.reader(f, delimiter=',', quoting=csv.QUOTE_NONE)
    for row in reader:
        yield (cell.strip() for cell in row)

Но, возможно, стоит переместить его в функцию, которую вы можете использовать, чтобы сохранить munging и избежать предстоящих итераций. Например:

nulls = {'NULL', 'null', 'None', ''}

def clean(reader):
    def clean(row):
        for cell in row:
            cell = cell.strip()
            yield None if cell in nulls else cell

    for row in reader:
        yield clean(row)

Или он может использоваться для факторизации класса:

def factory(reader):
    fields = next(reader)

    def clean(row):
        for cell in row:
            cell = cell.strip()
            yield None if cell in nulls else cell

    for row in reader:
        yield dict(zip(fields, clean(row)))