【问题标题】:python how to trim trailing spaces in csv DictReader keyspython如何修剪csv DictReader键中的尾随空格
【发布时间】:2014-12-11 20:53:07
【问题描述】:

我正在使用 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 '],有时需要填充或减少空格。哎哟!

【问题讨论】:

    标签: python


    【解决方案1】:

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

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

    【讨论】:

    • 我希望这是 csv.DictReader 中的一个选项。 (有没有地方可以表达这样的愿望清单?)
    • 您可以尝试请求该功能,但他们可能不会添加它。公平地说,你的 csv 坏了;)
    • 是的,CSV 不寻常,但它是一个数据库转储,每个供应商都有自己的个性。但我知道不问的结果:)一个人在哪里问?
    • 在 python 3,FWIW 中不起作用。什么是redefining reader.fieldnames
    • 如果我只想从标题中删除空格并保存文件...我该如何归档?
    【解决方案2】:

    你需要在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')
    

    这里是所有Dialect Options

    【讨论】:

    • 这只会删除前导空格,但没有尾随空格的选项。
    【解决方案3】:

    Python3 版本

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

    【讨论】:

      【解决方案4】:

      按照其他答案的思路,但为什么不将 CSV 阅读器用于该标题行?

      header = [h.strip() for h in next(csv.reader(f))]
      reader = csv.DictReader(f, fieldnames=header)
      

      【讨论】:

        猜你喜欢
        • 2010-11-26
        • 1970-01-01
        • 1970-01-01
        • 2014-05-07
        • 1970-01-01
        • 2017-01-07
        • 1970-01-01
        • 2021-04-08
        • 1970-01-01
        相关资源
        最近更新 更多