Coding

Python Learning: Automate Boring Stuff with Python | Chapter 8 : My Solution to Project Madlib

Creating MadLib:

 

It was quite a task to solve this problem but worth it. I learned how to retrieve command line arguments using sys module, regex to match and search for the keyword in a given string, and os to create new files and open files.  I think a step further would be to allowing the user provide the list of keywords dynamically (using input function), then using those keywords against the given text file.

The next task is Regex Search according to the book and I look forward to it.

Do provide your suggestions in the comment box below.

[sourcecode language=”python”]

#madlib : Scans text and replaces ADVERB, ADJECTIVE, NOUN and VERB with user values
#Usage python madlib.py <textfile>

import sys, re, os

keywords = ("adverb", "adjective", "noun", "verb")
#TODO: READ COMMAND LINE ARGUMENTS
if len( sys.argv ) == 2:
#TODO: CHECK VALIDITY OF TEXT PATH GIVEN
if os.path.exists( sys.argv[1] ):
#TODO: READ CONTENT OF FILE
textFile = open(os.path.abspath( sys.argv[1] ))
content = textFile.readlines()
textFile.close()
if len( content ) <= 0:
print("File is empty")
else:
#TODO: LOOP THROUGH KEYWORDS, ASK USER FOR REPLACEMENT AND SUBSTITUTE WORD
#get name of file
textFileName = os.path.basename( (os.path.abspath( sys.argv[1] )) )
textFileName = textFileName.split(".")

#create a new name for text file
textFilePath = os.path.join(os.path.dirname(
sys.argv[1] ),
"{}_updated.{}".format(textFileName[0], textFileName[1] )
)
textFile = open(os.path.abspath(textFilePath ), "w" )
textFile.write("")
textFile.close()
textFile = open(textFilePath, "a")
for line in content:
#loop over each line in content list
updateline = line
for keyword in keywords:
#loop over each keyword in keywords
#check for match of keyword in updateline
pattern = r"({}|{})".format( keyword.lower(), keyword.upper() )
reg = re.compile(pattern)
if reg.search(updateline):
#if ‘adverb’ is in the first line e.g.
#replace the word with user input
replWord = input("What word to replace {}: ".format( keyword ))
#check if user provided a replacement
if replWord:
#replace word
updateline = re.sub(pattern, replWord, updateline)
#if user did not provide leave the updateline unmodified
#if no match is found leave the updateline unmodified
#after each substitution of a key word, write the updateline in the textFile
textFile.write(updateline)
#when entire content is updated, close file
textFile.close()

else:
print("Given path does not exist")

textFile.close()
else:
print("Provide a text file path")

#TODO: PRINT RESULT AND UPDATE FILE WITH NEW CONTENT

[/sourcecode]

Please follow and like us:
0

Enjoy this blog? Please spread the word :)

error: Content is protected !!