upulps
upulps

Reputation: 11

Text file value replace in python

I am trying to replace text value as below. I have 2 text file

1 - input.txt

abc = 123
xyz = 456
pqr = 789

2 - content.txt

AAA = abc
XXX = xyz
PPP = pqr  

now I need to read the input.txt file and replace value on content.txt file with input.txt values and get the below output file.

3 - new.txt

AAA = 123
XXX = 456
PPP = 789 

How can I do this ?

Upvotes: 0

Views: 100

Answers (4)

solstice333
solstice333

Reputation: 3649

import re

class Defs:
   def __init__(self, defs_file):
      self._defs = {}
      with open(defs_file) as df:
         line_num = 0
         for l in df:
            line_num += 1
            m = re.match(r'\s*(\w+)\s*=\s*(\S+)\s*', l)
            assert m, \
               "invalid assignment syntax with \"{}\" at line {}".format(
                  l.rstrip(), line_num)
            self._defs[m.group(1)] = m.group(2)

   def __getitem__(self, var):
      return self._defs[var]

   @property
   def dict(self):
      return self._defs

class Replacer:
   def __init__(self, defs):
      self._defs = defs

   def replace_with_defs(self, context_file, output_file):
      with open(context_file) as context, open(output_file, 'w') as output:
         for line in context:
            string_repl = re.sub(r'\b(\w+)\b', 
               lambda m: self._defs.dict.get(m.group(1)) or m.group(1), line)
            output.write(string_repl)

def main():
   defs = Defs('input.txt')
   repl = Replacer(defs)
   repl.replace_with_defs('context.txt', 'output.txt')

if __name__ == '__main__':
   main()

To describe what's going on above, the Defs class takes a defs_file which is the input.txt assignments and stores them in a dict binding each variable name to the associated value. The Replacer class handles takes a Defs object and uses those to iterate over each line in the context_file i.e. context.txt and replaces any token (assuming the token is a variable name) with the value associated with it, specified within the Defs object, and writes this out to a file output_file i.e. output.txt. If the token doesn't exist in the Defs object as a valid variable name, it defaults to the write the token as is.

Upvotes: 0

Reck
Reck

Reputation: 1436

This may help you,

_input = {}
with open('input.txt', 'r') as f:
    s = f.read()
    _input = dict((a.split(' = ')[0], int(a.split(' = ')[1])) for a in s.split('\n'))

_content = {}
with open('content.txt', 'r') as f:
    s = f.read()
    _content = dict((a.split(' = ')[0], a.split(' = ')[1]) for a in s.split('\n'))

for key in _content:
    _content[key] = _input[_content[key]]

Result:

In [18]: _content
Out[19]: {'AAA': 123, 'PPP': 789, 'XXX': 456}

Upvotes: 1

DZurico
DZurico

Reputation: 617

How about using pandas: It's shorter, easier to read and faster when using large files.

import pandas as pd
import numpy as np

input=pd.read_csv("input.txt",sep="=",header=None,usecols=[1])
content=pd.read_csv("content.txt",sep="=",header=None,usecols=[0])
foo=np.hstack(([content.values,input.values]))
new=pd.DataFrame(foo)
new.to_csv("new.txt",index=False,sep="=",header=None)

Upvotes: 0

Anuj
Anuj

Reputation: 1014

First read the contents of the file into 2 arrays in the following way

file1handle = open('filename1', 'r')
file1 = file1handle.readlines()
file2handle = open('filename2', 'r')
file2 = file2handle.readlines()
file2handle.close()
file2handle.close()

Then iterate over the contents and try finding the match with variable names and assignments and put the values into third array in following way

for item in file1:
     name, value = item.split(' = ')
     for item2 in file2:
         name2, assignment = item2.split(' = ')
         #Here we are trying to check which name is to be assigned which value    
         if assignment == name:
             val = name2+'='+value
             file3.append(val)

Then write the contents into file in following way

filehandle3 = open('filename3', 'w')
for line in file3:
    filehandle3.write(line)
filehandle3.close()

Upvotes: 1

Related Questions