简体   繁体   中英

Not giving desired output in python

this program is supposed to read an input file that has a category called year. So, if the user types 198, the output should give all the years having 198 in it eg 1981,1982,...etc. But, the output is also picking up 199

Sierra Leone       WB_LI    0 Africa    1992
Sierra Leone       WB_LI    0 Africa    1993
Sierra Leone       WB_LI    0 Africa    1994
Sierra Leone       WB_LI    0 Africa    1995
Sierra Leone       WB_LI    0 Africa    1996
Sierra Leone       WB_LI    0 Africa    1997

Each line of the file contains the following fields, where there is one space between fields: Country (50 characters) Income Level (6 characters) Percent Vaccinated (3 characters) Region (25 characters) Year (4 characters). So, altogether I have 92 characters and I am going through each characters from 88 on wards and matching them with characters in year to find the desired year. I think I probably have some error in my logic and that is also considering 199 as an instance. I am not supposed to use list or tuple. Just file.

Here is what i have done with my code:

def main():

    #checks if the input file exists or not.
    #If the file exists, then the program breaks out of the loop and
    #moves on. Otherwise, the program halts with an IOError message. 
    while True:
        try:
            input_file=open('measles.txt','r')
            break
        except IOError:
            print("Error opening file:",input_file)
            break

    f2=input("What is the name of the output file? ")

    #checks if the output file exists or not.
    #If the file exists, then the program breaks out of the loop and
    #moves on. Otherwise, the program halts with an IOError message. 
    while True:
        try:
            output_file=open(f2,'w')
            break
        except IOError:
            print("Error opening file:",output_file)
            break

    #for loop prints all lines of the input file to the output file.
 year=str(input('Input year: '))
    line=input_file.readline().strip()

    while line!="":
        for line in input_file:

            if year==line[88:92]:
                output_file.write(line)            
            elif year==line[88:91]:
                output_file.write(line)
            elif year==line[88:90]:
                output_file.write(line) 
            elif year==line[88:89]:
                output_file.write(line)            
            elif year.lower()=="all" or year=="''" or year=='""':
                print(line)

        line=input_file.readline().strip()


    input_file.close()
    output_file.close()

main()

Could anyone please take a look at my code and point out the problem? Thanks Here is a few lines of the file that I am dealing with.

Afghanistan                                        WB_LI   11 Eastern Mediterranean     1980
Afghanistan                                        WB_LI    0 Eastern Mediterranean     1981
Afghanistan                                        WB_LI    8 Eastern Mediterranean     1982
Afghanistan                                        WB_LI    9 Eastern Mediterranean     1983
Afghanistan                                        WB_LI   14 Eastern Mediterranean     1984
Afghanistan                                        WB_LI   14 Eastern Mediterranean     1985
Afghanistan                                        WB_LI   14 Eastern Mediterranean     1986
Afghanistan                                        WB_LI   31 Eastern Mediterranean     1987
Afghanistan                                        WB_LI   34 Eastern Mediterranean     1988
Afghanistan                                        WB_LI   22 Eastern Mediterranean     1989
Afghanistan                                        WB_LI   20 Eastern Mediterranean     1990
Afghanistan                                        WB_LI   19 Eastern Mediterranean     1991
Afghanistan                                        WB_LI   22 Eastern Mediterranean     1992
Afghanistan                                        WB_LI   25 Eastern Mediterranean     1993
Afghanistan                                        WB_LI   40 Eastern Mediterranean     1994
Afghanistan                                        WB_LI   41 Eastern Mediterranean     1995
Afghanistan                                        WB_LI   42 Eastern Mediterranean     1996
Afghanistan                                        WB_LI   38 Eastern Mediterranean     1997
Afghanistan                                        WB_LI   31 Eastern Mediterranean     1998
Afghanistan                                        WB_LI   31 Eastern Mediterranean     1999
Afghanistan                                        WB_LI   27 Eastern Mediterranean     2000
Afghanistan                                        WB_LI   37 Eastern Mediterranean     2001
Afghanistan                                        WB_LI   35 Eastern Mediterranean     2002
Afghanistan                                        WB_LI   39 Eastern Mediterranean     2003
Afghanistan                                        WB_LI   48 Eastern Mediterranean     2004
Afghanistan                                        WB_LI   50 Eastern Mediterranean     2005
Afghanistan                                        WB_LI   53 Eastern Mediterranean     2006
Afghanistan                                        WB_LI   55 Eastern Mediterranean     2007
Afghanistan                                        WB_LI   59 Eastern Mediterranean     2008
Afghanistan                                        WB_LI   60 Eastern Mediterranean     2009
Afghanistan                                        WB_LI   62 Eastern Mediterranean     2010
Afghanistan                                        WB_LI   65 Eastern Mediterranean     2011
Afghanistan                                        WB_LI   68 Eastern Mediterranean     2012
Albania                                            WB_LMI  90 Europe                    1980
Albania                                            WB_LMI  90 Europe                    1981
Albania                                            WB_LMI  93 Europe                    1982
Albania                                            WB_LMI  96 Europe                    1983
Albania                                            WB_LMI  96 Europe                    1984
Albania                                            WB_LMI  96 Europe                    1985
Albania                                            WB_LMI  96 Europe                    1986
Albania                                            WB_LMI  96 Europe                    1987
Albania                                            WB_LMI  96 Europe                    1988
Albania                                            WB_LMI  96 Europe                    1989
Albania                                            WB_LMI  88 Europe                    1990
Albania                                            WB_LMI  80 Europe                    1991
Albania                                            WB_LMI  87 Europe                    1992
Albania                                            WB_LMI  76 Europe                    1993
Albania                                            WB_LMI  90 Europe                    1994
Albania                                            WB_LMI  91 Europe                    1995
Albania                                            WB_LMI  92 Europe                    1996
Albania                                            WB_LMI  95 Europe                    1997
Albania                                            WB_LMI  89 Europe                    1998
Albania                                            WB_LMI  85 Europe                    1999
Albania                                            WB_LMI  95 Europe                    2000
Albania                                            WB_LMI  95 Europe                    2001
Albania                                            WB_LMI  96 Europe                    2002
Albania                                            WB_LMI  93 Europe                    2003

As I mentioned in a comment, the input you provided doesn't match your description thereof. Your code shows the year field starting at index 88 , but your provided input is only 44 characters long. I'd start there.

EDIT: here is how I would write your program, given you can't use any containers.

def filter_results(input_file, output_file, year):
    for line in input_file:
        if not line: continue # skips if the line is blank
        if year == '' or line[88:92].startswith(year) or year.lower() == 'all':
            output_file.write(line+"\n")

def main():
    year = input("Give me a year: ")

    try: infile = open('measles.txt','r')
    except IOError: print("Error opening file: measles.txt")

    try: outfile = open(input("Name of output file?"),'w')
    except IOError: print("Error opening output file")

    try: infile,outfile
    except NameError: raise IOError("One of the files could not be opened")

    filter_results(infile,outfile,year)

    outfile.close()
    infile.close()

main()

That said, I'd begin by reading in the file and writing it to a dict . Something like:

lines = list()
with open('path/to/input_file') as input_file:
    for line in input_file:
        lines.append(
            {"country":line[0:51].strip(),
            "income":line[52:58].strip(),
            "vaccinated":line[59:62].strip(),
            "region":line[63:88].strip(),
            "year":line[89:93].strip()}
        # I may have screwed up that string splicing -- do one and doublecheck
year = input("Enter a four-digit year (or part thereof): ")
filtered_list = [line for line in lines if line['year'].startswith(year)]

Also there are some problems in your existing code.

while True:
    try:
        input_file = open("measles.txt")
        break # ?
    except IOError:
        print("Error opening file:",input_file)
        break # ?

Why are we looping here if we're ALWAYS breaking after one iteration? Drop the while True and just try:except without the break s. If you need to halt the program on exception, then just do except IOError: raise

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM