You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 11:18:03