Поиск, замена и объединение строк

#python #replace #find #string-concatenation

#python #заменить #Найти #строка-конкатенация

Вопрос:

Я просто заново (изучаю) python после более чем 5 лет бездействия; это не помогает, что я не был хорош в этом с самого начала, хотя… Вот что я пытаюсь сделать:

  1. найдите жало в файле и замените его другой строкой (G00 на G1)
  2. найдите все экземпляры, в которых строка начинается с определенной строки, и объедините с ней строку в конце
  3. Исходный файл aaaa.gcode остается нетронутым, и все изменения сохраняются в bbbb.gcode.

По отдельности оба набора кода работают так, как ожидалось. Я перепробовал множество разных способов добавления обоих наборов кода вместе, но ничего не работает.

Пример файла (C:gcodeaaaa.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:gcodeaaaa.gcode', 'r') as fin, open(r'C:gcodebbbb.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. Объединение строки — добавьте Z0.3, если строка начинается с G00
 Code:
    with open(r'C:gcodeaaaa.gcode', 'r') as fin, open(r'C:gcodebbbb.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:gcodeaaaa.gcode', 'r') as fin, open(r'C:gcodebbbb.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'
 

Комментарии:

1. Вместо того, чтобы сразу записывать строку, сохраните ее в переменной.

Ответ №1:

Вы пытаетесь выполнить .replace работу с дескриптором файла — это не имеет смысла, вы должны сделать это line , например:

 with open(r'C:gcodeaaaa.gcode', 'r') as fin, open(r'C:gcodebbbb.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 разделены.

Комментарии:

1. Спасибо! Я смог заставить его работать. Единственное, что мне пришлось изменить, это if line.startswith(‘G00’): на if line.startswith(‘G1’):

Ответ №2:

Вы не можете заменить из fout , вам нужно заменить содержимое строки. Также не имеет смысла, почему вы устанавливаете значение равно fout.replace('G00', 'G1') # newly added line . Попробуйте это:

 with open(r'C:gcodeaaaa.gcode', 'r') as fin, open(r'C:gcodebbbb.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)