我有一个文本文件,其中包含与数字相关联的名称字段。字段由空行分隔。代码应提供所选名称及其相关字段。这是我的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'
我提供了我的代码和文本文件:
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()的
这是文本文件:
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
另外,如果我输入的是除John Wilson之外的任何名字,我会收到以下错误:
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'
答案 0 :(得分:0)
您的代码中存在逻辑错误,导致无法与用户进行流畅的交互。 (例如,您对记录名称的处理,记录之间的空行,文件关闭时等)我已经重新设计了您的逻辑,看看这是否能为您提供所需的结果:
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()
答案 1 :(得分:0)
您正在逐行读取文件,并且代码所采用的格式与实际文件不匹配。
你的第一个readline()抓住文件的第一行(“John Wilson”),然后在你的循环中再做4个readline()以获得以下行中的所有数字。
此时,下一个readline()将占用文件的第6行(空行“\ n”)。但这还没有发生。假设第一条记录与您的错误案例中的搜索不匹配。您的代码执行的下一个readline()是:
days_in_hospital = int(file.readline())
它会抛出错误,尝试从空行中生成一个整数。所以你需要的是循环中的额外readline()跳过该空白行。
第二个问题是,在循环再次启动之前,您的变量“record”实际上并未移动到下一行。第二次执行while循环时,记录仍然等于“John Wilson”。
所以你可以这样做:
#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