我有一个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
答案 0 :(得分:2)
你可能想看看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
替换为您要输出的文件句柄。
答案 1 :(得分:1)
无论如何你切片,你仍然需要通过列表。有很多优雅的方法可以做到这一点。根据您使用的python版本,您可以使用列表推导。
ids=line.split(",")
print "%s:%s" % (ids[0], ":".join(["case%d" % x for x in range(1, len(ids)) if ids[x] != "null"])
答案 2 :(得分:0)
为什么将分裂视为一个问题?出于性能原因?
从字面上看,你可以避免使用智能正则表达式(例如:
)\d+,null,\w+,\w+
\d+,\w+,null,\w+
...
但是我发现它比将数据重新列入列表更糟糕。
答案 3 :(得分:0)
你可以使用Python csv module,带有python的标准安装...虽然不会much
更容易......