【问题标题】:Python For Loop Search and replacePython For 循环搜索和替换
【发布时间】: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


【解决方案1】:

这是您的代码的重组版本,它将每个 Z 后面的数字写入一个新文件。如果您真的需要,您可以在处理后写入同一个文件。但写入新文件通常是个好主意。

all_z_vals = []
with open(file_name, 'r') as f:
    for line in f.readlines():
        if line[0] == 'Z' and ';' in line:
            z_str, comment = line.split(';')
            z_num = z_str[1:].rstrip()  # rstrip removes right hand side whitespace
            all_z_vals.append(z_num)

with open('my_z_values.txt', 'w') as outfile:
    outfile.writelines(all_z_vals)

旁注:避免使用 try-except,它会在准备捕获异常时导致性能下降(在这种情况下可以避免)。

【讨论】:

  • try-except 来自以前的版本,它混合了 ;和 () 用于评论,它需要 try-except,但此后已被淘汰。我对这种方法的问题是:如果 'Z1' 不在行 [0] 上怎么办?这些部分的格式严格,但长度可能不完全相同。此外,我的“Z”值是部分开始/结束的触发器,但“X Y”是实际需要修改的部分。
  • 只是一个前言:line 是一个字符串。所以line[0] 是char,所以'Z' 是唯一找到的位,而不是'Z1'。当该行不以“Z”开头时,它会忽略该行
  • 哦!所以你正在使用Z 行来确定何时开始捕获输入?为什么不忽略不以A<n> B<n>开头的行
猜你喜欢
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2011-09-22
  • 1970-01-01
相关资源
最近更新 更多