读取CSV文件,处理列并将结果添加到新列。Python 2.7
我在处理一个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])