为汽车程序打印相应的CSV /列表值的代码根本不打印任何内容

时间:2019-03-24 22:38:26

标签: python

我整天都在努力寻求有关此问题的帮助,但是所有已提出的问题都没有解决我的问题,而我为帮助我解决该问题而提出的任何答案都导致未回答题。

按现在的样子,我的程序将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()

1 个答案:

答案 0 :(得分:1)

您只能通过以下方式打开输入文件:

fileIn = open(fileName, "r")

但是随后您尝试使用相同的文件句柄遍历文件中的行三遍。您有以下三个:

for line in fileIn:

由于您永远不会关闭并重新打开文件,并且您也不会做任何事情来寻找文件的开头,因此第二次和第三次此类迭代将永远不会做任何事情,因为您已经到达了文件末尾。文件。使用此构造不会导致文件指针重新缠绕,并且文件的内容不会在其他时间重复。

由于您感兴趣的打印语句位于文件的第二和第三次迭代中,因此不会产生任何新行(这些迭代块中的代码将永远不会被调用),因此,您的打印语句永远不会被调用且不会输出已生成。

要解决您的问题,如果这是代码唯一的问题,只需在文件的第二次和第三次迭代中的每行之前放置以下行:

f.seek(0)

返回文件的开头并第二次和第三次遍历内容。

为了提高效率,您可以阅读每一行一次并将其存储在列表中。然后,您可以每次遍历列表,而不必从文件中读取三次。您甚至可以只执行一次剥离和拆分,从而使代码更加高效。

我看到的另一个小逻辑错误是您在文件的第一次迭代中跳过了一行。我假设这是跳过文件开头的标题行。但是您不会在第二次和第三次迭代中执行此操作,因此,如果仅按照我的建议添加seek(),您将尝试将标头行作为数据行处理。这也可以通过将文件读入列表一次来解决。执行此操作时,您将跳过文件的第一行。如果除了添加seek()之外,不希望留下任何代码,则还应该在第二次和第三次迭代之前跳过第一行。