【问题标题】:Find, Replace, and Concatenate strings查找、替换和连接字符串
【发布时间】:2021-03-14 14:23:13
【问题描述】:

我只是在 5 年以上不活动后重新(学习)python;虽然一开始我并不擅长,但这无济于事…… 这是我想要做的:

  1. 在文件中查找字符串并将其替换为另一个字符串(G00 和 G1)
  2. 查找行以特定字符串开头的所有实例,并在末尾连接一个字符串
  3. 原始文件 aaaa.gcode 保持不变,所有更改都保存到 bbbb.gcode。

两组代码都按预期工作。我尝试了很多不同的方法来将两组代码添加在一起,但没有任何效果。

示例文件(C:\gcode\aaaa.gcode)

# start of file
some text
other text

# more text
G00 X1 Y1
G00 X2 Y2
# other text
G00 X3 Y3
G00 X4 Y4

#end of file

对于最终结果,我想要:

# start of file
some text
other text

# more text
G1 X1 Y1 Z0.3
G1 X2 Y2 Z0.3
# other text
G1 X3 Y3 Z0.3
G1 X4 Y4 Z0.3

#end of file

示例代码/结果

  1. 查找替换 - G00 与 G1
Code:
    with open(r'C:\gcode\aaaa.gcode', 'r') as fin, open(r'C:\gcode\bbbb.gcode', 'w') as fout:
    for line in fin:
        if line.startswith('G00'):
            fout.write(line[:-1] + ' Z0.3' + '\r')
        else:
            fout.write(line)
Result:
# start of file
some text
other text

# more text
G1 X1 Y1
G1 X2 Y2
# other text
G1 X3 Y3
G1 X4 Y4

#end of file
  1. 连接字符串 - 如果行以 G00 开头,则添加 Z0.3
Code:
    with open(r'C:\gcode\aaaa.gcode', 'r') as fin, open(r'C:\gcode\bbbb.gcode', 'w') as fout:
        for line in fin:
            if line.startswith('G00'):
                fout.write(line[:-1] + ' Z0.3' + '\r')
            else:
                fout.write(line)
Result
# start of file
some text
other text

# more text
G00 X1 Y1 Z0.3
G00 X2 Y2 Z0.3
# other text
G00 X3 Y3 Z0.3
G00 X4 Y4 Z0.3

#end of file

我尝试了以下代码的各种分支,但总是收到以下错误消息:

with open(r'C:\gcode\aaaa.gcode', 'r') as fin, open(r'C:\gcode\bbbb.gcode', 'w') as fout:
    for line in fin:
        if line.startswith('G00'):
            fout.write(line[:-1] + ' Z0.3' + '\r')
            fout = fout.replace('G00', 'G1')   # newly added line
        else:
            fout.write(line)
AttributeError: '_io.TextIOWrapper' object has no attribute 'replace'

【问题讨论】:

  • 不要立即写入该行,而是将其保存到变量中。

标签: python replace find string-concatenation


【解决方案1】:

您正在尝试在文件句柄上执行 .replace - 这没有意义,您应该在 line 上执行此操作,例如:

with open(r'C:\gcode\aaaa.gcode', 'r') as fin, open(r'C:\gcode\bbbb.gcode', 'w') as fout:
    for line in fin:
        line = line.replace('G00', 'G1')
        if line.startswith('G00'):
            fout.write(line[:-1] + ' Z0.3' + '\r')
        else:
            fout.write(line)

另请注意,当且仅当行是\r-delimited 时,您的代码才能正常工作。

【讨论】:

  • 谢谢!我能够让它工作。我唯一需要改变的是 if line.startswith('G00'): 到 if line.startswith('G1'):
【解决方案2】:

你不能从fout替换,你需要替换该行的内容。您为什么要设置为等于fout.replace('G00', 'G1') # newly added line 也没有任何意义。试试这个:

with open(r'C:\gcode\aaaa.gcode', 'r') as fin, open(r'C:\gcode\bbbb.gcode', 'w') as fout:
    for line in fin:
        if line.startswith('G00'):
            fout.write(line[:-1] + ' Z0.3' + '\r')
            new_line = line('G00', 'G1')   # newly added line
            # I believe you're trying to add this new line to the document
            fout.write(new_line)
        else:
            fout.write(line)

【讨论】: