Замена текста на месте в файле ASCII - PullRequest
1 голос
/ 25 марта 2020

Я столкнулся с проблемой при использовании команд 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 скрипта:

  1. Создать копию файла, содержимое которого будет заменено
  2. Открыть эту копию с помощью fileinput.input ()
  3. Ищите строки текста, которые начинаются с указанных c строк. Если найдено, замените символы в этой строке (например, если найден <part center_x=, я хочу, чтобы python заменил значения center_x = и center_y = )
  4. Если соответствующая строка текста не найдена, сценарий не будет выполнять никаких операций, кроме перезаписи этой строки текста в скопированный файл.

К сожалению, 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()

Screenshot of text file which is fed as input to Python script - content A is more important than content B. Hence needs modification

Difference between expected output (LHS) and input (RHS)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...