我整天都在努力寻求有关此问题的帮助,但是所有已提出的问题都没有解决我的问题,而我为帮助我解决该问题而提出的任何答案都导致未回答题。
按现在的样子,我的程序将CSV表示的MPG等级的值放入列表中。这些列表代表最大和最小MPG。一旦找到最大/最小MPG等级,我就会陷入困境。我需要能够打印出具有最小/最大MPG值的所有汽车。理想情况下,应该在打印说明下以缩进形式打印模型,以表示最大/最小里程数。
第9列(index [8])是CSV文件完成MPG评分的方式。品牌和模型分别在第2列和第3列中(分别在index [1]和index [2]中)。正如您将在代码中看到的那样,我尝试遍历列表并使用if语句拉取make / model,但这样做时不起作用。我不知道文件是否起作用,但是任何帮助将不胜感激。
# prints welcome screen, asks user what year they want vehicle data for, and asks user for file name to save vehicle data to
print("Welcome to EPA Mileage Calculator")
yearChoice = int(input("What year would you like to view data for? (2008 or 2009): "))
while yearChoice != 2008 and yearChoice != 2009:
print("Invalid input, please try again")
yearChoice = int(input("What year would you like to view data for? (2008 or 2009): "))
saveResults = input("Enter the filename to save results to: ")
def carData():
if yearChoice == 2008:
fileName = "epaVehicleData2008.csv"
elif yearChoice == 2009:
fileName = "epaVehicleData2009.csv"
fileIn = open(fileName, "r")
fileIn.readline()
minMPG = []
maxMPG = []
for line in fileIn:
line = line.strip()
dataList = line.split(",")
if dataList[0] not in ['VANS - PASSENGER TYPE', 'VANS - CARGO TYPE', 'TRUCK', 'MINIVAN - 4WD', 'MINIVAN - 2WD']:
minMPG.append(int(dataList[8]))
maxMPG.append(int(dataList[8]))
maximumMPG = max(maxMPG)
minimumMPG = min(minMPG)
fileOut = open(saveResults, "w")
print("EPA City MPG Calculator", "(" + str(yearChoice) + ")", file=fileOut)
print("---------------------------------", file=fileOut)
print("Maximum Mileage (city):", maximumMPG, file=fileOut)
for line in fileIn:
line = line.strip()
dataList = line.split(",")
if dataList[8] == maximumMPG:
print("\t", dataList[1], dataList[2], file=fileOut)
print("Minimum Mileage (city):", minimumMPG, file=fileOut)
for line in fileIn:
line = line.strip()
dataList = line.split(",")
if dataList[8] == minimumMPG:
print("\t", dataList[1], dataList[2], file=fileOut)
fileIn.close()
fileOut.close()
def complete():
print()
print("Operation Success! Mileage data has been saved to", saveResults)
print("Thanks, and have a great day!")
def main():
carData()
complete()
main()
答案 0 :(得分:1)
您只能通过以下方式打开输入文件:
fileIn = open(fileName, "r")
但是随后您尝试使用相同的文件句柄遍历文件中的行三遍。您有以下三个:
for line in fileIn:
由于您永远不会关闭并重新打开文件,并且您也不会做任何事情来寻找文件的开头,因此第二次和第三次此类迭代将永远不会做任何事情,因为您已经到达了文件末尾。文件。使用此构造不会导致文件指针重新缠绕,并且文件的内容不会在其他时间重复。
由于您感兴趣的打印语句位于文件的第二和第三次迭代中,因此不会产生任何新行(这些迭代块中的代码将永远不会被调用),因此,您的打印语句永远不会被调用且不会输出已生成。
要解决您的问题,如果这是代码唯一的问题,只需在文件的第二次和第三次迭代中的每行之前放置以下行:
f.seek(0)
返回文件的开头并第二次和第三次遍历内容。
为了提高效率,您可以阅读每一行一次并将其存储在列表中。然后,您可以每次遍历列表,而不必从文件中读取三次。您甚至可以只执行一次剥离和拆分,从而使代码更加高效。
我看到的另一个小逻辑错误是您在文件的第一次迭代中跳过了一行。我假设这是跳过文件开头的标题行。但是您不会在第二次和第三次迭代中执行此操作,因此,如果仅按照我的建议添加seek(),您将尝试将标头行作为数据行处理。这也可以通过将文件读入列表一次来解决。执行此操作时,您将跳过文件的第一行。如果除了添加seek()之外,不希望留下任何代码,则还应该在第二次和第三次迭代之前跳过第一行。