【问题标题】:Python strings / match casePython 字符串/匹配大小写
【发布时间】:2010-11-08 20:44:00
【问题描述】:

我有一个 CSV 文件,格式如下:

id,case1,case2,case3

这是一个示例:

123,null,X,Y

342,X,X,Y

456,null,null,null

789,null,null,X

对于每一行,我需要知道哪些情况不为空。有没有一种简单的方法可以在不拆分字符串并遍历每个元素的情况下找出哪些情况不为空?

结果应该是这样的:

123,case2:case3

342,case1:case2:case3

456:None

789:case3

【问题讨论】:

    标签: python csv


    【解决方案1】:

    您可能想看看CSV module,它有读者和作者,可以让您创建转换。

    >>> from StringIO import StringIO
    >>> from csv import DictReader
    >>> fh = StringIO("""
    ... id,case1,case2,case3
    ... 
    ... 123,null,X,Y
    ... 
    ... 342,X,X,Y
    ... 
    ... 456,null,null,null
    ... 
    ... 789,null,null,X
    ... """.strip())
    >>> dr = DictReader(fh)
    >>> dr.next()
    {'case1': 'null', 'case3': 'Y', 'case2': 'X', 'id': '123'}
    

    此时您可以执行以下操作:

    >>> from csv import DictWriter
    >>> out_fh = StringIO()
    >>> writer = DictWriter(fh, fieldnames=dr.fieldnames)
    >>> for mapping in dr:
    ...     writer.write(dict((k, v) for k, v in mapping.items() if v != 'null'))
    ...
    

    最后一点只是伪代码——不确定dr.fieldnames 实际上是一个属性。将out_fh 替换为您要输出到的文件句柄。

    【讨论】:

    • 另外,最后一个 sn-p 没有您正在寻找的确切输出,但它会为您提供 90% 的输出。 :-)
    【解决方案2】:

    不管怎样,你仍然需要遍历列表。有越来越多优雅的方法来做到这一点。根据您使用的 python 版本,您可以使用列表推导。

    ids=line.split(",")
    print "%s:%s" % (ids[0], ":".join(["case%d" % x for x in range(1, len(ids)) if ids[x] != "null"])
    

    【讨论】:

      【解决方案3】:

      您为什么将分裂视为一个问题?出于性能原因?

      从字面上看,您可以避免使用智能正则表达式进行拆分(例如:

      \d+,null,\w+,\w+
      \d+,\w+,null,\w+
      ...
      

      但我发现它比将数据重新解析为列表更糟糕。

      【讨论】:

      • 正则表达式是一个解析问题,就像拆分一样。除了它们比使用简单的字符搜索进行拆分要昂贵得多。
      【解决方案4】:

      您可以使用 Python csv module,它是标准安装的 Python 自带的...但不会比 much 更容易...

      【讨论】:

        猜你喜欢
        • 2022-11-14
        • 1970-01-01
        • 2013-05-03
        • 2014-09-07
        • 1970-01-01
        • 2015-10-02
        • 2020-09-13
        • 2022-06-12
        • 2011-09-28
        相关资源
        最近更新 更多