读取CSV文件,处理列并将结果添加到新列。Python 2.7

2 投票
3 回答
1881 浏览
提问于 2025-04-18 05:40

我在处理一个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这个变量添加到CSV文件的第6列,针对正确的那一行。

我尝试创建一个新的列表并进行添加(例如):

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

不过,正如你可能猜到的,我最后得到的结果是这样的:

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

提前感谢你的帮助。

3 个回答

0

因为 col 是一个 列表,所以你可以直接把列表里的项目复制到角度(angles)里,然后把它们添加上去。

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

col 本身就是一个列表,所以你应该用 extend 方法来扩展 angles

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

这里的 list.extend() 方法是把 col 列表里的元素复制到 angles 列表里,而不是仅仅添加一个对 col 列表对象的引用。

如果你只是想生成一个新行,并添加一个值,那就直接重用 col,然后把值加到它里面:

col.append(angle)

然后把这个写入你的输出 CSV 文件。

其实 col 这个名字起得不太好,我觉得应该叫它 row 更合适。

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])

撰写回答