问题 python如何修剪csv DictReader键中的尾随空格


我正在使用python(2.6)csv DictReader。我的输入文件有一个标题行,其中列名称有尾随空格:

colname1,      colname2     ,col3, etc.
XX, YY, ZZ

返回的dict对象有key()= ['colname1', 'colname2 ', 'col3']

是否可以选择修剪键中的前导和尾随空格?

- 编辑

在通过键名处理时出现问题:

with open(fname) as f:
   r = csv.DictReader(f)
   for row in r:
      print "processing", r["column1"], r["column2"]

这些文件是数据库转储。转储程序太聪明了 - 它根据数据调整输出列宽度 - 这意味着不同的选择集将具有不同的列宽和不同的密钥长度。有时我必须使用 r['column2 '] 有时会填充或减少空间。哎哟!


12797
2017-12-11 20:53


起源



答案:


只需手动读取第一行并将其传递给 DictReader

with open('file.csv') as fh:
    header = [h.strip() for h in fh.next().split(',')]
    reader = csv.DictReader(fh, fieldnames=header)

9
2017-12-11 21:00



我希望这是csv.DictReader中的一个选项。 (有没有地方表达这样的愿望清单?) - Dinesh
您可以尝试请求该功能,但他们可能不会添加它。公平地说,你的csv坏了;) - Wolph
是的,CSV是 异常 但它是一个数据库转储,每个供应商都有自己的个性。但我知道不问的结果:)人们问哪里? - Dinesh
Python bug跟踪器就是这样的地方: bugs.python.org - Wolph
在python 3,FWIW中不起作用。但是,是什么 重新定义 reader.fieldnames。 - ijoseph


答案:


只需手动读取第一行并将其传递给 DictReader

with open('file.csv') as fh:
    header = [h.strip() for h in fh.next().split(',')]
    reader = csv.DictReader(fh, fieldnames=header)

9
2017-12-11 21:00



我希望这是csv.DictReader中的一个选项。 (有没有地方表达这样的愿望清单?) - Dinesh
您可以尝试请求该功能,但他们可能不会添加它。公平地说,你的csv坏了;) - Wolph
是的,CSV是 异常 但它是一个数据库转储,每个供应商都有自己的个性。但我知道不问的结果:)人们问哪里? - Dinesh
Python bug跟踪器就是这样的地方: bugs.python.org - Wolph
在python 3,FWIW中不起作用。但是,是什么 重新定义 reader.fieldnames。 - ijoseph


您需要在csv模块中注册自定义方言

csv.register_dialect('MyDialect', quotechar='"', skipinitialspace=True, quoting=csv.QUOTE_NONE, lineterminator='\n', strict=True)

然后在创建DictReader时使用方言:

my_reader = csv.DictReader(trip_file, dialect='MyDialect')

这就是全部 方言选项


1
2017-07-10 02:25



这只删除了前导空格,但是没有用于尾随空格的选项。 - 43Tesseracts