Dan Clark
Dan Clark

Reputation: 1

Find items in a text file that is a incantinated string of capitalized words that begin with a certain capital letter in python

I am trying to pull a string of input names that get saved to a text file. I need to pull them by capital letter which is input. I.E. the saved text file contains names DanielDanClark, and I need to pull the names that begin with D. I am stuck at this part

for i in range(num):

    print("Name",i+1," >> Enter the name:")
    n=input("")
    names+=n          
file=open("names.txt","w")
file.write(names)
lookUp=input("Did you want to look up any names?(Y/N)")
x= ord(lookUp)
if x == 110 or x == 78:
    quit()
else:
    letter=input("Enter the first letter of the names you want to look up in uppercase:")
    file=open("names.txt","r")
    fileNames=[]
    file.list()
    for letter in file:
        fileNames.index(letter)
    fileNames.close()

I know that the last 4 lines are probably way wrong. It is what I tried in my last failed attempt

Upvotes: 0

Views: 42

Answers (1)

Edwin van Mierlo
Edwin van Mierlo

Reputation: 2488

Lets break down your code block by block

num = 5
names = ""
for i in range(num)
    print("Name",i+1," >> Enter the name:")
    n=input("")
    names+=n

I took the liberty of giving num a value of 5, and names a value of "", just so the code will run. This block has no problems. And will create a string called names with all the input taken. You might consider putting a delimiter in, which makes it more easier to read back your data. A suggestion would be to use \n which is a line break, so when you get to writing the file, you actually have one name on each line, example:

num = 5
names = ""
for i in range(num)
    print("Name",i+1," >> Enter the name:")
    n = input()
    names += n + "\n"  

Now you are going to write the file:

file=open("names.txt","w")
file.write(names)

In this block you forget to close the file, and a better way is to fully specify the pathname of the file, example:

file = open(r"c:\somedir\somesubdir\names.txt","w")
file.write(names)
file.close()

or even better using with:

with open(r"c:\somedir\somesubdir\names.txt","w") as openfile:
    openfile.write(names)

The following block you are asking if the user want to lookup a name, and then exit:

lookUp=input("Did you want to look up any names?(Y/N)")
x= ord(lookUp)
if x == 110 or x == 78:
    quit()

First thing is that you are using quit() which should not be used in production code, see answers here you really should use sys.exit() which means you need to import the sys module. You then proceed to get the numeric value of the answer being either N or n and you check this in a if statement. You do not have to do ord() you can use a string comparisson directly in your if statement. Example:

lookup = input("Did you want to look up any names?(Y/N)")
if lookup.lower() == "n":
    sys.exit()

Then you proceed to lookup the requested data, in the else: block of previous if statement:

else:
    letter=input("Enter the first letter of the names you want to look up in uppercase:")
    file=open("names.txt","r")
    fileNames=[]
    file.list()
    for letter in file:
        fileNames.index(letter)
    fileNames.close()

This is not really working properly either, so this is where the delimiter \n is coming in handy. When a text file is opened, you can use a for line in file block to enumerate through the file line by line, and with \n delimiter added in your first block, each line is a name. You also go wrong in the for letter in file block, it does not do what you think it should be doing. It actually returns each letter in the file, regardless of whay you type in the input earlier. Here is a working example:

letter = input("Enter the first letter of the names you want to look up in uppercase:")
result = []
with open(r"c:\somedir\somesubdir\names.txt", "r") as openfile:
    for line in openfile:  ## loop thru the file line by line
        line = line.strip('\n')  ## get rid of the delimiter
        if line[0].lower() == letter.lower():  ## compare the first (zero) character of the line 
            result.append(line)  ## append to result
print(result)  ## do something with the result

Putting it all together:

import sys

num = 5
names = ""
for i in range(num)
    print("Name",i+1," >> Enter the name:")
    n = input("")
    names += n + "\n"          

with open(r"c:\somedir\somesubdir\names.txt","w") as openfile:
    openfile.write(names)

lookup = input("Did you want to look up any names?(Y/N)")
if lookup.lower() == "n":
    sys.exit()

letter = input("Enter the first letter of the names you want to look up in uppercase:")
result = []
with open(r"c:\somedir\somesubdir\names.txt", "r") as openfile:
    for line in openfile:  
        line = line.strip('\n') 
        if line[0].lower() == letter.lower():  
            result.append(line) 
print(result)  

One caveat I like to point out, when you create the file, you open the file in w mode, which will create a new file every time, therefore overwriting the a previous file. If you like to append to a file, you need to open it in a mode, which will append to an existing file, or create a new file when the file does not exist.

Upvotes: 1

Related Questions