【问题标题】:Modify Z Value in XYZ coordinate file修改 XYZ 坐标文件中的 Z 值
【发布时间】:2020-01-13 10:30:05
【问题描述】:

我有一个包含随机 x,y,z 坐标的文件。我正在尝试编写一些代码以在 z 值前面插入一个“-”(负数)(因此给我一个负高程)。

问题是,我将文件保存为 .csv,不幸的是,这不会添加任何分隔符,因此数据仅位于每行一个单元格上,由空格分隔:x_y_z。 “csv”文件包含超过 100 万个点,因此在 excel 中编辑它是不可能的。

我尝试了几种方法来做我想做的事,但是当我试图遍历每一行并写出数据时,我摔倒了。任何帮助或指示将不胜感激。

我尝试了两件事。第一种方法可能非常粗糙,但它似乎达到了我想要的效果,虽然它只适用于 1 行。我不知道如何真正遍历每一行。

第二种方法会取第一行,把X、Y、Z分成不同的变量,然后我就迷路了!

#First method:
import csv
inputfile = csv.reader(open ("\\wk.csv", 'r'))
    for row in inputfile:
    rowstring = str(row)
    x1 = rowstring[2:11]
    y1 = rowstring[12:22]
    z1 = "-" + rowstring[23:29]
    xynz = x1 + " " + y1 + " " + z1


#second method:
with open ("\\wk.csv", 'r+') as f:
    for l in f:
    x2, y2, z2 = l.split()
    z3 = "-"+z2

第一种方法会给我只需要一行的结果。['555555.55', '4444444.44', '-333.33']

第二种方法将 Z 分开,我可以在其中添加负数,但在我卡住之后

【问题讨论】:

  • 提供来自您的wk.csv 文件的样本数据和所需的结果。此外,您发布的代码的缩进不正确,因此它不起作用。创建minimal reproducible example

标签: python csv xyz


【解决方案1】:

如果我理解你的问题,这个脚本应该可以工作:

input_file = 'wk.csv'
output_file = 'new_wk.csv'

# Reading input
f = open(input_file, 'r')
rows = f.read().split('\n')
if '' in rows: # remove last blank line if needed
    rows.remove('')
f.close()

# Writing output
f = open(output_file, 'w')
for row in rows: # loop over your million rows
    print(row)
    x, y, z = row.split(' ')
    z = '-'+z    # editing z
    f.write('{} {} {}\n'.format(x, y, z))
f.close()

【讨论】:

  • 非常感谢!我已经更改了代码,它开始正确执行,但在写入 25kb 左右后下降:x, y, z = row.split(' ') ValueError: too many values to unpack (expected 3)跨度>
  • 你解决了吗?我想感谢print(row),您应该能够知道为什么会失败。基本上你的行中有超过 2 个空格,所以 row.split(' ') 有超过 3 个值可以“解包”。您可以通过使用 values = row.split(' ')f.write('{} {} {}\n'.format(values[0], values[1], values[2])) 的前 3 个值来纠正此问题。
【解决方案2】:

这就是我如何可视化您的数据文件

x1,y1,z1
x2,y2,z2
x3,y3,z3
    .
    .
    .

我有点困惑你是如何描述你的数据文件的。它是由空格分隔的吗?如果是这样,您可以像这样读取数据。

with open('input.csv') as csv_file:
     csv_reader = csv.reader(csv_file, delimiter=' ')

如果它实际上是用 分隔的,那么做。

with open('employee_birthday.txt') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')

你可以做的是循环并从每一行中拉出 x y 和 z 像这样。

import csv

with open('new.csv', mode='w') as out_file:
    csv_writer = csv.writer(out_file, delimiter=',')


#initialize new csv file.
for x, y, z in input_file:
    #I assume you want to read them as string to add the -
    x = str(x)
    y = str(y)
    z = str(z)
    # add the -
    z = "-" + z
    csv_writer.writerow([x, y, z])

【讨论】:

    猜你喜欢
    • 2019-09-19
    • 2023-03-27
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多