Python文件内销售数据求和统计及代码问题排查修复
问题描述
程序需求:输入国家名称,以及对应国家的software、hardware、accessory三类产品销售额,随后输出每个品类的单国平均销售额、各品类总销售额、全局总销售额。若用户选择输入多个国家,所有均值和总额需要基于全部录入国家的数据合并计算。
当前问题:代码仅能单独计算每个国家的对应指标,且无法正确统计新增的国家数量。
补充说明:教授指出问题出在
request_data函数的while True部分,需要明确循环成立的条件,不清楚具体如何修改。
原错误代码
def request_countryname(): country_name = input('Please enter the country\'s name: ') while len(country_name) < 2: print('Name must be at least two chracters') country_name = input('Please enter the country\'s name: ') return country_name def request_sales(product_type, country_name): sales = float(input('Please enter the total sales for ' + product_type + ' in ' + country_name + ": ")) while sales == type(str) or sales < 0: print('Sales must be a non-negative numeric input') sales = float(input('Please enter the total sales for', product_type, 'in', country_name)) return sales def request_data(sales_data): sales_data = open('sales_data.txt', 'w') records = 0 add_country = True while True: records += 1 country_name = request_countryname() soft_sales = request_sales('software', country_name) hard_sales = request_sales('hardware', country_name) acc_sales = request_sales('accessories', country_name) sales_data.write(f'{country_name}\n{soft_sales}\n{hard_sales}\n{acc_sales}\n') add_country = input('Do you want to add another country? (Enter y/Y for Yes, any other key to stop): ') if add_country == 'y' or add_country == 'Y': records += 1 request_data("sales_data.txt") analyze_data("sales_data.txt") else: print(records, 'record(s) successfully added to the file.') print('----------------------------------------------\n') sales_data.close() return sales_data def analyze_data(sales_data): sales_data = open ('sales_data.txt', 'r') software_sales = [] hardware_sales = [] accessory_sales = [] read_file = sales_data.readline() while read_file != '': soft_sales = sales_data.readline() hard_sales = sales_data.readline() acc_sales = sales_data.readline() software_sales.append(float(soft_sales)) hardware_sales.append(float(hard_sales)) accessory_sales.append(float(acc_sales)) read_file = sales_data.readline().rstrip('\n') soft_average= sum(software_sales)/len(software_sales) hard_average = sum(hardware_sales)/len(hardware_sales) acc_average = sum(accessory_sales)/len(accessory_sales) total_soft = sum(software_sales) total_hard = sum(hardware_sales) total_acc = sum(accessory_sales) total_sales = float(total_soft + total_hard + total_acc) print('Average software sales per country: $' + format(soft_average, ',.2f')) print('Average hardware sales per country: $' + format(hard_average, ',.2f')) print('Average accessory sales per country: $' + format(acc_average, ',.2f')) print('') print('Total software sales: $' + format(soft_average, ',.2f')) print('Total hardware sales: $' + format(hard_average, ',.2f')) print('Total accessory sales: $' + format(acc_average, ',.2f')) print('') print('Total sales: $' + format(total_sales, ',.2f')) sales_data.close def main(): request_data("sales_data.txt") analyze_data("sales_data.txt") main()
问题排查
request_data中的while True循环完全没有生效:不管用户是否选择继续添加国家,代码走完if-else分支后直接执行return,循环仅运行一次就退出- 错误添加递归逻辑:用户选择添加新国家时递归调用
request_data,会重新以覆盖写入模式打开文件,之前存储的所有国家数据都会被清空,导致最终只能统计到最后一个国家的数据 - 计数错误:每录入一个国家时
records已经加1,用户选择继续添加时又重复加1,最终统计的国家数量完全不准 - 额外的逻辑嵌套:不需要在
request_data内部调用analyze_data,main函数已经设置了录入完成后统一分析的逻辑 analyze_data存在两处低级错误:打印品类总销售额时错误使用了平均值变量,输出结果错误;文件关闭方法close没加括号,文件不会被正常关闭request_sales的输入校验逻辑无效:sales已经被强转为float,sales == type(str)的判断永远不成立,用户输入非数字内容时程序会直接崩溃
修复后的完整代码
def request_countryname(): country_name = input('Please enter the country\'s name: ') while len(country_name) < 2: print('Name must be at least two characters') country_name = input('Please enter the country\'s name: ') return country_name def request_sales(product_type, country_name): while True: input_str = input(f'Please enter the total sales for {product_type} in {country_name}: ') try: sales = float(input_str) if sales >= 0: return sales else: print('Sales must be a non-negative numeric input') except ValueError: print('Sales must be a non-negative numeric input') def request_data(file_path): sales_data = open(file_path, 'w') records = 0 # 明确循环条件:只要add_flag为True就继续录入 add_flag = True while add_flag: records += 1 country_name = request_countryname() soft_sales = request_sales('software', country_name) hard_sales = request_sales('hardware', country_name) acc_sales = request_sales('accessories', country_name) sales_data.write(f'{country_name}\n{soft_sales}\n{hard_sales}\n{acc_sales}\n') add_country = input('Do you want to add another country? (Enter y/Y for Yes, any other key to stop): ') # 仅根据用户输入修改循环标志,不需要递归 add_flag = add_country.lower() == 'y' # 所有国家录入完成后统一输出计数、关闭文件 print(records, 'record(s) successfully added to the file.') print('----------------------------------------------\n') sales_data.close() return file_path def analyze_data(file_path): sales_data = open(file_path, 'r') software_sales = [] hardware_sales = [] accessory_sales = [] while True: country_name = sales_data.readline().strip() if not country_name: break soft_sales = sales_data.readline().strip() hard_sales = sales_data.readline().strip() acc_sales = sales_data.readline().strip() software_sales.append(float(soft_sales)) hardware_sales.append(float(hard_sales)) accessory_sales.append(float(acc_sales)) soft_average= sum(software_sales)/len(software_sales) hard_average = sum(hardware_sales)/len(hardware_sales) acc_average = sum(accessory_sales)/len(accessory_sales) total_soft = sum(software_sales) total_hard = sum(hardware_sales) total_acc = sum(accessory_sales) total_sales = total_soft + total_hard + total_acc print(f'Average software sales per country: ${soft_average:,.2f}') print(f'Average hardware sales per country: ${hard_average:,.2f}') print(f'Average accessory sales per country: ${acc_average:,.2f}') print('') # 修复总销售额打印的变量错误 print(f'Total software sales: ${total_soft:,.2f}') print(f'Total hardware sales: ${total_hard:,.2f}') print(f'Total accessory sales: ${total_acc:,.2f}') print('') print(f'Total sales: ${total_sales:,.2f}') # 修复close方法调用 sales_data.close() def main(): file_path = "sales_data.txt" request_data(file_path) analyze_data(file_path) if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者bri
相关产品推荐
相关产品推荐

