2

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

提前感谢您的帮助。

4

3 回答 3

1

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

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

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

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

col.append(angle)

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

col是错名,真的,我会打电话给它row

于 2014-05-07T11:43:19.257 回答
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])
于 2014-05-07T13:48:38.687 回答
0

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

angles=col[:]
angles.append(angle)
于 2014-05-07T11:45:50.630 回答