我在尝试操作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]
提前感谢您的帮助。
答案 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)