gpt4 book ai didi

python - 用另一个文件的行替换文件的行

转载 作者:行者123 更新时间:2023-11-28 20:30:12 25 4
gpt4 key购买 nike

我有两个 .txt 格式的点云文件(场景和绿色)。场景点云通常包含超过 100000 条线,例如绿色点云包含 20000 条线。除了最后一个数字是每个点的标签外,这两个文件的绿点行相同。

场景:

0.805309, -3.43696, 6.85463, 0, 0, 0, 5
0.811636, -3.42248, 6.82576, 0, 0, 0, 5
-1.00663, 0.0985967, 3.02769, 42, 134, 83, 5
-1.00182, 0.098547, 3.02617, 43, 133, 83, 5
-0.997052, 0.0985018, 3.02478, 41, 133, 82, 5
0.811636, -3.42248, 6.82576, 0, 0, 0, 5

绿色:

-1.00663, 0.0985967, 3.02769, 42, 134, 83, 3
-1.00182, 0.098547, 3.02617, 43, 133, 83, 3
-0.997052, 0.0985018, 3.02478, 41, 133, 82, 3

我想用绿色文件中的相同行替换场景绿色点中的整行,或者只要两条行相等,就将标签编号从 5 更改为 3。最后的结果是这样的: 场景:

0.805309, -3.43696, 6.85463, 0, 0, 0, 5
0.811636, -3.42248, 6.82576, 0, 0, 0, 5
-1.00663, 0.0985967, 3.02769, 42, 134, 83, 3
-1.00182, 0.098547, 3.02617, 43, 133, 83, 3
-0.997052, 0.0985018, 3.02478, 41, 133, 82, 3
0.811636, -3.42248, 6.82576, 0, 0, 0, 5

我已经编写了两种类型的代码来执行此操作,但它们都加载了很长时间,这一点都不好,因为我有很多文件要修改。第一个代码:

import os
import fileinput
def main(scene, others):

for file in others:
other = open(file, "r+")
for line in other:
line1 = line[:-3]
f=scene
for sceneLine in fileinput.input(f,inplace=True):
new = sceneLine
sceneLine1 = sceneLine[:-3]
if sceneLine1 == line1:
print(sceneLine.replace(new, line), end='')
else:
print(sceneLine.replace(line,line), end='')
fileinput.close()


others = []
for file in os.listdir("./"):
if file.endswith(".txt"):
if file.startswith("pointCloudScene9863Cl"):
scene = file
else:
others.append(file)

main(scene,others)

第二个代码:

import os
import fileinput
import numpy

def main(scene1, others):

pointcloud = []
scene1 = open(scene1,"r+")
scene = []
for each_point in scene1:
scene.append(each_point)

for file in others:
other = open(file, "r+")
for line in other:
pointcloud = []
line1 = line[:-3]
for sceneLine in scene:
sceneLine1 = sceneLine[:-3]
if sceneLine1 == line1:
pointcloud.append(line)
else:
pointcloud.append(sceneLine)
scene = pointcloud

with open('pointcloud.txt', 'w') as points:
for item in scene:
points.write("%s" % item)


others = []
for file in os.listdir("./"):
if file.endswith(".txt"):
if file.startswith("pointCloudScene9863Cl"):
scene = file
else:
others.append(file)

main(scene,others)

这两个都可以完美地处理少量点,但是当我使用我的原始点云文件时,完成这项工作需要 30 多分钟甚至更长时间。当我基本上使用嵌套循环时,我实际上在 FOR 循环中看到了问题,这意味着我将有 100000*20000 个循环来更改绿点。

是否有使用 numpy 数组或任何其他方法的有效方法?

最佳答案

我有一个应该足够的解决方案,但在我讨论之前,免责声明:如果没有您提供的更多信息,将不可能找到合适的解决方案。我们需要这个问题的上下文,以及关于数据格式和你正在尝试做什么的更精确和详细的信息。

例如,比较 float 是否相等感觉不太好,一般对数字的操作在精度方面总是有一定的风险等。由于这些点似乎来自同一个地方,如果每个人都有某种独特的 ID,可用于检查是否相等。


和这里的其他一些人一样,我的第一 react 是捕获 numpy 和 pandas。这是我的一个错误,因为这个任务根本不涉及太多数据操作或转换。

那么,这是我现在能想到的最简单的实现:

def point_parse(line):
line_point = line.split(", ")
line_point[0] = float(line_point[0])
line_point[1] = float(line_point[1])
line_point[2] = float(line_point[2])
line_point[3] = int(line_point[3])
line_point[4] = int(line_point[4])
line_point[5] = int(line_point[5])
line_point[6] = int(line_point[6])
return tuple(line_point)

green_points_set: frozenset
black_points_set: frozenset

with open("../resources/Green_long.txt", "r") as green_file:
green_points_set = frozenset((point_parse(line)[:-1] for line in green_file))

with open("../resources/Black_long.txt", "r") as black_file:
black_points_set = frozenset((point_parse(line)[:-1] for line in black_file))

def set_point_label(point):
point_comp = point[:-1]
if point_comp in green_points_set:
point_comp += (3,)
elif point_comp in black_points_set:
point_comp += (4,)
else:
point_comp = point
return point_comp

with open("../resources/Scene_long.txt", "r") as scene_file:
scene_points_new = (set_point_label(point_parse(line)) for line in scene_file)
form_lines = ((f"{res_line[0]}, {res_line[1]}, {res_line[2]}, {res_line[3]}, "
f"{res_line[4]}, {res_line[5]}, {res_line[6]}\n") for res_line in scene_points_new)

with open("../out/Scene_out.txt", "w") as scene_out:
scene_out.writelines(form_lines)

代码非常简单。为绿点和黑点创建集合,我们测试成员资格,并适本地更改标签。

我为自己创建了一些训练数据:一个总共有 1,000,000 个点、125,000 个绿点和 125,000 个黑点的场景。运行时间不到 7 秒(希望我没有犯任何严重错误!),内存使用应该很低。

关于python - 用另一个文件的行替换文件的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58286285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com