在python中未提供所需的输出
这个程序应该读取一个名为year的输入文件。因此,如果用户键入198,则输出应给出其中包含198的所有年份,例如19811982等。 但是,产量也在增加199在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
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”
。空字符串是”
,不是因为两个引号是称为“空字符串”的神奇结构,而是因为它是一个字符串文字(由围绕某个文本的两个“
表示)它们之间没有任何内容。如果您想测试空字符串作为输入,请在输入提示下不写任何内容:)非常感谢您的解释。我根本没有想到这一点,我甚至没有认为空字符串根本不键入任何内容。现在,程序返回了原始输入文件,以便在一年内不键入任何内容。再次感谢。