Как добавить данные из двух файлов вместе? - PullRequest
0 голосов
/ 13 января 2019

Я делаю программу подсчета калорий на python, и программа создает два текстовых файла, один для потребляемых калорий пищи и один для сожженных калорий упражнений, мне нужно вычесть сожженные калории из пищевых калорий, но информация для обоих: в отдельных текстовых файлах как мне создать еще один текстовый файл и добавить в него данные из этих двух файлов?

Я пытался использовать файлы в функциях, которые возвращают свои данные, затем добавлял функции добавления, чтобы израсходованные калории можно было вычесть из потребляемых калорий, но кажется, что функции нельзя добавлять или объединять.

Excercise.txt создается выше в каком-то другом блоке кода, и ввод часов тренировки также был опущен, чтобы сохранить здесь простоту. Этот блок читает, добавляет и отображает код в оболочке для упражнений.

def liftnumber():
    total=0
    products=[]
    file = open("excercises.txt", "r")
    for line in file: #put data from file int6o propdytc list
        products.append(line)
    file.close()


    for item in products: # show products
        currentline = item.split(",") #split data where tyhe is a comma
        total=total+int(currentline[0])
    print("Total calories expended:",total*100)

Этот блок кода суммирует все калории пищи вместе в inventory.txt, и этот блок кода также следует вдоль строк последнего, где файл инвентаризации и ввод пищи создается где-то еще. Единственное отличие состоит в том, что у этого есть 2 фрагмента данных, разделенных запятыми; калории и название еды, тогда как у последнего есть один фрагмент: часы упражнений

def finishday():
    total=0
    print("HERE'S HOW YOU DID TODAY")
    print("-----------------")
    products=[] ##create a list that holds all foods from inventory.txt
    file = open("inventory.txt", "r")
    for line in file: #put data from file int6o propdytc list
        products.append(line)
    file.close()

    for item in products: # show products
        currentline = item.split(",") #split data where tyhe is a comma
        total=total+int(currentline[1])

    print("Total calories consumed:",total)

    liftnumber()

Если вы не можете повторить проблему с кодом выше, попробуйте всю программу ниже:

Функция, позволяющая пользователю сделать выбор из основного цикла:

def mainmenu():
    print("------------------------")
    print("ETCHAPP")
    print("------------------------")
    print("1> enter a new food")
    print("2> see foods")
    print("3> delete something")
    print("4> enter excercises")
    print("5> finish day")
    print("6> see excercises")

    print("x> exit program")
    choice = input("Enter your choice: ")
    choice=choice.strip()
    return(choice)

def enterproduct():
    print("ENTER A NEW FOOD")
    print("------------------------")
    number=input("enter food: ")

    price=input("enter calories in food consumed: ")

    # should remove any leading or trailing spaces
    number = number.strip()
    price = price.strip()

    # write data to the file as one line (comma delimited)
    line =number+","+price+"\n" #put all the data together
    with open("inventory.txt","a") as file:
        file.write(line) #write product data
    file.close()


def seeproducts():
    print("REPORT OF PRODUCTS")
    print("-----------------")
    products=[] #create a list that holds all foods from inventory.txt
    file = open("inventory.txt", "r")
    for line in file: #put data from file into propdytc list
        products.append(line)
    file.close()

    for item in products: # show prioducts
        print(item)
        currentline = item.split(",") #split data where there is a comma
        prodnumber = currentline[0]
        price = currentline[1]

# This one allows user to enter excercise times
def enterlift():
    print("ENTER A NEW EXCERCISE")
    print("------------------------")
    print("(must be 30 bpm over normal heart rate)")
    num=input("enter number of hours excercised: ")

    # should remove any leading or trailing spaces
    num = num.strip()

    # write data to the file as one line (comma delimited)
    line =num+"\n" #put all the data together
    with open("excercises.txt","a") as file:
        file.write(line) #write product data
    file.close()

# This one adds all the excercise times together
def liftnumber():
    total=0
    products=[] #create a list that holds all foods from inventory.txt
    file = open("excercises.txt", "r")
    for line in file: #put data from file int6o propdytc list
        products.append(line)
    file.close()


    for item in products: # show products
        currentline = item.split(",") #split data where tyhe is a comma
        total=total+int(currentline[0])
    print("Total calories expended:",total*100)



# This one allows user to see excercise times entered
def seelift():
    print("HERE'S HOW YOU'RE DOING")
    print("-----------------")

    total=0
    products=[] #create a list that holds all foods from inventory.txt
    file = open("excercises.txt", "r")
    for line in file: #put data from file int6o propdytc list
        products.append(line)
    file.close()

    for item in products: # show products
        currentline = item.split(",") #split data where tyhe is a comma
        total=total+int(currentline[0])
    print("Total hours excercised:",total)
    print("Total calories expended:",total*100)

# This finishes a day and begins the next one
def finishday():
    total=0
    print("HERE'S HOW YOU DID TODAY")
    print("-----------------")
    products=[] #create a list of which weill hold all products from the 
file inventory.txt
    file = open("inventory.txt", "r")
    for line in file: #put data from file int6o propdytc list
        products.append(line)
    file.close()

    for item in products: # show products
        currentline = item.split(",") #split data where tyhe is a comma
        total=total+int(currentline[1])

    print("Total calories consumed:",total)

    liftnumber()

#This deletes things
def deleteproduct():
    products=[] #create a list whcih will hold all products from file 
inventory.txt
    currentindex=0 #this will be use4d to get an index
    #position od utem to delete in list
    file = open("inventory.txt","r")
    for line in file: #put data frpom file into product
        products.append(line)
    file.close()
    seeproducts() #show all the products
    #enter product number to delete
    deletethis=input("Enter name of the food to delete: ")

    #loop through produces find matching number
    #delete product from list
    for item in products: #show products
        currentline = item.split(",") #split data where comma
        prodnumber = currentline[0] #get the item's product number
        if prodnumber==deletethis:
            break #found product to delete
        currentindex=currentindex+1 #increment index for next product
    del products[currentindex] #delete product at this index

    #erase provios file
    file = open('inventory.txt','r+')
    file.truncate(0)

    #write new file from list
    for item in products:
        with open("inventory.txt","a") as file:
            file.write(item) #write product data
    file.close()


#main program starts here
choice=""
while choice!="x": #loop to allows user to choice
    #exit when the user chooses 'x'

    choice=mainmenu()
    if choice=="1":
        enterproduct()
    if choice=="2":
        seeproducts()
    if choice=="3":
        deleteproduct()
    if choice=="5":
        finishday()
    if choice=="4":
        enterlift()
    if choice=="6":
        seelift()

Ожидаемый:

Я ожидал, что будет создан новый файл «totalcal.txt» и в него будет добавлено содержимое «инвентаризации.txt» (только цифры калорийности продуктов, а не названия продуктов) и «excercises.txt» (извините, если это кажется сбивающим с толку, но, под словами «добавил вместе», я имел в виду, что хотел, чтобы сожженные калории при физической нагрузке были вычтены из потребленных пищевых калорий), и поместил это в функцию, которая показывает это, печатая «общее количество калорий». «сгорел до израсходованного» и имеют либо отрицательное значение (если сжигание превышает количество потребляемых калорий), либо положительное (если количество потребляемых калорий превышает количество полученного)

Я бы вызвал эту функцию внутри finishday () ближе к концу, ниже вызова liftnumber ()

Выше я думаю, что это может быть сделано, но если вы сможете достичь результата, приведенного ниже, каким-либо другим способом, я также был бы очень признателен.

Итак, ожидаемый результат:

Вот как ты это сделал сегодня
..........................
Всего потреблено калорий: число1
Всего затраченных калорий: количество2
Всего сожженных или потребленных калорий: число1 - число2
..........................

Reality:

Я забыл точную ошибку, но она дает мне ошибку из-за невозможности добавить функции вместе на основе того, как я пытался решить проблему.

Спасибо

1 Ответ

0 голосов
/ 14 января 2019

Я сделал быстрый поиск в Google и обнаружил, что вы можете добавить два (или более) текстовых файла, выполнив следующее:

filenames = ['file1.txt', 'file2.txt']
with open('result.txt', 'w') as outfile:
    for fname in filenames:
        with open(fname) as infile:
            outfile.write(infile.read())

Так что я понял это, мне также удалось сделать вычитание, чтобы получить общее количество калорий, создав новую функцию и вернув данные, это позволило мне использовать саму функцию в качестве отдельного фрагмента данных, как мне нравится, что позволил мне решить проблему.

Извините за мой беспорядочный вопрос, но я уже понял его.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...