解析文本文件时出错 - Python

时间:2016-04-14 21:01:49

标签: python parsing

我有一个文本文件,其中包含与数字相关联的名称字段。字段由空行分隔。代码应提供所选名称及其相关字段。这是我的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'

2 个答案:

答案 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