I have a text file with fields of names associated with numbers. The fields are separated by a blank line. The code should deliver the selected name and its associated fields. Here is my stacktrace:
1,Hospital_Records
2,Exit
Enter your choice: 1
Enter your first and last name: John Wilson
Name: John Wilson
Days in Hospital: 3
Daily Rate: 400.0
Service Charges: 1000.0
medication_Charges: 5987.22
Total Charges: 8187.22
Traceback (most recent call last):
File "E:/test_file_parse.py", line 63, in <module>
main()
File "E:/test_file_parse.py", line 29, in main
days_in_hospital = int(file.readline())
ValueError: invalid literal for int() with base 10: '\n'
I'm providing my code and the text file:
def main():
#create a bool variable to use as a flag
found = False
searchName=''
days_in_hospital=0
daily_rate=0.0
service_charge= 0.0
medication_charges= 0.0
choice=0
total_charges= 0.0
while choice!=2:
print("1,Hospital_Records")
print("2,Exit")
choice= int(input("Enter your choice: "))
if choice==1:
#Get the search value
searchName= input("Enter your first and last name: ")
file= open("c:\\Python34\HospitalRecords.txt", "r")
#Read the first record's name field
record = file.readline()
#Read the rest of the file
while record!='':
days_in_hospital = int(file.readline())
daily_rate = float(file.readline())
service_charge = float(file.readline())
medication_charges = float(file.readline())
total_charges = ((days_in_hospital * daily_rate) +
service_charge + medication_charges)
#strip the newline character from the record
record= record.rstrip('\n')
#determine if this record matches the search value
if record==searchName:
print("Name: " ,searchName)
print("Days in Hospital: " , days_in_hospital)
print("Daily Rate: " , daily_rate)
print("Service Charges: " , service_charge)
print("medication_Charges: " , medication_charges)
print("Total Charges: " ,total_charges)
print()
#set the found flag to True
found = True
elif choice==2:
print("You are successfully exited your program")
else:
print("Invalid entry")
#If the search value was not found in the file
#display a message
if not found:
print("That name was not found in the file.")
file.close()
main()
Here is the text file:
John Wilson
3
400.00
1000.00
5987.22
Charles Sanders
10
12000.34
2487.77
8040.66
Susan Sarandon
1
300.22
8463.88
12777.33
Mary Muffet
8
4976.55
4050.00
15839.20
Also, if I enter any name other than the first one which is John Wilson, I get the following error:
1,Hospital_Records
2,Exit
Enter your choice: 1
Enter your first and last name: Susan Sarandon
Traceback (most recent call last):
File "E:/test_file_parse.py", line 63, in <module>
main()
File "E:/test_file_parse.py", line 29, in main
days_in_hospital = int(file.readline())
ValueError: invalid literal for int() with base 10: '\n'
You had logic errors in your code that prevented a smooth interaction with the user. (Eg, your handling of the record name, the blank line between records, when the file was closed, etc.) I've reworked your logic, see if this gives you the result you're looking for:
FILE_NAME = r"c:\\Python34\HospitalRecords.txt"
def main():
choice = 0
while choice != 2:
print("1) Hospital_Records")
print("2) Exit")
choice = int(input("Enter your choice: "))
if choice == 1:
# create a bool variable to use as a flag
found = False
# Get the search value
searchName = input("Enter your first and last name: ")
file = open(FILE_NAME)
# Read the first record's name field
record_name = file.readline().rstrip('\n')
# Read the rest of the file
while record_name != '':
days_in_hospital = int(file.readline())
daily_rate = float(file.readline())
service_charge = float(file.readline())
medication_charges = float(file.readline())
# determine if this record matches the search value
if record_name == searchName:
print("Name: ", searchName)
print("Days in Hospital: ", days_in_hospital)
print("Daily Rate: ", daily_rate)
print("Service Charges: ", service_charge)
print("medication_Charges: ", medication_charges)
total_charges = ((days_in_hospital * daily_rate) + service_charge + medication_charges)
print("Total Charges: ", total_charges)
print()
# set the found flag to True
found = True
break
record_separator = file.readline()
# strip the newline character from the record
record_name = file.readline().rstrip('\n')
file.close()
if not found:
# If the search value was not found in the file
# display a message
print("That name was not found in the file.")
elif choice == 2:
print("You successfully exited the program.")
else:
print("Invalid entry!")
main()
You are reading your file line by line and the format assumed by the code does not match the actual file.
Your first readline() grabs the first line of the file ("John Wilson"), then in your loop you do 4 more readline() to get all the numbers on the following lines.
At this point, the next readline() will take line 6 of your file (the blank line "\\n"). This hasn't happened yet though. Assume the first record does not match your search as in your error case. The next readline() executed by your code is:
days_in_hospital = int(file.readline())
And it throws the error trying to make a integer out of a blank line. So what you need is an extra readline() in your loop to skip that blank line.
Second problem is that that your variable "record" isn't actually moved to the next line before the loop starts again. The second time your while loop is executed, record still equals "John Wilson".
So you could do something like this:
#determine if this record matches the search value
if record==searchName:
print("Name: " ,searchName)
print("Days in Hospital: " , days_in_hospital)
print("Daily Rate: " , daily_rate)
print("Service Charges: " , service_charge)
print("medication_Charges: " , medication_charges)
print("Total Charges: " ,total_charges)
print()
#set the found flag to True
found = True
else:
file.readline() #skip the blank line
record = file.readline() #read the next record
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.