在处理“ 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'
p.s是通过函数发送给我的文件,必须打开。