Чтение из файла, сохранение значений и математические операции

#python #file-io

#python #file-io

Вопрос:

Я пытаюсь прочитать из файла, который содержит названия городов, показания одометра и количество оставшегося топлива. Содержимое текстового файла:

 Kennewick 97840.4 40.0<br>
Benton_City 97861.3 37.6<br>
Prosser 97878.2 35.9<br>
Grandview 97886.5 35.0<br>
Sunnyside 97894.6 34.1<br>
Granger 97904.6 33.1<br>
Toppenish 97913.0 32.2<br>
Wapato 97921.7 31.3<br>
Union_Gap 97931.6 30.4<br>
Yakima 97935.2 30.0<br>
Selah 97939.4 29.6<br>
Ellensburg 97972.7 26.0<br>
Thorp 97981.1 25.1<br>
Rosyln 98002.8 22.6<br>
Easton 98016.1 21.1<br>
North_Bend 98058.1 16.9<br>
Preston 98067.7 16.0<br>
Issaquah 98073.6 15.4<br>
East_Gate 98082.9 14.4<br>
Mercer_Island 98088.5 13.7<br>
Seattle 98095.4 13.0<br>
  

Частью назначения является вычитание текущего считывания из последнего считывания (оба этих значения хранятся в переменной miles).

 def BusRoute():
    path = "C:\"
    ext = ".txt"

    lines = ""
    stopname = ""
    miles = 0
    prevmiles = 0
    milest = 0
    fuel = 0.0
    mpg = 0.0
    i = 0

    filename = input("Please enter the file name. The file path [C:...] and extension [*.txt] is not required: ")

    inFile = open(path   filename   ext, "r")

    for lines in inFile:
        stopname, miles, fuel = lines.split(" ")

        miles = float(miles)
        fuel = float(fuel)

        prevmiles = miles

        milest = miles - prevmiles

        miles  = 1

        print("Since last stop:", float(milest), "miles")
  

Моя проблема в том, что я пытаюсь сохранить последнее прочитанное значение miles в вызываемой переменной prevmiles , а затем вычесть prevmiles (последнее прочитанное значение пробега) из ТЕКУЩЕГО значения miles , но оно продолжает вычитать текущее miles значение из текущего miles , очевидно, делая значение, которое я хочу распечатать, равным 0.0.

Ответ №1:

У вас есть

 prevmiles = miles

milest = miles - prevmiles
  

что гарантирует, что наименьшее значение будет равно 0. Попробуйте просто изменить порядок этих двух строк.

Комментарии:

1. Итак, я попробовал это только сейчас, и он выводит первое «С момента последней остановки: -97840,4 мили», и все равно выводит 0.0 для остальных.

Ответ №2:

Здесь происходят две вещи:

  1. вам нужно инициализировать stopname , prevmiles , и fuel первой строкой файла, и
  2. вам нужно поменять местами две строки, в которых вы назначаете miles prevmiles .

Вот обновленная функция:

 def BusRoute():
    path = "C:\"
    ext = ".txt"

    lines = ""
    stopname = ""
    miles = 0
    prevmiles = 0
    milest = 0
    fuel = 0.0
    mpg = 0.0
    i = 0

    filename = input("Please enter the file name (no extension)").strip()

    inFile = open(path   filename   ext, "r")

    stopname, prevmiles, fuel = inFile.readline().split()
    prevmiles = float(prevmiles)
    fuel = float(fuel)

    for lines in inFile:
        stopname, miles, fuel = lines.split(" ")

        miles = float(miles)
        fuel = float(fuel)

        milest = miles - prevmiles

        prevmiles = miles

        miles  = 1

        print("Since last stop:", float(milest), "miles")
  

Комментарии:

1. Большое вам спасибо. Этот код работал; все, что я с ним сделал, это немного изменил его, чтобы он соответствовал согласованному формату для остальных моих программ.

Ответ №3:

Вы должны просто изменить порядок операций. Сначала выполните вычитание, а затем присвоите значение prevmiles .

Комментарии:

1. Я думаю, что то, что вы говорите, похоже на то, что ответил другой человек, но пока это работает не совсем так, как мне нужно. Для первого он показывает «С момента последней остановки: -97840,4 мили», а для остальных по-прежнему выводит 0.0.

Ответ №4:

Я переключил две строки и получил то, что, как я думаю, вы ищете.

 prevmiles = miles

milest = miles - prevmiles
  

Примечание — Этот код предназначен для Python 2.5.4, поэтому синтаксис изменяется в нескольких частях, и из
-за того, что в конце строки плавающие значения для fuel выдавали ошибки, поэтому я прокомментировал это.

 def BusRoute():
    path = "C:\"
    ext = ".txt"

    lines = ""
    stopname = ""
    miles = 0
    prevmiles = 0
    milest = 0
    fuel = 0.0
    mpg = 0.0
    i = 0

    filename = raw_input("Please enter the file name. The file path [C:...] and extension [*.txt] is not required: ") #raw_input for text in Python 2.5

    inFile = open(path   filename   ext, "r")

    for lines in inFile:
        stopname, miles, fuel = lines.split(" ")

        miles = float(miles)
        ##fuel = float(fuel) (Gives me an error message)

        milest = miles - prevmiles

        prevmiles = miles            

        miles  = 1

        print "Since last stop:", float(milest), "miles" #Print syntax is different in Python 2.5

BusRoute()
  

Выдает результат:

 Please enter the file name. The file path [C:...] and extension [*.txt] is not required: name
Since last stop: 97840.4 miles
Since last stop: 20.9 miles
Since last stop: 16.9 miles
Since last stop: 8.3 miles
Since last stop: 8.10000000001 miles
Since last stop: 10.0 miles
Since last stop: 8.39999999999 miles
Since last stop: 8.7 miles
Since last stop: 9.90000000001 miles
Since last stop: 3.59999999999 miles
Since last stop: 4.2 miles
Since last stop: 33.3 miles
Since last stop: 8.40000000001 miles
Since last stop: 21.7 miles
Since last stop: 13.3 miles
Since last stop: 42.0 miles
Since last stop: 9.59999999999 miles
Since last stop: 5.90000000001 miles
Since last stop: 9.29999999999 miles
Since last stop: 5.60000000001 miles
Since last stop: 6.89999999999 miles
  

Почему бы вам не попробовать распечатать мили из файла в цикле, чтобы убедиться, что вы получаете правильные значения?

Комментарии:

1. @Ethan Как так? Если он хочет, чтобы в первой строке было напечатано 0 миль, ему нужно использовать другой набор логики. В нынешнем виде было бы разумно, что если он установит miles равным 0 в начале, первым результатом будет 97840.4

2. В одном из своих других комментариев он заявляет … о, -97840.4 — думаю, мне следует почистить очки. Отмена downvote. Извините!

3. Все в порядке, мне было интересно, была ли это проблема, без проблем: D