Работа с объектом 'str' не имеет атрибута 'read' в функциях - PullRequest
0 голосов
/ 20 февраля 2019

Возникла проблема программирования, связанная с «AttributeError».Мне дают открытый файл, и мне нужно сначала создать список всех слов (исходя из их чисел) и найти год, за которым следуют 12 чисел, но я постоянно получаю эту ошибку в моей единственной функции.Я думаю, что я делаю что-то не так с чтением файла или передачей информации между функциями.

Вот моя основная функция:

# process_rainfall_data_w_functions.py
# Instructor-supplied driver for the rainfall_data_functions module.

import sys
import rainfall_data_functions


def main():
    """
    The main driver function for the functions in the module
    rainfall_data_functions.py.
    """
    if len(sys.argv) == 1:
        rainfall_data_functions.display_opening_screen()
        rainfall_data_functions.display_program_info()
        sys.exit()


    f = open(sys.argv[1])
    rainfall_data_functions.process_rainfall_file(f)
    f.close()
    print("\nOK ... Program now terminating.")
    input("Press Enter to continue ... ")

    main()

и мои функции:

def process_rainfall_file(f):
    numbers = list(f.read().split())
    year = input('Enter year for which you want rainfall data: ')
    rain_nums, rain_dict = process_data(year, numbers)
    read_information(rain_nums, rain_dict, year)

def year_input():
    # asks user for year
    year = input('Enter year for which you want rainfall data: ')
    return year

def process_data(year, numbers):
    # finds index of matching year in text list
    year_index = numbers.index(year)
    # creates two lists for processing values
    rain_string = []
    rain_nums = []
    # collects the twelve values after year in list number
    for i in range(year_index, year_index + 12):
        rain_string.append(numbers[i+1])
    # changes the twelve strings into float values
    for i in rain_string:
        rain_nums.append(float(i))
    # create list with twelve months
    months_of_year = ['January', 'February', 'March', 'April', 'May',
                      'June', 'July', 'Augest', 'September', 'October',
                      'November', 'December']
    # creates dict with months and rain values matched up
    rain_dict = dict(zip(months_of_year, rain_nums))
    # returns the list and dict
    return rain_nums, rain_dict

def read_information(rain_nums, rain_dict, year):
    # prints first text box with rain values
    print('\n===== Rainfall summary for {}'.format(year), end='')
    print("""
January..... {[0]:4.1f}  July........ {[6]:4.1f}
February.... {[1]:4.1f}  August...... {[7]:4.1f}
March....... {[2]:4.1f}  September... {[8]:4.1f}
April....... {[3]:4.1f}  October..... {[9]:4.1f}
May......... {[4]:4.1f}  November.... {[10]:4.1f}
June........ {[5]:4.1f}  December.... {[11]:4.1f}"""
           .format(rain_nums, rain_nums, rain_nums, rain_nums, rain_nums,
                  rain_nums, rain_nums, rain_nums, rain_nums, rain_nums,
                  rain_nums, rain_nums), end='')
    # find total of all float rain values under total_rain
    total_rain = 0
    for i in range(12):
        total_rain += float(rain_nums[i])
    # finds average rain
    avg_rain = total_rain/len(rain_nums)
    # finds max rain value and matches it with its month in dict
    max_month = max(rain_dict, key=rain_dict.get)
    # finds min rain value and matches it with its month in dict
    min_month = min(rain_dict, key=rain_dict.get)
    # prints second text box after calculations
    print("""
===== Total rainfall for the year... {:<7}
===== Average monthly rainfall...... {:<7}
===== Month with highest rainfall... {:<7}
===== Month with lowest rainfall.... {:<7}"""
          .format(round(total_rain, 1),
                  round(avg_rain, 1), max_month, min_month))
# pause
input('Press Enter to continue ...')

говорят, что ошибка возникает в этой функции:

J:\*******\*******\rainfall_data_functions.py in process_rainfall_file(f)
     46 def process_rainfall_file(f):
     47     numbers = list(f.split())
---> 48     year = input('Enter year for which you want rainfall data: ')
     49     rain_nums, rain_dict = process_data(year, numbers)
     50     read_information(rain_nums, rain_dict, year)

AttributeError: 'str' object has no attribute 'read'

ps файл, который мне открыли перед тем, как отправить через функцию, и должен быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...