【问题标题】:How to make an if statement using data from a written file如何使用写入文件中的数据制作 if 语句
【发布时间】:2019-10-20 18:33:18
【问题描述】:

我目前正在尝试使用 if 语句来检查文件中设置的分数值,该文件之前被读取为 par 值。我目前不确定如何将数据作为特定整数读取,因为这些值之前在赋值的早期部分已转换为字符串值。我最初想从哪里开始?

我目前已经设法让程序读取最初在开始部分制作的 .txt 文件,但是,我目前不确定如何处理这个初始程序,将最终数值转换回正常值,我也不确定我知道如何让它正确循环以检查每个特定记录的最终数据。

这是程序从中提取的数据:

Andrew,Marks,11.2,72.0
Betty,Franks,12.8,89.0
Connie,William,14.6,92.0
Donny,Ventura,9.9,78.0
Ernie,Turner,10.1,81.0
Fred,Smythe,8.1,75.0
Greg,Tucker,7.2,72.0
Henry,Zebulon,8.3,83.0
Ian,Fleming,4.2,72.0
Jan,Holden,7.7,84.0
Kit,Possum,7.9,79.0
Landy,Bern,10.3,93.0
Mona,Docker,11.3,98.0
Kevin,Niles,7.1,80.0
Pam,Stiles,10.9,87.0
Russ,Hunt,5.6,73.0

旨在从文件中提取数据并在 if 语句中运行的程序是这样的:

infile = open('golf.txt', 'r')
golf = infile.readlines()

for elements in golf:
    int(golf[elements[3]])
    if golf[elements[3]] > 80:
        print(elements, 'Score: Over Par')
    elif golf[elements[3]] == 80:
        print(elements, 'Score: At Par')
    elif golf[elements[3]] < 80:
        print(elements, 'Score: Under Par')

infile.close()

我希望它会打印各个列表,同时说明分数是“超过标准杆”、“低于标准杆”或“达到标准杆”,具体取决于外部列表中每个列表中的最终值,但是我收到了而是这个错误:

Traceback (most recent call last):
  File "C:/Users/joelc/PycharmProjects/Project2/File/JoelLab5Pt2.py", line 7, in <module>
    int(golf[elements[3]])
TypeError: list indices must be integers or slices, not str

【问题讨论】:

  • 不要使用 Golf[elements[3]]。从 e=int(elements[3]) 开始,然后继续 if e > 80: etc
  • 不能直接将字符串转成int,特别是如果字符串有float值,先转成float再转成int。
  • 你期望elementsfor elements in golf:中包含什么?
  • 您的问题似乎是列表的处理,而不是类型转换。你认为golf[elements[3]] 是什么意思?

标签: python arrays file if-statement


【解决方案1】:

您需要拆分每一行以获得逗号分隔的值。

with open('golf.txt', 'r') as infile:
    for line in infile.readlines():
        values = line.split(',')
        score = float(values[3])
        if score > 80:
            print(line, 'Score: Over Par')
        ...

使用with 语句确保文件被关闭。否则,建议使用异常处理来打开和关闭文件。 with 负责在控制退出 with 块后立即为您关闭文件。

【讨论】:

    【解决方案2】:

    您需要用逗号分隔每一行,然后将元素 3 转换为浮点数。

    infile = open('golf.txt', 'r')
    for line in infile:
        elements = line.split(‘,’)
        e = float(elements[3])
        if e > 80:
            # etc
    

    【讨论】:

      【解决方案3】:

      考虑使用pandas:

      • 将数据放入数据框中后,轻松计算其他指标或绘制数据
      • 给定显示的数据,在 .csv 中,并且没有标题
      • 使用np.select 为par 创建一个新列
      • 我不知道第 3 列应该是什么,所以我将其保留为索引 2。
      import pandas as pd
      import numpy as np
      
      # create the dataframe
      df = pd.read_csv('test.csv', header=None, names=['first_name', 'last_name', 2, 'score'])
      
      first_name last_name     2  score
          Andrew     Marks  11.2   72.0
           Betty    Franks  12.8   89.0
          Connie   William  14.6   92.0
           Donny   Ventura   9.9   78.0
      
      # make a par column
      criteria = [df['score'] < 80, df['score'] == 80, df['score'] > 80]
      values = ['Under Par', 'At Par', 'Over Par']
      
      df['par'] = np.select(criteria, values)
      
      first_name last_name     2  score        par
          Andrew     Marks  11.2   72.0  Under Par
           Betty    Franks  12.8   89.0   Over Par
          Connie   William  14.6   92.0   Over Par
           Donny   Ventura   9.9   78.0  Under Par
      
      # save it
      df.to_csv('my_file.csv', index=False)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-17
        • 1970-01-01
        • 2015-10-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多