【问题标题】:Read CSV file, manipulate columns and append result in new column. Python 2.7读取 CSV 文件,操作列并将结果附加到新列中。蟒蛇 2.7
【发布时间】:2014-05-07 11:41:13
【问题描述】:

我在尝试操作 CSV 文件并将结果附加到新列时遇到了一些问题。

基本上我有一个 csv 文件(分隔;),目前有 5 列(笛卡尔坐标 [X, Y] 和分量 [dX, dY] 以及幅度/长度)。我希望将一些方程的结果添加到这个 csv 文件的第 6 列(角度)。

到目前为止,我的代码是这样的(数学是正确的 [希望如此],这只是我遇到问题的附加):

import csv, math
with open("mydata.csv", "rb") as f:
vectors = csv.reader(f, delimiter=";")

    for col in vectors:
        x = float(col[0])
        y = float(col[1])
        dX = float(col[2])
        dY = float(col[3])
        magnitude = float(col[4])

        if dX > 0 and dY > 0:
            comp = dY/dX
            theta = math.degrees(math.atan(comp))
            angle = 90 - theta
        elif dX > 0 and dY < 0:
            comp = dY/dX
            theta = math.degrees(math.atan(comp))
            angle = 90 + theta
        elif dX < 0 and dY > 0:
            comp = dX/dY
            theta = math.degrees(math.atan(comp))
            angle = 360 - theta
        elif dX < 0 and dY < 0:
            comp = dY/dX
            theta = math.degrees(math.atan(comp))
            angle = 270 - theta

所以本质上,我想将 angle 变量添加到第 6 列,以获取我的 csv 文件的正确行。

我尝试创建一个新列表并附加(例如):

angles = []
...
angles.append(col)
angles.append(angle)

但是,正如您可能已经猜到的那样,我最终得到了这样的一行:

[[x, y, dX, dY, magnitude], angle]

提前感谢您的帮助。

【问题讨论】:

    标签: python python-2.7 csv cartesian


    【解决方案1】:

    这个答案为时已晚,因为已经接受了一个解决方案,但解决问题的最简单方法是将新构建的行直接写入输出 csv 文件,而不创建中间列表。

    你可以这样写:

    import csv, math
    
    with open("mydata.csv", "rb") as f,\
         open("newdata.csv", "wb") as g:
            vectors = csv.reader(f, delimiter=";")
            writer = csv.writer(g, delimiter=";")
            for row in vectors:
                # use destructuring
                x, y, dX, dY, magnitude = map(float, row)
    
                if dX > 0 and dY > 0:
                #<snip>
    
                # at this stage you can write directly to the output
                # file.
                writer.writerow([x, y, dX, dY, magnitude, angle])
    

    【讨论】:

    • 虽然我接受了 Martijn 的解决方案 - 我相信这更有效地解决了问题。非常感谢。
    • @MACooperr:实际上,这以几乎相同的方式解决了问题。在任何情况下,两者都不比另一个更有效。并不是说我不情愿在这里接受 superjump。 :-)
    • @MartijnPieters——我想这是真的!我只能道歉!谢谢你们的帮助。使用您提供的初始解决方案,我在维护原始列的同时写入 csv 时遇到了麻烦(它显示为一个长列表);但是,这可能是由于我自己的无能,而不是您的解决方案。
    【解决方案2】:

    col 本身就是一个列表,所以你可以扩展 angles:

    angles.extend(col)
    angles.append(angle)
    

    其中list.extend() 将元素复制到angles 列表中,而不是添加对col 列表对象的单个引用。

    如果您所做的只是生成一个添加了一个值的新行,只需重复使用 col 并直接附加到它:

    col.append(angle)
    

    并将其写入您的输出 CSV 文件。

    col 的名字是错误的,真的,我会叫它row

    【讨论】:

      【解决方案3】:

      因为 collist 。您可以将列表项复制到角度并附加它

      angles=col[:]
      angles.append(angle)
      

      【讨论】:

        猜你喜欢
        • 2018-12-31
        • 1970-01-01
        • 2016-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-10
        • 2016-04-08
        • 1970-01-01
        相关资源
        最近更新 更多