CSV__04--使用csv库对每家店铺的所有商品评价,去掉一个最高分和一个最低分求平均值

简介: 有很多数据存储在csv文件中,每个店铺有唯一userID,每件商品有唯一的workID,以及评分字段,csv文件按照userID排列,需要将相同userID店铺的不同商品评分进行一个去掉一个最高分和一个最低分求平均值操作。

1 CSV

python对CSV文件的读写处理常用CSV库完成。

逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。

2 前景知识

2.1 迭代器

  1. 迭代器的概念

    迭代器(iterator)有时又称光标(cursor)是程序设计的软件设计模式,可在容器对象(container,例如链表或数组)上遍访的接口。

  2. 迭代器的特点

    1. 强制性:必须将元素从迭代器中取出后,才能使用元素;
    2. 一次性:取出以后该元素就从迭代器中删除,无法二次遍历;
    3. 未知性:容器内部元素无法直接定位,只能遍历按序取出。
  3. python使用迭代器处理CSV文件

    1. 将path路径下的文件创建为reader迭代器

      reader = csv.reader(open(path, 'rt', encoding='utf-8'))
    2. 遍历得到迭代器全行的前四列

      column1 = [row1[0:4] for row1 in reader]

2.2 去掉最大值和最小值

先按照店铺workID将grade添加至temp数组

temp.remove(min(temp))
temp.remove(max(temp))

3 问题描述

有很多数据存储在csv文件中,每个店铺有唯一userID,每件商品有唯一的workID,以及评分字段,csv文件按照userID排列,需要将相同userID店铺的不同商品评分进行一个去掉一个最高分和一个最低分求平均值操作。

注意点:

  1. 没家店铺的商品数不同;
  2. 平均分精度控制;
  3. 及时跳出循环,避免数组越界。

4 完整代码

# 对每家店铺的所有商品评价,去掉一个最高分和一个最低分求平均值
def total_work(path):
    reader = csv.reader(open(path, 'rt', encoding='utf-8'))
    column1 = [row1[0:4] for row1 in reader]
    print("共有" + str(reader.line_num - 1) + "件作品。")
    i = 1

    with open("total_"+path, 'w', encoding='UTF8', newline='') as f1:
        writer1 = csv.writer(f1)
        writer1.writerow(["realname", "userID", "grade", "num"]) # 写入标题
        while i <= reader.line_num - 1:
            # 作品数
            j = 1
            # 得分
            grade = 0
            # 所有作品得分的数组
            temp = [float(column1[i][3])]
            while column1[i][1] == column1[i + 1][1]:    # 判断userID店铺是否相同
                i = i + 1
                temp.append(float(column1[i][3]))
                j = j + 1
                # 数组中添加统一参赛者的作品得分
                if i == reader.line_num - 1:             # 判断是否为最后一个商品评价
                    break
            # 去掉最小值 去掉最大值 求平均
            temp.remove(min(temp))
            temp.remove(max(temp))
            grade = "%.3f"%(sum(temp)/(j-2))
            # grade = round(temp/(j),5)
            # 写入平均分
            column1[i][2] = grade
            # 写入作品数量
            # column1[i].append(j)
            column1[i][3] = j
            # 存入csv
            writer1.writerow(column1[i])
            i = i + 1
相关文章
|
JSON 安全 JavaScript
SpringBoot时间格式化
SpringBoot时间格式化
145 0
|
机器人 Java Linux
Webots机器人仿真入门(一)
Webots是一个开源的移动机器人仿真模拟器,内置了许多机器人模型。机器人造价普遍超出新手承受范围,对于新手来说使用仿真软件入门是一个不错的选择。
Webots机器人仿真入门(一)
|
JavaScript 安全 Java
Java - 探究前后分离带来的跨域问题
Java - 探究前后分离带来的跨域问题
164 1
|
关系型数据库 MySQL 数据库
MySql group by 分组
MySql group by 分组
129 0
|
容器
面试官: 谈谈你对BFC的理解以及外边距合并的问题
面试官: 谈谈你对BFC的理解以及外边距合并的问题
215 0
|
存储 SQL 关系型数据库
Mysql系列-4.Mysql存储引擎-InnoDB(下)
Mysql系列-4.Mysql存储引擎-InnoDB
143 0
|
11月前
|
传感器 存储 供应链
物联网技术在物流领域的应用实例有哪些?
物联网技术在物流领域的应用实例有哪些?
2057 59
|
缓存 JavaScript 前端开发
js和html代码一定要分离吗
JavaScript(JS)和HTML代码的分离虽非绝对必要,但通常被推荐
解决layui的table数据重载reload where参数会保留上次条件的问题
解决layui的table数据重载reload where参数会保留上次条件的问题
494 0
|
网络架构
华为ensp模拟器 给路由器配置DHCP
DHCP作用是自动分配IP地址,子网掩码,网关。配置完DHCP后,以后再新增PC机、手机等连接网络的设备时,就会自动分配ip地址,无需手动配置实验目标:配置DHCP,使三台PC机无需手动配置IP即可自动获取IP。首先我们先需要一台路由器,一台交换机,三台PC机来模拟企业环境,将他们连接起来。多台电脑连接在交换机上,交换机连接在路由器上。连接好后鼠标左键将所有东西框中全选,启动。 我们可以看到,给路由器配置DHCP之前,我们想要pc机有IP地址只能静态配置,也就是手动一个个配置。这样在pc机数量多的时候很麻烦
1341 0
华为ensp模拟器 给路由器配置DHCP