2013-02-14 67 views
18

我需要条纹从我读 导入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) 

回答

3

一个CSV文件中的空格你可以这样做:

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

这是使用'csv'模块的最佳解决方案。 'csv.reader()'函数返回的'Reader'类不会暴露在'csv'或'_csv'模块中,以允许覆盖它的'next()'方法。 – CivFan 2015-09-09 16:45:28

24

另外还有嵌入格式参数: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) 
+0

要分割空格:'reader = csv.reader(f,skipinitialspace = True,delimiter =',',quoting = csv.QUOTE_NONE)',对不对? – Caco 2017-09-18 20:51:28

2

您可以在文件周围创建一个包装对象,在CSV阅读器看到它们之前剥去空间。这样,你甚至可以用cvs.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=";") 

我硬编码";"作为分隔符。将代码概括为任何分隔符作为练习留给读者。

+0

将此解决方案扩展到一般情况将最终重写“csv”模块。 – CivFan 2015-09-09 16:00:01

6

在我的情况下,我只关心从字段名称(又名列标题,又名字典键)中删除空格,当使用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