从CSV文件中删除空白空间

41

我需要从我读取的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)
10个回答

47

还有一个嵌入的格式参数: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)

5
对于去除空格,是这样的吧:reader = csv.reader(f, skipinitialspace=True, delimiter=',', quoting=csv.QUOTE_NONE) - Caco
4
不删除尾随空格?为什么没有这个选项? - SiL3NC3

16
在我的情况下,我只关心从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

7
如果你的空白字符仅在字段名左侧,例如 ' date' 而不是 'date ' 或者 ' date ',那么使用 csv.DictReader(csvfile, skipinitialspace=True) 同样可以达到同样的效果。 - user3064538

12
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]

这是使用 csv 模块的最佳解决方案。由 csv.reader() 函数返回的 Reader 类在 csv_csv 模块中没有暴露出来,以允许覆盖其 next() 方法。 - CivFan
3
@CivFan 最好使用生成器来产生结果,特别是在处理大文件时:for row in reader: yield (c.strip() for c in row) - Nuno André

4

您可以进行以下操作:

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

4

在解析后格式化单元格的最节省内存的方法是使用生成器。可以尝试以下代码:

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)

但是把它移动到一个函数中可能值得,这样可以让您保持重要的操作并避免未来的迭代。例如:

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)))

3
您可以创建一个包装对象,将CSV读取器看到之前的空格去掉。这样,您甚至可以使用csv.DictReader处理CSV文件。
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=";")

我将“;”硬编码为分隔符。将代码推广到任何分隔符是留给读者的练习。


将这个解决方案扩展到一般情况会导致对 csv 模块进行重写。 - CivFan

2
使用Pandas读取CSV(或Excel文件),并使用此自定义函数对其进行修剪。
#Definition for strippping whitespace
def trim(dataset):
    trim = lambda x: x.strip() if type(x) is str else x
    return dataset.applymap(trim)

现在你可以像这样(作为循环的一部分等)对你的代码应用trim(CSV/Excel)。

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

0

以下是 Daniel Kullmann 的优秀解决方案,适用于 Python3:

import re

class CSVSpaceStripper:
    """strip whitespaces around delimiters in the file
    NB has hardcoded delimiter ";"
    """

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

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

    def __iter__(self):
        return self

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

0
以下代码可能会对你有帮助:
import pandas as pd

aList = pd.read_csv(r'filename.csv', sep='\s*,\s*', engine='python')

0
我找到了一个非常简单的解决方案:
import csv

with open('filename.csv') as f:
  reader = csv.DictReader(f)
  rows = [ { k.strip(): v.strip() for k,v in row.items() } for row in reader ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接