【发布时间】:2018-01-03 17:52:32
【问题描述】:
我正在开发一个文件编辑脚本,该脚本能够根据某些关键字找到文件的某个部分,然后将其下方的部分替换为替代部分。重要的是要知道文件的格式非常严格,因此文件之间的差异应该很小甚至没有。
文件看起来像:
Z1 ; move to next (0)
Q6 ; comment1
X5 Y7 ; point
X6 Y9 ; point
X4 Y8 ; point
Q6 ; comment1
Z2 ; move to next (1)
Q6 ; comment1
X9 Y6 ; point
X4 Y2 ; point
X1 Y7 ; point
Q6 ; comment1
截至目前,我的脚本能够搜索文件并根据 ; 之后的注释执行操作,但我不确定如何删除其中的内容并替换它,而无需多次遍历整个文件.
看起来像这样:
要补充的东西:
A1 B4 ; point
A7 B3 ; point
A1 B7 ; point
所以脚本会搜索“Z1”的情况,然后是“Q6”,如果发生这种情况,将“X Y”部分替换为新的“A B”部分。编辑后的版本将如下所示:
Z1 ; move to next (0)
Q6 ; comment1
A1 B4 ; point
A7 B3 ; point
A1 B7 ; point
Q6 ; comment1
Z2 ; move to next (1)
Q6 ; comment1
X9 Y6 ; point
X4 Y2 ; point
X1 Y7 ; point
Q6 ; comment1
到目前为止,我的脚本是:
file_name = "/Users/path/to/file"
with open(file_name, 'r+') as f:
z_val = []
content = f.readlines()
for line in content:
coordinate_set = {}
if ';' in line:
if 'Z' in line:
try:
coord, comment = line.strip('\n').split(";")
for num in coord.split()[1:]:
if 'Z' in num:
z_val.append(num)
except:
pass
这可以很好地找到带有“Z1”的区域并将“1”值附加到列表中,但是我不确定如何编辑和替换该部分。对这些主题的一些研究使我认为我可能需要使用 enumerate 并寻求在部分列表中向后工作,因为我删除了我不想要的每一行,然后,一旦它位于部分的底部,写在新部分中。
是否有更简单或更有效的方法来做到这一点?提前谢谢!!!
【问题讨论】:
-
您不能就地编辑文件。将所有内容读入 Python 列表,修改列表,然后将其全部写回文件中。
-
@Barmar 那么您将只使用标准的列表理解函数,如 append、pop 等?
-
是的,就是这样。
-
更具体地说,您可以在文件中的任何位置写入,但不能删除行。
-
@Barmar 我正在将所有内容都读入列表中,但是我无法将其读入列表并保持相同的格式。我想我需要一个列表列表,以便每一行都保持正确的格式,但我不知道如何保持这种格式。
标签: python for-loop enumerate seek