首页 > 解决方案 > 使用 python 将列添加到 .csv

问题描述

我有一个看起来像这样的原始 .csv,有 25834 行:

在此处输入图像描述

我想在这个 .csv 中添加一些列,但我不能同时这样做,所以我要做的是打开以前的 .csv 并创建一个新的,如下所示:

with open('results.csv', 'r') as read_object, \
            open('results_output.csv', 'w', newline='') as write_object:
    csv_reader = reader(read_object)
    csv_writer = writer(write_object)
    line_count = 0

    for row in csv_reader:
        if line_count == 0:
            row.append('relative_stenosis')
            csv_writer.writerow(row)
            line_count += 1
        line_count += 1

        for image_name in os.listdir(directory_segmentation):
            if str(row[1]) == image_name:
                image = cv2.imread(directory_segmentation + "/" + image_name)
                row.append(
                    rel_st_calc.RelativeStenosisCalculation().calculate_relative_stenosis(image, 'green'))

                csv_writer.writerow(row)

该代码添加了一个列,其中图像的名称与我在目录中的 150 个图像之一的名称匹配。问题是在新的 .csv 中,所有其他行都被删除了,当我想保留原来的 25834 行时,我得到了 150 行的 .csv。我想为那些没有出现的设置一个空值,因为我稍后会需要它们。我怎样才能做到这一点?现在我有这个:

在此处输入图像描述

非常感谢!

编辑:这些是我正在使用的输入:

from csv import writer
from csv import reader

标签: pythoncsv

解决方案


没有匹配的行会消失,因为您从未将它们添加到新的 csv 中。要解决此问题,您将必须跟踪是否找到图像,然后在第三列中写入具有空值的行(如果没有找到)。例如:

third_col_value = ""
for image_name in os.listdir(directory_segmentation):
    if str(row[1]) == image_name:
        image = cv2.imread(directory_segmentation + "/" + image_name)
        third_col_value = rel_st_calc.RelativeStenosisCalculation().calculate_relative_stenosis(image, 'green')
        break # Already found the file, no need to finish the loop

row.append(third_col_value)
csv_writer.writerow(row)

不过,尝试直接访问该图像可能是一个更好的主意,因为您已经知道图像的名称(在 中row[1])。这样,您就不会浪费时间对目录列表进行不必要的迭代来查找名为row[1]. 为此,请for image_name in os.listdir(...):用以下代码替换循环:

third_col_value = ""
image_name = row[1]
image_path = os.path.join(directory_segmentation, image_name)
if os.path.exists(image_path):
    third_col_value = rel_st_calc.RelativeStenosisCalculation().calculate_relative_stenosis(image, 'green')
row.append(third_col_value)
csv_writer.writerow(row)

推荐阅读