2016-02-10 3 views
2

Я пытаюсь написать программу на python, в которой мы должны добавить числа из разных категорий и подкатегорий. Программа посвящена ежегодной продаже фермерами продукции на его ферме. Текстовый файл, из которого мы должны читать, имеет 4 категории. Первая категория - это тип продукта, например, овощи, фрукты, приправы. Вторая категория рассказывает нам о типе продукта, который мы имеем, например, о картофеле, яблоки, горячий соус. Третья категория рассказывает нам о продажах в 2014 году, а четвертая категория рассказывает нам о продажах в 2015 году. В этой программе нам нужно только рассчитать итоговые данные с номера 2015 года. Номера 2014 присутствуют в текстовом файле, но неактуальны.Анализ файлов с использованием запятых Python

Вот как выглядит текст файла

PRODUCT,CATEGORY,2014 Sales,2015 Sales 
Vegetables,Potatoes,4455,5644 
Vegetables,Tomatoes,5544,6547 
Vegetables,Peas,987,1236 
Vegetables,Carrots,7877,8766 
Vegetables,Broccoli,5564,3498 
Fruits,Apples,398,4233 
Fruits,Grapes,1099,1234 
Fruits,Pear,2342,3219 
Fruits,Bananas,998,1235 
Fruits,Peaches,1678,1875 
Condiments,Peanut Butter,3500,3902 
Condiments,Hot Sauce,1234,1560 
Condiments,Jelly,346,544 
Condiments,Spread,2334,5644 
Condiments,Ketchup,3321,3655 
Condiments,Olive Oil,3211,2344 

Что мы хотим, чтобы сделать это, чтобы добавить продаж на 2015 год от продуктов, а затем общий объем продаж за все в 2015 году

Выход должен выглядеть следующим образом в письменном текстовом файле:

Всего продаж для овощей в 2015 году: {Вставка общее число здесь}

Общий объем продаж фруктов в 2015 году: {Insert общее число здесь}

Общий объем продаж Приправы в 2015 году: {Insert общее число здесь}


Общий объем продаж для фермеров в 2015 году: {Insert общее для всех продуктов, продаваемых в 2015 году}

наряду с этим, он должен также напечатать итог на экране Python запуска в среде IDE вместе с текстовым файлом:

Общие объем продаж для фермеров в 2015 году: {Insert общих для всех продуктов, продаваемых в 2015 году}

Вот мой код. Он работает, но печатает странную первую строку на выходе. Кроме того, я бы предпочел не использовать списки. Есть ли другой путь? Пожалуйста, не CSV, поскольку мы хотим использовать данные в виде текстового файла.

readFile = open("Products.txt", "r") 
reportfile = open("report.txt", "w") 
line = readFile.readline() 

totalSum = 0 
container = [] 
product =() 
sum=0 
for line in readFile: 
    line=line.strip() 
    line=line.split(",") 

    if line[0] not in container: 
     print(product,sum, file=reportfile) 

     product = line[0] 
     totalSum += int(line[3]) 
     sum = 0 
     sum += int(line[3]) 
     container.append(product) 
    elif product == line[0]: 
     totalSum += int(line[3]) 
     sum += int(line[3]) 

print(totalSum, file=reportfile) 

ответ

3

Такие задачи идеально подходят для Панды:

import pandas 

df = pandas.read_csv('Products.txt') 
df = df.groupby('PRODUCT').sum() 
df.ix['Total'] = df.sum() 
df 

groupby result

+0

Пожалуйста, прочтите: Нам не разрешено использовать или преобразовывать файл в CSV. Его следует рассматривать как тестовый файл без использования CSV. –

+0

Извините, что не можете использовать панды. –

0

Изменен выходной файл stdout, чтобы ускорить развитие. Если вы можете выполнять подпрограммы, вы должны объединить две копии одного и того же кода в одну подпрограмму.

import sys 

readFile = open("Products.txt", "r") 
#reportfile = open("report.txt", "w") 
reportfile = sys.stdout 

Categories_seen = [] 
Current_category = None 
Category_sum = 0 
Total_sum = 0 

line = readFile.readline() 

for line in readFile: 
    category,product,sales2014,sales2015 = line.strip().split(',') 
    sales2015 = int(sales2015) 

    if category not in Categories_seen: 
     if Current_category is not None: # Subroutine, if possible 
      print("Total sales for", Current_category, "in 2015:", 
       Category_sum, file=reportfile) 
     Current_category = category 
     Category_sum = sales2015 
     Total_sum += sales2015 
     Categories_seen.append(Current_category) 
    elif Current_category == category: 
     Category_sum += sales2015 
     Total_sum += sales2015 

if Current_category is not None: # Subroutine, if possible 
    print("Total sales for", Current_category, "in 2015:", 
     Category_sum, file=reportfile) 

print("----------", file=reportfile) 
print("Total sales for the farmer in 2015:", Total_sum, file=reportfile) 
+0

Как работает stdout? Извините, я новичок и никогда не использовал его. Может ли это заменить что-то еще? –

+0

'stdout' - это« стандартный вывод ». То есть, если вы пишите программу python и говорите 'print (« Hello, world! »)', Не указав параметр 'file =', то по умолчанию выходное местоположение будет 'stdout'. Обычно это для вашей консоли или «окна вывода программы». Независимо от этого, раскомментируйте файл открытым и комментируйте/удалите строку stdout, и вы должны быть установлены. –

0

Хорошо, вызов принят ...

counter = dict() 

with open('Products.txt') as f: 
    f.next() 
    for line in f: 
     line = line.strip().split(',') 
     product, sales = line[0], int(line[3]) 
     if product in counter: 
      counter[product] += sales 
     else: 
      counter[product] = sales 

    counter['Total'] = sum(counter.values()) 


results = """ 
Total sales for Vegetables in 2015 : {Condiments:d} 
Total sales for Fruits in 2015 : {Fruits:d} 
Total sales for Condiments in 2015 : {Vegetables:d} 
Total sales for the farmer in 2015: {Total:d} 
""".format(**counter) 


with open('report.txt', 'w') as f: 
    f.write(results) 

print "Total sales for the farmer in 2015: {Total:d}".format(**counter) 
+0

Есть ли другой способ, чем использование коллекций? Извините, что нас еще не научили, поэтому у меня не так много понимания. –

+0

См. Обновленный ответ – Kris

+0

Спасибо! Кроме того, есть ли способ форматировать результаты без создания счетчика и экспоненты? Я использую Python 3 –

0
import re 
import string 
file = open('products.txt', 'r') 
f = open('report.txt', 'a') 
file= file.read() 
file= file.replace(',', ' ') 
file=file[file.find('\n')+1:file.rfind('\n')] 
s = 0 
sentences = file.splitlines() 
pattern = re.compile(r"(^\s?\w+\b|(\b\w+)[\.?!\s]*$)") 
for line in sentences: 
    words = line.split() 
    first = words[0].lower() 
    last = words[-1].translate(None, string.punctuation).lower() 
    print >>f, "Total sales for "+first+" in 2015: "+last 
    s+= int(last) 
print >>f, "_______________________________________________\nTotal sales for the farmer in 2015: "+str(s) 
f.close() 
print "Total sales for the farmer in 2015: "+str(s) 

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