用Python解决海量数据的分类汇总~一键化办公的神器

现实的创作来源于生活的灵感!

项目引入

昨天突然发现有一个比较头疼的问题,有一份数据是某一个学校的寝室数据,有不同的维度的分类,总的数据大概有4000数据,需要进行分类,然后按照不同分类维度进行表格制作,最后生成8个文件夹,每个文件夹里面有24个表格,这个就是我们这一个程序的最终实现功能。如果我们用Excel筛选需要点很多次,而且需要几个人的配合工作,这样就比较的费力,那么作为数据分析的Python神器,可不可以解决这个问题了,答案是当然可以!

项目思路

1.首先对这个大量的数据进行导入,用CSV这个库,然后按照Python的对象进行写入和解析,最后存储在pycharm运行内存空间,方便我们下一步操作。
2.导入之后我们就需要分类了,这个时候需要我们写一个算法了,我把它叫做“字典迭代算法”当然是我自己命名的,这个里面涉及到很多的坑,最后我们需要把这个功能封装起来。
3.数据保存也就是,CSV文件的写入数据,最后利用Python的内置模块OS进行文件夹的分类创建,最后实现保存数据,这个时候我们还要解决CSV文件的中文乱码问题。

源码和数据集点击这里下载哟!!

难点

1.解析数据之后如何分割数据,进行保存
2.写入文件的时候如何解决乱码问题
3.怎样去结构化我们的代码程序

代码介绍

大概的思路就是这样,下面我们来具体看看这个程序的功能实现的功能步骤

解析数据

# 1.解析CSV海量数据,用字典保存在内存空间
def csv_data():
    global dormitory_data
    import csv
    dormitory_data = []
    with open(r"寝室数据.csv", encoding='utf-8-sig') as file:#将你的CSV文件和该程序文件放在一个文件夹下面
        f_csv = csv.reader(file)#读取文件里面的每一行数据,转换为列表赋值给新的变量
        header = next(f_csv)#利用迭代的方法,直接取出表头行(标题行),更新f_csv的数据,去除了标题行
        for row in f_csv:
            data = {}
            for index in range(7):
                data[header[index]] = row[index]
            dormitory_data.append(data)

    
    
    
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

这里我们对一份Excel的数据,修改它的后缀名,变成CSV文件的后缀名即可,然后我们就对这个数据进行导入和解析了。

这个解析过程和我们之前的一篇文章《用Python写一个成绩计算系统》的有异曲同工之妙。主要要理解对表头行的提取很数据迭代解析,最后存储在一个列表里面。注意这里一般都是需要声明全局变量的。

效果执行

在这里插入图片描述
分割数据

# 分割数据,按照数据的特点
def csv_sort():
    global dicts
    dicts=[];i = 0
    dormitory_datas = dormitory_data.copy()#字典迭代删除迭代数据是一个坑,需要我们时刻更新数据库值
    dormitory_datass= dormitory_data.copy()
    for x in dormitory_datass:
        b = []
        for sort in dormitory_datass:
            a_1 = sort["宿舍编号"]
            b.append(a_1)
        dicts.append(x)
        dormitory_data.remove(x)
        dormitory_datass=dormitory_data.copy()
        if b[i][:3] != b[i+1][:3]:
            break
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

这里不要小看这个几行代码,这个里面的算法是需要进行反复的测试,才实行的,里面有几个坑,真的是有点头疼,还好最后解决了。

1.首先我们要按照一个算法去分割数据,我们浏览数据之后发现,每一个组团的1-4栋寝室数据都是有相关联的,1楼到2楼的寝室编号我们按照前三位的数据节点,进行索引判断,这样去迭代每一个数据,然后进行比较,最后如果不同的话,我们就发现那么肯定是不同的楼层了,需要我们进行分割数据了。

2.但是我们发现我们跳出循环之后,也就是迭代完1楼的寝室数据之后,我们惊奇的字典的数据虽然是变化了,但是唯独也发生了变化,这个就是第一个坑,因为列表的删除有一个特点,它是利用迭代索引进行删除的,这个在我之前的计算机二级Python程序语言设计-疑难杂症知识点汇总,提到了这个解决办法。我最后利用字典的复制存储,不断的去更新和弥补这个数据字典,bug才解决,这个时候真的需要静下心来慢慢思索。

3.利用字典迭代算法,判断什么时候需要分割数据,最后封装这个函数功能。

保存数据

#保存数据,按照不同的分类
def keep_data():
    import csv
    import os
    import codecs
    for w in range(65,73):
        W=chr(w)
        path = '%s栋寝室'%W      # 创建总的文件夹
        if not os.path.exists(path):
            os.mkdir(path)
            os.chdir(path)
        else:
            os.chdir(path)
        a = []
        dict = dormitory_data[0]
        for headers in dict.keys():  # 把字典的键取出来,注意不要使用sorted不然会导致键的顺序改变
            a.append(headers)
        header = a  # 把列名给提取出来,用列表形式呈现
        for k in range(1,5):
            K=k
            for p in range(1,7):
                P=p
                csv_sort()
                with open('%s组%d栋%d楼.csv'%(W,K,P ),'a', newline='', encoding='utf-8-sig') as f:
                    writer = csv.DictWriter(f, fieldnames=header,)  # 提前预览列名,当下面代码写入数据时,会将其一一对应。
                    writer.writeheader()  # 写入列名
                    writer.writerows(dicts)  # 写入数据
                print("{}组{}栋寝室{}楼数据已经写入成功!!!! ! !".format(W,K,P))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

这个功能同样有几个坑,首先我们需要对数据设计好迭代for循环保存,并且利用OS模块继续自动的创建文件夹,最后对其数据进行命名,方便我们查看还有就是我们的CSV文件里面的编码是utf-8模式,但是Excel里面的编码不同,这个就会造成我们的中文数据形式的乱码问题。

所以我们就去用了这个办法来解决了

encoding='utf-8-sig'

 
 
 
 
  • 1

下面我们来看看整体操作的演示效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码升级版

1.我们还可以参考一些办法,对这个表格数据进行自动制作,添加头部文件信息,当然我这里就不做演示了,你们可以自己去寻找不同的解决方法。
2.我们还可以对数据表格进行网格线绘制,使其我们的表格更加美观,比如字体居中等
3.编写一个自动打印的程序,链接到我们的电脑打印机,一键化打印这些数据,极大地提高了我们的效率。

这些功能读者可以自己去实现,我这里就不做说明了,毕竟代码的涉及和项目不容易,哈哈哈哈!

自动化办公,一键化处理,本来就是Python的强项,我们可以利用它的功能来解决我们学习生活的难题,最后我想致敬那些每天为了数据整理,疯狂的点击Excel的工作人员,毕竟这个东西头大,难搞,枯燥,乏味

最后我想要说的是虽然设计项目程序比较的头疼,但是它可以移植,并且不断的升级,最后别人用1个小时,你只需要3秒钟运行查看即可!

程序源码

# -*- coding :  utf-8 -*-
# @Time      :  2020/9/15 13:26
# @author    :  王小王
# @Software  :  PyCharm
# @File      :  寝室数据分类.py-1.0版本
# @CSDN      :  https://blog.csdn.net/weixin_47723732

# 1.解析CSV海量数据,用字典保存在内存空间
def csv_data():
global dormitory_data
import csv
dormitory_data = []
with open(r"寝室数据.csv", encoding=‘utf-8-sig’) as file:#将你的CSV文件和该程序文件放在一个文件夹下面
f_csv = csv.reader(file)#读取文件里面的每一行数据,转换为列表赋值给新的变量
header = next(f_csv)#利用迭代的方法,直接取出表头行(标题行),更新f_csv的数据,去除了标题行
for row in f_csv:
data = { }
for index in range(7):
data[header[index]] = row[index]
dormitory_data.append(data)

# 分割数据,按照数据的特点
def csv_sort():
global dicts
dicts=[];i = 0
dormitory_datas = dormitory_data.copy()#字典迭代删除迭代数据是一个坑,需要我们时刻更新数据库值
dormitory_datass= dormitory_data.copy()
for x in dormitory_datass:
b = []
for sort in dormitory_datass:
a_1 = sort[“宿舍编号”]
b.append(a_1)
dicts.append(x)
dormitory_data.remove(x)
dormitory_datass=dormitory_data.copy()
if b[i][:3] != b[i+1][:3]:
break

#保存数据,按照不同的分类
def keep_data():
import csv
import os
import codecs
for w in range(65,73):
W=chr(w)
path = ‘%s栋寝室’%W # 创建总的文件夹
if not os.path.exists(path):
os.mkdir(path)
os.chdir(path)
else:
os.chdir(path)
a = []
dict = dormitory_data[0]
for headers in dict.keys(): # 把字典的键取出来,注意不要使用sorted不然会导致键的顺序改变
a.append(headers)
header = a # 把列名给提取出来,用列表形式呈现
for k in range(1,5):
K=k
for p in range(1,7):
P=p
csv_sort()
with open(’%s组%d栋%d楼.csv’%(W,K,P ),‘a’, newline=’’, encoding=‘utf-8-sig’) as f:
writer = csv.DictWriter(f, fieldnames=header,) # 提前预览列名,当下面代码写入数据时,会将其一一对应。
writer.writeheader() # 写入列名
writer.writerows(dicts) # 写入数据
print("{}组{}栋寝室{}楼数据已经写入成功!!!! ! !".format(W,K,P))

def main():
csv_data()
keep_data()

if name == main:
main()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79

每文一语

学以致用,方能学以为用!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尹汇川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值