在 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 | | |
圆点是列表中的坐标。
到目前为止,我几乎已经写完了所有内容。
剩下的就是在第一栏写Begin和End。
因为列表的大小不同,所以我很难将它放在它们应该的位置:从与第一个坐标在同一行开始,到倒数第二个坐标线结束。
这是我的更新代码:
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 等,因为它们会在超出范围时被删除。
我有这个 CSV,我必须使用 Python 修改它。 文件数量每次都不同。我拥有的输入 CSV 文件只是一个坐标列表 (x, y, z),我必须将文件修改为 'model',其中包含相同的坐标,但也包含一些 information/headers.
模型看起来像这样:
Number | 1 | |
Head | N | E | El
Begin | list | list | list
| . | . | .
| . | . | .
| . | . | .
| . | . | .
End | . | . | .
| . | . | .
BeginR | Ok | |
EndR | | |
圆点是列表中的坐标。 到目前为止,我几乎已经写完了所有内容。
剩下的就是在第一栏写Begin和End。 因为列表的大小不同,所以我很难将它放在它们应该的位置:从与第一个坐标在同一行开始,到倒数第二个坐标线结束。
这是我的更新代码:
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 等,因为它们会在超出范围时被删除。