将两个文本文件处理成python矩阵

时间:2015-10-29 18:00:34

标签: python file python-3.x exception matrix

一家巧克力公司决定对当前日期前30天生产的糖果产品提供折扣。我必须有一个矩阵作为打印结果,其中程序读取2个文件,一个是不同大小的不同糖果的成本,另一个是提供折扣的阈值天数。所以在这个问题中,两个文本文件看起来像这样

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

Discount at days = 30

应打印

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

所以基本上,在数字小于30(这是来自days.txt的输入)的任何地方,它应该打印一个"$"符号,并且它在任何地方都超过数字(在我们的例子中为30)它应该只打印在他们的地方的空间。我们也有一个异常,我们在candies.txt矩阵中有英文字母,因为我们正在寻找数字来检查价格而不是字母,所以它应该在它们的位置打印"?"符号,因为它不是认可。

这是我想要做的。

def candyShop(candy, price):
    try:
        candyfile = open("candes.txt", "r")
        readCategory = process_file(candyfile)
        if readCategory str.isdigit():
            if readCategory > 30:
                print("$")
        elif:
            print("?")
        else:
            print("")

    return candyShop()

2 个答案:

答案 0 :(得分:0)

您应该了解我们必须处理文件并以稍后可以使用数据的方式重塑数据。 2D列表怎么样?

parsedList=[]
with open("demo.txt","r") as f:
    lst=f.read().splitlines()
    for i in lst:
        parsedList.append(i.split())

嗯,数据存储得很好。现在任务很简单,遍历每个项目,根据您的条件检查元素并相应地打印出来。

with open("days.txt","r") as f:
    param = int(f.readline().split("=")[1])

for innerList in parsedList:
    for element in innerList:
        if element.isdigit():
            if int(element)>=param:
                print " ",
            else:
                print "$",
        else:
            print "?",
    print

答案 1 :(得分:0)

EAFP - 意识到的方式。

请注意join()可以保存最后一次迭代测试(可怕)或剥离尾随空白。 (难看)

当然,您必须从文件加载数据,而不是使用现成的字符串DATA,但这不应该是一项太大的任务。

要从配置文件中解析threshold,您还可以使用re或纯字符串split()功能。

import re

DATA = '''
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
'''

PLACEHOLDER = ' '
DISCOUNT_MARKER = '$'
VOID_MARKER = '?'

SEP = PLACEHOLDER # your mileage may vary


def dump(x, threshold):
    s = None
    try: 
        if int(x) < threshold:
            s = DISCOUNT_MARKER
        else:     
            s = PLACEHOLDER
    except ValueError:
        s = VOID_MARKER 
    return s


if __name__ == '__main__':
    threshold = 30 # gather that from the config file

    for line in DATA.splitlines()[1:]:
        print(SEP.join(
            map(lambda x: dump(x.group(0), threshold), 
                re.finditer('(\w+)', line)
            )
        ))

输出:

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