Agent McMuffin
Agent McMuffin

Reputation: 43

replace function not working with list items

I am trying to use the replace function to take items from a list and replace the fields below with their corresponding values, but no matter what I do, it only seems to work when it reaches the end of the range (on it's last possible value of i, it successfully replaces a substring, but before that it does not)

    for i in range(len(fieldNameList)):
        foo = fieldNameList[i]
        bar = fieldValueList[i]
        msg = msg.replace(foo, bar)
        print msg

This is what I get after running that code

<<name>> <<color>> <<age>>

<<name>> <<color>> <<age>>

<<name>> <<color>> 18

I've been stuck on this for way too long. Any advice would be greatly appreciated. Thanks :)

Full code:

def writeDocument():
    msgFile = raw_input("Name of file you would like to create or write to?: ")
    msgFile = open(msgFile, 'w+')
    msg = raw_input("\nType your message here. Indicate replaceable fields by surrounding them with \'<<>>\' Do not use spaces inside your fieldnames.\n\nYou can also create your fieldname list here. Write your first fieldname surrounded by <<>> followed by the value you'd like to assign, then repeat, separating everything by one space. Example: \"<<name>> ryan <<color>> blue\"\n\n")
    msg = msg.replace(' ', '\n')
    msgFile.write(msg)
    msgFile.close()
    print "\nDocument written successfully.\n"

def fillDocument():
    msgFile = raw_input("Name of file containing the message you'd like to fill?: ")
    fieldFile = raw_input("Name of file containing the fieldname list?: ")

    msgFile = open(msgFile, 'r+')
    fieldFile = open(fieldFile, 'r')

    fieldNameList = []
    fieldValueList = []
    fieldLine = fieldFile.readline()
    while fieldLine != '':
        fieldNameList.append(fieldLine)
        fieldLine = fieldFile.readline()
        fieldValueList.append(fieldLine)
        fieldLine = fieldFile.readline()

    print fieldNameList[0]
    print fieldValueList[0]
    print fieldNameList[1]
    print fieldValueList[1]
    msg = msgFile.readline()

    for i in range(len(fieldNameList)):
        foo = fieldNameList[i]
        bar = fieldValueList[i]
        msg = msg.replace(foo, bar)
        print msg

    msgFile.close()
    fieldFile.close()



###Program Starts#####--------------------

while True==True:
    objective = input("What would you like to do?\n1. Create a new document\n2. Fill in a document with fieldnames\n")
    if objective == 1:
        writeDocument()
    elif objective == 2:
        fillDocument()
    else:
        print "That's not a valid choice."

Message file:

<<name>> <<color>> <<age>>

Fieldname file:

<<name>>
ryan
<<color>>
blue
<<age>>
18

Upvotes: 0

Views: 77

Answers (1)

Nipun Thennakoon
Nipun Thennakoon

Reputation: 3744

Cause:

This is because all lines except the last line read from the "Fieldname" file contains "\n" characters. So when the program comes to the replacing part fieldNameList , fieldValueList and msg looks like this:

fieldNameList = ['<<name>>\n', '<<color>>\n', '<<age>>\n']
fieldValueList = ['ryan\n', 'blue\n', '18']
msg = '<<name>> <<color>> <<age>>\n'

so the replace() function actually searches for '<<name>>\n','<<color>>\n','<<age>>\n' in msg string and only <<age>> field get replaced.(You must have a "\n" at the end of msg file, otherwise it won't be replaced as well).

Solution:

use rstrip() method when reading lines to strip the newline character at the end.

fieldLine = fieldFile.readline().rstrip()

Upvotes: 1

Related Questions