2015-11-04 2 views
0

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

candies.txt

31 32 19 11 15 30 35 37 
12 34 39 45 66 78 12 7 
76 32 8 2 3 5 18 32 48 
99 102 3 46 88 22 25 21 
fd zz er 23 44 56 77 99 
44 33 22 55 er ee df 22 

и второй файл days.txt

30 

Но он может иметь более чем один номер. Это может выглядеть как

30 

40 

36 

Нужный выход

Discount at days = 30 

     $ $ $   
$    $ $ 
     $ $ $ $ $  
     $  $ $ $ 
? ? ? $  
     $  ? ? ? $  

Discount at days = 40 

And then execute the output accordingly 

Так в основном, везде число под номером данного в days.txt он должен напечатать "$" знак и везде, где это больше, чем номер (30 в нашем случае), он должен просто печатать места на своем месте. У нас также есть аномально, где у нас есть английские алфавиты в матрице candies.txt, и поскольку мы ищем номера для проверки цены, а не буквы, она должна печатать знак "?" на своем месте, поскольку он не распознается.

Вот мой код

def replace(word, threshold): 

    try: 
     value = int(word) 
    except ValueError: 
     return '?' 
    if value < threshold: 
     return '$' 
    if value > threshold: 
     return ' ' 
    return word 

def get_threshold(filename): 
    thresholds = [] 
    with open(filename) as fobj: 
     for line in fobj: 
      if line.strip(): 
       thresholds.append(int(line)) 
    return thresholds 

def process_file(data_file, threshold): 
    lines = [] 

    print('Original data:') 
    with open(data_file) as f: 
     for line in f: 
      line = line.strip() 
      print(line) 

      replaced_line = ' '.join(
       replace(chunck, threshold) for chunck in line.split()) 
      lines.append(replaced_line) 

    print('\nData replaced with threshold', threshold) 
for threshold in get_threshold('days.txt'): 
    process_file('demo.txt', threshold) 

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

+0

Что произойдет, когда вы попробуете его с несколькими номерами во втором файле? – ppperry

+0

Я получаю сообщение об ошибке 'line = int (строка) ValueError: недействительный литерал для int() с базой 10: '104 \ n88 \ n99 \ n9988''' –

+0

Что вы хотите, если в нескольких второй файл? Создает ли он последовательность для каждого номера? Или он выбирает наивысший? Или что? – ballsatballsdotballs

ответ

1

Читать все пороги:

def get_thresholds(filename): 
    with open(filename) as fobj : 
     return [int(line) for line in fobj if line.strip()] 

Альтернативная реализация без списка понимания:

def get_thresholds(filename): 
    thresholds = [] 
    with open(filename) as fobj: 
     for line in fobj: 
      if line.strip(): 
       thresholds.append(int(line)) 
    return thresholds 

Изменить ваша функция немного:

def process_file(data_file, threshold): 
    lines = [] 

    print('Original data:') 
    with open(data_file) as f: 
     for line in f: 
      line = line.strip() 
      print(line) 

      replaced_line = ' '.join(
       replace(chunck, threshold) for chunck in line.split()) 
      lines.append(replaced_line) 

    print('\nData replaced with threshold', threshold) 
    for line in lines: 
     print(line) 

Пройдите через все пороговые значения:

for threshold in get_thresholds('days.txt'): 
    process_file('candies.txt', threshold) 
+0

Спасибо! Но там, где мы читаем пороговые значения, нам разрешено использовать списки. –

+0

Добавлена ​​версия с использованием цикла. –

+0

Хорошо, я отредактировал мой код в качестве предложенного (см. Вопрос, я сделал редактирование), но его все еще выдал мне ошибку 'OSError: [Errno 9] Плохой дескриптор файла ' –

0

Это переписывание моего предыдущего ответа. Из-за долгого обсуждения и многих изменений кажется более ясным другой ответ. Я прервал задачу на более мелкие подзадачи и определил функцию для каждого. Все функции имеют docstrings. Это настоятельно рекомендуется.

""" 
A chocolate company has decided to offer discount on the candy products 
which are produced 30 days of more before the current date. 

More story here ... 
""" 


def read_thresholds(filename): 
    """Read values for thresholds from file. 
    """ 
    thresholds = [] 
    with open(filename) as fobj: 
     for line in fobj: 
      if line.strip(): 
       thresholds.append(int(line)) 
    return thresholds 


def read_costs(filename): 
    """Read the cost from file. 
    """ 
    lines = [] 
    with open(filename) as fobj: 
     for line in fobj: 
      lines.append(line.strip()) 
    return lines 


def replace(word, threshold): 
    """Replace value below threshold with `$`, above threshold with ` `, 
     non-numbers with `?`, and keep the value if it equals the 
     threshold. 
    """ 
    try: 
     value = int(word) 
    except ValueError: 
     return '?' 
    if value < threshold: 
     return '$' 
    if value > threshold: 
     return ' ' 
    return word 


def process_costs(costs, threshold): 
    """Replace the cost for given threshold and print results. 
    """ 
    res = [] 
    for line in costs: 
     replaced_line = ' '.join(
      replace(chunck, threshold) for chunck in line.split()) 
     res.append(replaced_line) 

    print('\nData replaced with threshold', threshold) 
    for line in res: 
     print(line) 


def show_orig(costs): 
    """Show original costs. 
    """ 
    print('Original data:') 
    for line in costs: 
     print(line) 


def main(costs_filename, threshold_filename): 
    """Replace costs for all thresholds and display results. 
    """ 
    costs = read_costs(costs_filename) 
    show_orig(costs) 
    for threshold in read_thresholds(threshold_filename): 
     process_costs(costs, threshold) 


if __name__ == '__main__': 
    main('candies.txt', 'days.txt')