【问题标题】:How can I make results human readable when printing to a file? [closed]打印到文件时如何使结果易于阅读? [关闭]
【发布时间】:2012-09-03 12:04:17
【问题描述】:

我还是个新手,但我想我已经很接近了。我的任务是计算均值、中位数和众数,然后:

  • 提示用户输入数字列表(提示:确保有一种方式让用户表明他们已完成提供数字列表)
  • 打开一个包含数字列表的文件
  • 计算数字列表的平均值、统计中位数和众数
  • 将您的答案存储在另一个文件中
  • 询问用户是否想查看答案,如果答案是肯定的,则打开文件并显示数字

我想让文件更“可读”。我现在得到的结果的一个例子是:

(lp1
S'3,5,6'
p2
aF4.666666666666667
aF5
aF3
a.

任何帮助将不胜感激!

这是我的代码:

def mean(numbers):
    average = 0
    for number in numbers:
        average += number
    return average / float(len(numbers))

def median(numbers):
    middle = []
    for number in numbers:
        middle.append(number)
    middle.sort()
    middleValue = len(middle) / 2
    if len(middle) % 2 == 1:
        return middle[middleValue]
    else:
        return (middle[middleValue] + middle[middleValue - 1]) / 2

def mode(numbers):
    frequency = {}
    for number in numbers:
        times = frequency.get(number, None)
        if times == None:
            frequency[number] = 1
        else:
            frequency[number] = times + 1

    maxValue = max(frequency.values())
    for modeFreq in frequency:
        if frequency[modeFreq] == maxValue:
            return modeFreq        

import cPickle as pickle

def main():
    user_in = raw_input("Enter a list of numbers seperated by commas: ")
    numbers_as_strings = user_in.replace(' ', '').split(',')
    numbers = [float(x) for x in numbers_as_strings]
    if not user_in:
        return 0
    else:
        print "\nYour inputs: ", user_in, '\n'
        print "   Mean = ", mean(numbers)
        print " Median = ", median(numbers)
        print "   Mode = ", mode(numbers), '\n'
        pckl_file = file("mean_medi_mode.txt", "w")
        pickle.dump([user_in, mean(numbers),median(numbers),mode(numbers)],pckl_file)
main()

while True:
    answer = raw_input('Would you like to open a file with your results? ')
    if answer.strip() in "y Y yes Yes YES".split():
        f = open("mean_medi_mode.txt", 'r')
        for line in f:
            print line,
        print 'Done'
        break
    elif answer.strip() in "n N no No NO".split():
        print 'Done'
        break

【问题讨论】:

  • 注意:求均值时,请以average=0.开头,否则将是整数除法而不是浮点除法,您可能会得到错误的答案。
  • if answer.strip() in "y Y yes Yes YES".split(): 可以简化为 if answer.strip().lower() in ['y','yes']:,对于您的“否”条件也是如此。
  • 感谢大家的建议! json 是我一直在寻找的答案!

标签: python file printing pickle raw-input


【解决方案1】:

尝试使用json 模块。它易于使用且易于阅读

import json
code...
def main():
    user_in = raw_input("Enter a list of numbers seperated by commas: ")
    numbers_as_strings = user_in.replace(' ', '').split(',')
    numbers = [float(x) for x in numbers_as_strings]
    if not user_in:
        return 0
    else:
        print "\nYour inputs: ", user_in, '\n'
        print "   Mean = ", mean(numbers)
        print " Median = ", median(numbers)
        print "   Mode = ", mode(numbers), '\n'
        json.dump([user_in, mean(numbers), median(numbers), mode(numbers)], fp)

然后:

def print(fp):
    user_in, mean, median, mode = json.load(fp)
    print "\nYour inputs: ", user_in, '\n'
    print "   Mean = ", mean
    print " Median = ", median
    print "   Mode = ", mode, '\n'

【讨论】:

    【解决方案2】:

    当重新打开 pickle 文件(不是人类可读的文本格式)时,使用 pickle.load:

    given, average, median, mode = pickle.load(f)
    

    而不是您的 for line in f: print line 语句。您的输出是 pickle 转储的原始内容,包含您保存的结果:

    >>> import cPickle
    >>> p = '''\
    ... (lp1
    ... S'3,5,6'
    ... p2
    ... aF4.666666666666667
    ... aF5
    ... aF3
    ... a.
    ... '''
    >>> cPickle.loads(p)
    ['3,5,6', 4.666666666666667, 5.0, 3.0]
    

    对于您的目的而言,pickle 格式可能有点笨拙。在这里使用更轻量、更易于阅读的格式,例如 jsoncsv 可能更适合您的需求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      • 2014-09-03
      • 1970-01-01
      • 1970-01-01
      • 2022-08-16
      • 2010-09-18
      相关资源
      最近更新 更多