在 CSV 中写入列表以创建模型文件

Writing list in CSV to create a model file

我有这个 CSV,我必须使用 Python 修改它。 文件数量每次都不同。我拥有的输入 CSV 文件只是一个坐标列表 (x, y, z),我必须将文件修改为 'model',其中包含相同的坐标,但也包含一些 information/headers.

模型看起来像这样:

Number | 1    |      |

Head   | N    |  E   | El

Begin  | list | list | list

       |   .  |  .   |  .
       |   .  |  .   |  .
       |   .  |  .   |  .
       |   .  |  .   |  .
End    |   .  |  .   |  .
       |   .  |  .   |  .  
BeginR |  Ok  |      |
EndR   |      |      |

圆点是列表中的坐标。 到目前为止,我几乎已经写完了所有内容。

剩下的就是在第一栏写BeginEnd。 因为列表的大小不同,所以我很难将它放在它们应该的位置:从与第一个坐标在同一行开始,到倒数第二个坐标线结束。

这是我的更新代码:

        for i in ficList:
            with open(i, newline='') as f:
                reader = csv.reader(f, delimiter = ';')
                next(reader) # skip the header
                for row in reader:
                    coord_x.append(row[0]) # X
                    coord_y.append(row [1]) # Y
                    coord_z.append(row[2]) # Z

            list_list = [coord_x, coord_y, coord_z] # list of coordinates
            len_x = len(coord_x) # length of list

            with open(i, 'w', newline='') as fp:
                writer = csv.writer(fp, delimiter = ';')
                writer.writerow(['Number', number])
                writer.writerow(['Head','N', 'E', 'El'])
                for l in range(len_x):
                    if l == 0:
                         writer.writerow(['Begin',list_list[0][l], list_list[1][l], list_list[2][l]]) 
                    if l == len_x-2 :
                         writer.writerow(['End',list_list[0][l], list_list[1][l], list_list[2][l]])
                writer.writerow(['',list_list[0][l], list_list[1][l], list_list[2][l]]) # write the coordinates
                writer.writerow(['BeginR', 'Ok'])
                writer.writerow(['EndR'])
                coord_x.clear() # empty list x
                coord_y.clear() # empty list y
                coord_z.clear() # empty list z

对我来说,首先修改输入 CSV 以包含具有带有 sed 的 Begin 和 End 标签的额外列似乎会更容易,如下所示:

sed -e 's/^/,/' -e '1s/^/Begin/' -e '$ s/^/End/' -e 's/^,/ ,/' test.csv

然后您可以简单地按原样打印列,而无需为何时在 python 中添加附加标签添加逻辑。这假设输入 CSV 被称为 test.csv

使用你的最新代码,我猜问题是因为你首先用 BEGIN 标记编写行,然后没有它,将逻辑移动到 if..elif..else 部分 -

for l in range(len_x):
    if l == 0:
        writer.writerow(['Begin',list_list[0][l], list_list[1][l], list_list[2][l]]) 
    elif l == len_x-2 :
        writer.writerow(['End',list_list[0][l], list_list[1][l], list_list[2][l]])
    else:
        writer.writerow(['',list_list[0][l], list_list[1][l], list_list[2][l]]) # write the coordinates

您最好提前在地图中定义行标签,然后在每一行中查找它们。另外 list_list 并不是真正需要的,你应该坚持使用单独的向量:

...
with open(i, 'w', newline='') as fp:
    writer = csv.writer(fp, delimiter = ';')
    writer.writerow(['Number', number])
    writer.writerow(['Head','N', 'E', 'El'])

    row_label_map = {0:'Begin',len_x-2:'End'}
    for l in range(len_x):
        row_label = row_label_map.get(l,"")
        writer.writerow([row_label, coord_x[l], coord_y[l], coord_z[l]])

    writer.writerow(['BeginR', 'Ok'])
    writer.writerow(['EndR']) 

...

此外,您之后不需要清除向量 coord_x 等,因为它们会在超出范围时被删除。