Я столкнулся с проблемой при использовании команд fileinput.input () и str.replace. У меня есть файл с контентом A и контентом B (см. Image1.png). Для каждой строки, которая начинается с <part center_x=
, мне нужно заменить значение center_x и center_y . С этой целью я написал python скрипт, который пытается сделать именно это. Для достижения sh этого я использую Spyder 3.3.6 (из Ananconda3) и Python 3.7. Лог c скрипта:
- Создать копию файла, содержимое которого будет заменено
- Открыть эту копию с помощью fileinput.input ()
- Ищите строки текста, которые начинаются с указанных c строк. Если найдено, замените символы в этой строке (например, если найден
<part center_x=
, я хочу, чтобы python заменил значения center_x = и center_y = ) - Если соответствующая строка текста не найдена, сценарий не будет выполнять никаких операций, кроме перезаписи этой строки текста в скопированный файл.
К сожалению, str.replace не работает как я хочу - он либо заменяет символы мусором, либо не заменяет их вообще. То, что в итоге происходит, показано в image2.png (файл в RHS - это ОРИГИНАЛЬНЫЙ файл). В идеале, это результат, который мне нужен:
- Строка 806: эта строка должна читать center_x = 2000 и center_y = 2000
- Линии 808, 811, 814 и 817: center_y значения для этих линий должны быть постоянными (= 100), тогда как значения для center_x для этих линий должны начинаться с 100 и с шагом 100, заканчивающимся на 400. Это поведение отражено в строках 820, 823 и 826. Я не понимаю, почему str.replace корректно меняет эти символы, но не в состоянии это сделать для строк 808, 811, 814 и 817
- Строка 814: значение o_id изменяется, когда я специально не просил Python изменить его. Я не понимаю, почему это происходит. Пожалуйста, найдите мой python код ниже.
Пожалуйста, дайте мне знать, если мне нужно поделиться чем-то еще / если я не следовал лучшим методам переполнения стека при задании вопросов
# -*- coding: utf-8 -*-
"""
Delete all generated variables before re-running this script using reset -f at the iPython console prompt
As long as the *.gtm file is a text file, this code is independent of GT version
It depends on the following HTML-type tags
-- <assembly_table>
-- <part_table> & </part_table>
-- <port_link_table> & </port_link_table>
-- <main size_x=
-- <part center_x=
This code was built using Python 3.7 from the Anaconda 3 installation
Run this rearrangement code immediately after converting GEM3D to GTISE
I do not know how this code will affect files for which
the map is already rearranged in a more or less structured form
if using Python 3.x, use 'range'
if using < Python 3.x, use 'xrange'
"""
## import block
import re, os, fileinput, sys
from shutil import copyfile
## User input area
fileName = "emptyTest.gtm"
pathToFile = os.path.join("C:\\Users\\koko\\Desktop")
# Check for file existence
if(os.path.exists(os.path.join(pathToFile, fileName))):
src = os.path.join(pathToFile, fileName)
dst = os.path.join(pathToFile, "deleteAfterUse_" + fileName + ".txt")
copyfile(src, dst)
finput = fileinput.FileInput(os.path.join(pathToFile, "deleteAfterUse_" + fileName + ".txt"), inplace=True)
colFlag = 1
rowFlag = 1
for line in finput:
# Change the map size to be 2000 x 2000
if(line.strip().startswith('<main size_x=')):
mapSize_X = 2000
mapSize_Y = mapSize_X
temp1 = re.findall(r'\d+', line.strip())
sys.stdout.write(line.replace(temp1[0], str(mapSize_X)).replace(temp1[1], str(mapSize_Y)))
#end
elif(line.strip().startswith('<part center_x=')):
temp2 = re.findall(r'\d+', line)
if colFlag%5 == 0:
rowFlag = rowFlag + 1
colFlag = 1
#end
# sys.stdout.write("ORG row = {}; ORG column = {}\n".format(temp2[0], temp2[1]))
# sys.stdout.write("Row = {}; Column = {}\n".format(str(100*colFlag), str(100*rowFlag)))
sys.stdout.write(line.replace(temp2[0], str(100*colFlag)).replace(temp2[1], str(100*rowFlag)))
# print("Location of {} = {} , {}".format(temp2[2], temp2[0], temp2[1])) '
colFlag = colFlag + 1
#end
else:
sys.stdout.write(line)
#end
#end
finput.close()