我在试图操作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]
提前感谢您的帮助
这个答案太迟了,因为解决方案已经被接受了,但是解决这个问题的最简单的方法是直接将新构造的行写入输出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])
col
本身是一个列表,所以您将扩展 angles
:
angles.extend(col)
angles.append(angle)
其中list.extend()
将元素复制到angles
列表中,而不是添加对col
列表对象的单个引用。
如果您所做的只是生成一个添加值的新行,只需重用col
并直接追加到它:
col.append(angle)
并将其写入您的输出CSV文件。
col
是错误的命名,真的,我应该叫它row
。
因为col
是列表。你可以将列表项复制到angle中,并添加到
angles=col[:]
angles.append(angle)