Прочитайте файл CSV, управляйте столбцами и добавляйте результат в новый столбец. Питон 2.7

У меня возникли проблемы с попыткой манипулировать файлом CSV и добавить результаты в новый столбец.

По сути, у меня есть файл csv (с разделителями;) с 5 столбцами в настоящее время (декартовы координаты [X, Y] и компоненты [dX, dY] и величина/длина). Я хочу добавить результат некоторых уравнений, которые различаются в зависимости от значения моих декартовых компонентов, в 6-й столбец в этом файле csv (угол).

Пока что мой код таков (математика верна [надеюсь], это просто добавление, с которым у меня проблемы):

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]

Заранее благодарны за Вашу помощь.


person MACooperr    schedule 07.05.2014    source источник


Ответы (3)


Этот ответ слишком запоздал, так как решение уже принято, но самый простой способ решить проблему — записать вновь созданную строку непосредственно в выходной 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])
person superjump    schedule 07.05.2014
comment
Хотя я принял решение Мартейна, я считаю, что это более эффективно решает проблему. Большое спасибо. - person MACooperr; 07.05.2014
comment
@MACooperr: На самом деле это решает проблему почти так же. Ни один из них не является более эффективным, чем другой, в любом случае. Не то, чтобы я с сожалением принял суперпрыжок. :-) - person Martijn Pieters; 07.05.2014
comment
@MartijnPieters - я полагаю, это правда! Я могу только извиниться! Спасибо вам обоим за вашу помощь. С исходным решением, которое вы предоставили, у меня возникли проблемы с записью в csv при сохранении исходных столбцов (оно представлено в виде одного длинного списка); однако это, скорее всего, связано с моей собственной неумелостью, а не с вашим решением. - person MACooperr; 07.05.2014

col — это сам список, поэтому вы должны расширить angles:

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

где list.extend() копирует элементы в список angles, а не добавляет одну ссылку на объект списка col.

Если все, что вы делаете, это создаете новую строку с одним добавленным значением, просто повторно используйте col и добавьте к ней напрямую:

col.append(angle)

и запишите это в выходной файл CSV.

col неправильно назван, я бы назвал его row вместо этого.

person Martijn Pieters    schedule 07.05.2014

так как col это список . вы можете просто скопировать элементы списка в углы и добавить их

angles=col[:]
angles.append(angle)
person sundar nataraj    schedule 07.05.2014