通过文件查找平均pH值

时间:2016-11-28 17:18:29

标签: python file python-3.x average

我的代码应该计算并打印给定文件变量名称的每种流体的平均pH值 这是我到目前为止,尝试使用split()将txt文件分成多个部分 我真的不知道如何逐行分离功能以计算每种pH值并单独打印。

现在它没有打印任何内容,因为它很可能在第一个插槽中看不到数字

功能

def average_ph(file_variable):

    result = 0
    line = file_variable.readline()
    found = False
    while line != "" and not found:
        list = line.strip().split(",")
        if list.isnum:
            result += list
    if line != "":
        avg = result / 3
    if not found:
        result = None
        print(avg)
    return avg

主要

file_name = str(input("Enter a file name: "))
file_variable = open(file_name, "r", encoding="utf-8")

文件 - 名称:pH.txt

Lemon juice,2.4,2.0,2.2
Baking soda (1 Tbsp) in Water (1 cup),8.4,8.3,8.7
Orange juice,3.5,4.0,3.4
Battery acid,1.0,0.7,0.5
Apples,3.0,3.2,3.5

3 个答案:

答案 0 :(得分:2)

Python3有一个built-in mean function

您只需要弄清楚如何正确读取文件并拆分数据。

from statistics import mean

with open("pH.txt") as f:
  for line in f:
    data = line.split(",")
    ph_values = map(float, data[1:])
    print("{}, avg = {:.02f}".format(data[0], mean(ph_values))

作为输出,应该看

Lemon juice, avg = 2.20
Baking soda (1 Tbsp) in Water (1 cup), avg = 8.47
Orange juice, avg = 3.63
Battery acid, avg = 0.73
Apples, avg = 3.23

答案 1 :(得分:1)

我的解决方案:

def average(numbers):
    return float(sum(numbers)) / max(len(numbers), 1)


def read_average(filename):
    with open(filename) as f:
        dict
        lines = f.readlines()
        for line in lines:
            data = line.split(',')
            name = data[0]
            avg = average([float(i) for i in data[1:]])
            print("{name}: {avg}".format(name=name, avg=avg))

read_average('pH.txt')

输出:

Lemon juice: 2.2
Baking soda (1 Tbsp) in Water (1 cup): 8.466666666666667
Orange juice: 3.6333333333333333
Battery acid: 0.7333333333333334
Apples: 3.233333333333333

答案 2 :(得分:1)

男孩,从哪里开始?

list = line.strip().split(",")
if list.isnum:

首先,list是Python中内置类型的名称,而可以通过将其用作变量名来掩盖它,为了不让自己混淆和其他人一样,你真的不应该:

lst = line.strip().split(",")
if lst.isnum:

好的,那更好。 lst是该类的一个实例,现在仍然可以称为list。现在,您的if lst.isnum:似乎是尝试测试该实例的方法的输出。但是在Python中,如果不键入括号,则无法调用方法。目前,如果没有括号,您的if语句会询问指向方法本身的指针是否为非零,对于存在的方法,该指针始终是真的......

lst = line.strip().split(",")
if lst.isnum():

好的,那更好。除了注意我说,“......对于存在的方法”。 isnum不是list类的方法,因此代码只会在此处引发异常。你可能意味着字符串方法.isnumeric

lst = line.strip().split(",")
if lst.isnumeric():

但当然这仍然是错误的。您想要测试列表中的 项是否为数字。因此,您需要调用每个项目的某些功能或方法,列表本身。尽管字符串具有isnumeric方法,但list类(我们的lst变量所属的类)却没有。一个优雅的方法是使用“列表理解”:

lst = line.strip().split(",")
lst = [item for item in lst if item.isnumeric()]

但当然,实际上并没有将项目从字符串转换为数字。你真的认为你可以加上一堆字符串并除以3吗?

lst = line.strip().split(",")
lst = [float(item) for item in lst if item.isnumeric()]

好的,现在我们有一个可以用数字方式操作的实际浮点数列表。但我们已经抛弃了有关我们正在测量哪种物质的信息。

lst = line.strip().split(",")
substance = lst.pop(0)   # remove and store the first item in the list
lst = [float(item) for item in lst if item.isnumeric()]

然后我会建议你以某种方式将每个pH值列表/平均值与其各自的物质相关联 - 否则关联信息将会丢失/损坏。虽然目前你有一个名为dict的变量未被使用,但是有一些方法可以做到这一点,但是你可能打算这样做:

found

(注意:如果你这样做,那么循环中 - 你想检查每个行,看看它是否是目标,毕竟。)

现在,至于您的if substance == the_particular_substance_we_are_currently_interested_in: found = True avg = ... ......嗯,您已将result += lst初始化为result,因此它是一个整数,0我们知道的是{{1} }}。您无法将lst添加到整数 - 它没有意义。您可能想要做的是list列表中的值(您甚至不需要list):

sum

请注意,我除以result的长度,而不是硬编码那里的数字3。像这样的硬编码假设是为你未来的自我设置难以找到的陷阱的真正有效方法,所以让我们避免它。

祝你好运。