读取CSV文件,操作列并在新列中追加结果。 Python 2.7

时间:2014-05-07 11:41:14

标签: python python-2.7 csv cartesian

我在尝试操作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]

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

col本身就是一个列表,因此您扩展 angles

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

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

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

col.append(angle)

并将其写入输出CSV文件。

col被误称,真的,我将其称为row

答案 1 :(得分: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])

答案 2 :(得分:0)

因为col列表。你可以只将列表项复制到角度并附加它

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