#python #replace #find #string-concatenation
#python #заменить #Найти #строка-конкатенация
Вопрос:
Я просто заново (изучаю) python после более чем 5 лет бездействия; это не помогает, что я не был хорош в этом с самого начала, хотя… Вот что я пытаюсь сделать:
- найдите жало в файле и замените его другой строкой (G00 на G1)
- найдите все экземпляры, в которых строка начинается с определенной строки, и объедините с ней строку в конце
- Исходный файл 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
Пример кода / результат
- найти заменить — 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
- Объединение строки — добавьте 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)