Вырезать пробелы из файла 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)
Ответы
Ответ 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)))