Python CSV read->写;删除并替换PLUS:行尾是JSON格式

时间:2013-03-03 20:07:40

标签: python json csv

我在让Python脚本做我想做的事时遇到了问题。它似乎没有修改我的文件。

我想:

  1. 读入具有以下格式的* .csv文件 PropertyName :: PropertyValue,...,PropertyName :: PropertyValue,{ExtPropertyName :: ExtPropertyValue},...,{ExtPropertyName :: ExtPropertyValue}
  2. 我想删除PropertyName ::并将behid只留下PropertyValue的一列
  3. 我想添加标题行
  4. 我试图用逗号替换:: values,但似乎不能让它工作:

    fin = csv.reader(open('infile', 'rb'), delimiter=',')
    fout = open('outfile', 'w')
    for row in fin:
       fout.write(','.join(','.join(item.split()) for item in row) + '::')
    fout.close()
    

    任何建议,无论是我的第一步问题,还是更大的图片分辨率,都会受到赞赏。感谢。

    UPDATE / EDIT由一个足够好的人来询问我!

    这是* .csv文件(INPUT)的第一行

    InnerDiameterOrWidth::0.1,InnerHeight::0.1,Length2dCenterToCenter::44.6743867864386,Length3dCenterToCenter::44.6768028159989,Length2dToInsideEdge::44.2678260053526,Length3dToInsideEdge::44.2717800813466,Length2dToOutsideEdge::44.6743867864386,Length3dToOutsideEdge::44.6768028159989,MinimumCover::0,MaximumCover::0,StartConnection::ImmxGisUtilityNetworkCommon.Connection,
    

    在一个完美的世界里,我希望我的文本文件看起来像(OUTPUT)

    InnerDiameterOrWidth, InnerHeight, Length2dCenterToCenter,,,,,,,,,,,
    0.1,0.1,44.6743867864386
    

    所以一个标题行和列

    中的值

    更新 JSON信息

    每行的结尾都有JSON格式的文本:

    {StartPoint::7858.35924983374[%2C]1703.69341358077[%2C]-3.075},{EndPoint::7822.85045874375[%2C]1730.80294308742[%2C]-3.53962362760298}
    

    我需要分割成带标题的X Y Z和X Y Z

1 个答案:

答案 0 :(得分:1)

也许是这样的(假设每一行都有相同的键,并且顺序相同):

import csv

with open("diam.csv", "rb") as fin, open("diam_out.csv", "wb") as fout:
    reader = csv.reader(fin)
    writer = csv.writer(fout)
    for i, line in enumerate(reader):
        split = [item.split("::") for item in line if item.strip()]
        if not split: # blank line
            continue
        keys, vals = zip(*split)
        if i == 0:
            # first line: write header
            writer.writerow(keys)
        writer.writerow(vals)

产生

localhost-2:coding $ cat diam_out.csv 
InnerDiameterOrWidth,InnerHeight,Length2dCenterToCenter,Length3dCenterToCenter,Length2dToInsideEdge,Length3dToInsideEdge,Length2dToOutsideEdge,Length3dToOutsideEdge,MinimumCover,MaximumCover,StartConnection
0.1,0.1,44.6743867864386,44.6768028159989,44.2678260053526,44.2717800813466,44.6743867864386,44.6768028159989,0,0,ImmxGisUtilityNetworkCommon.Connection

我认为大多数代码都应该有意义,除了zip(*split)技巧:基本上转换序列,即

>>> s = [['a','1'],['b','2']]
>>> zip(*s)
[('a', 'b'), ('1', '2')]

这样元素现在按照它们的索引组合在一起(第一个都在一起,第二个等等)