Python Forum

Full Version: Replace based on values in a file
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I have a file containing records with 4 values, eg:
1,Genesis,Gen,Gen
2,Eksodus,Eks,Exo
3,Levitikus,Lev,Lev
4,Numeri,Num,Num
5,Deuteronomium,Deut,Deu
6,Josua,Jos,Jos
7,Rigters,Rig,Jdg
8,Rut,Rut,Rth
9,1 Samuel,1 Sam,1Sa

I need to read these into an array and I then need to read a second file and in each record of this file replace occurrences of the 3rd field in the first file (Gen, Eks, Lev, Num, Deut etc.) with the first field (1,2,3, etc. followed by a fullstop, eg 1., 2., 3.).

So if the second has a record reading:

Ps. 19:3; Num 3:1........
This needs to be replaced by:
19.19:3; 4.3:1.....

How would I achieve this? I have just started learning Python, so I am really a novice.
Here is what I tried, but it does not seem to work.
# Convert
import codecs
import re
def FixXrefs(xref):
      global bookname
      global bookno
      lg.write("----- Entered function\n")
      instuff=xref
      otstuff=""
      n=len(bookname)
      for i in bookno:
          j=int(i)-1
          pattern = bookname[j]+" "
          replaceWith = i+"."
          lg.write("|"+pattern+"|"+replaceWith+"|\n")
          otstuff=instuff.replace(pattern, replaceWith)
      instuff=otstuff.replace(":", ".")
      return instuff
             
lg=open("log.txt", "w")
bookname=[]
bookno=[]
#set up bookname/bookno table
bn=codecs.open("Boeke.txt", "r", "utf-8")
while True:
      l=bn.readline()
      l.strip('\n')
      if ("" == l):
            lg.write("End of bookname/no file reached\n")
            break
      #parse string
      words = l.split(",")
      bookno.append(words[0])
      bookname.append(words[2])
bn.close()
# Now read the file to reformat
fn=codecs.open("Conv.txt", "r", "utf-8")
while True:
      irec=fn.readline()
      pline="INREC\n"+irec
      lg.write(pline)
      if ("" == irec):
        lg.write ("End of Conv file reached\n")
        break;
      nxref = FixXrefs(irec)
      pline="NXREF\n"+nxref
      lg.write(pline)
lg.close()
fn.close()
I would try re.sub. You might be able to do it with just one command, but "1 Sam" may cayse problems. This could also be done using str.replace(), but matching only complete words might be difficult.

Either way I would treat the file like one long string instead of a line at a time.