在python中未提供所需的输出

在python中未提供所需的输出,python,Python,这个程序应该读取一个名为year的输入文件。因此,如果用户键入198,则输出应给出其中包含198的所有年份,例如19811982等。 但是,产量也在增加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 Afric

这个程序应该读取一个名为year的输入文件。因此,如果用户键入198,则输出应给出其中包含198的所有年份,例如19811982等。 但是,产量也在增加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
文件的每一行包含以下字段,字段之间有一个空格: 国家(50个字符) 收入水平(6个字符) 接种率(3个字符) 区域(25个字符) 年份(4个字符)。所以,我总共有92个字符,我正在浏览wards上88个字符中的每个字符,并将它们与年份中的字符进行匹配,以找到所需的年份。我想我的逻辑可能有一些错误,这也是以199为例的。我不应该使用列表或元组。归档就行了

以下是我对代码所做的操作:

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()
谁能看一下我的代码并指出问题所在吗?谢谢 下面是我正在处理的几行文件

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

正如我在评论中提到的,您提供的输入与您的描述不匹配。您的代码显示从索引
88
开始的
year
字段,但您提供的输入只有44个字符长。我从那里开始

编辑:这里是我将如何编写你的程序,因为你不能使用任何容器

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()
也就是说,我首先读取文件并将其写入一个
dict
。比如:

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)]
您现有的代码中也存在一些问题

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

如果我们总是在一次迭代后中断,为什么要在这里循环?当设置为True时,删除
,只需
尝试:除
外,不使用
中断
s。如果您需要在出现异常时停止程序,则只需执行
操作,但IOError:raise

您的输入与您所说的不匹配。这条线的长度只有44米。也就是说,我要做的第一件事是查看您的输入,以确保它们都是正确的。我要做的第二件事是看看是否存在某种可以拆分的输入分隔符,而不是依赖于字段宽度。如果没有,我会尽快开始分配变量。我对代码做了一些更改,它给了我正确的输出,但格式不正确。此外,如果我将year键入一个空字符串,如“”,我应该将原始输入文件复制到输出文件,我不知道如何编写包含空字符串的逻辑。我将很快写一些关于如何执行的内容。我不知道如何在此处附加文件。否则,为了更好的可视化,我会将输入文件附加到这里。对不起,我不能使用dict、list和tuple。我应该只处理文件。我应该早点提的。我道歉。顺便说一句,我没有提供任何意见。我唯一给出的是我的输出是什么样子的。等等……你是给它
'
作为输入,还是只是给它传递一个空字符串?您从未指定如何获取您的
year
输入……在我的代码中,我提示
year=input(“给我一年”)
。如果您运行我的代码,当它到达那里时,只需按enter键,不要输入两个引号。这不是空字符串,是两个引号!:D@cobra我认为您需要对
空字符串的含义进行一些基本的深入思考。当您输入年份时,您不会用引号将其括起来(例如,当它要求输入年份时,您不会输入
“198”
,您只需键入
198
),但当程序解释它时,它是一个带值的字符串
“198”
。空字符串是
,不是因为两个引号是称为“空字符串”的神奇结构,而是因为它是一个字符串文字(由围绕某个文本的两个
表示)它们之间没有任何内容。如果您想测试空字符串作为输入,请在输入提示下不写任何内容:)非常感谢您的解释。我根本没有想到这一点,我甚至没有认为空字符串根本不键入任何内容。现在,程序返回了原始输入文件,以便在一年内不键入任何内容。再次感谢。