python文本分类汇总_用Python解决海量数据的分类汇总一键化办公的神器!
現(xiàn)實(shí)的創(chuàng)作來(lái)源于生活的靈感!
項(xiàng)目引入
昨天突然發(fā)現(xiàn)有一個(gè)比較頭疼的問(wèn)題,有一份數(shù)據(jù)是某一個(gè)學(xué)校的寢室數(shù)據(jù),有不同的維度的分類(lèi),總的數(shù)據(jù)大概有4000數(shù)據(jù),需要進(jìn)行分類(lèi),然后按照不同分類(lèi)維度進(jìn)行表格制作,最后生成8個(gè)文件夾,每個(gè)文件夾里面有24個(gè)表格,這個(gè)就是我們這一個(gè)程序的最終實(shí)現(xiàn)功能。如果我們用Excel篩選需要點(diǎn)很多次,而且需要幾個(gè)人的配合工作,這樣就比較的費(fèi)力,那么作為數(shù)據(jù)分析的Python神器,可不可以解決這個(gè)問(wèn)題了,答案是當(dāng)然可以!
項(xiàng)目思路
1.首先對(duì)這個(gè)大量的數(shù)據(jù)進(jìn)行導(dǎo)入,用CSV這個(gè)庫(kù),然后按照Python的對(duì)象進(jìn)行寫(xiě)入和解析,最后存儲(chǔ)在pycharm運(yùn)行內(nèi)存空間,方便我們下一步操作。
2.導(dǎo)入之后我們就需要分類(lèi)了,這個(gè)時(shí)候需要我們寫(xiě)一個(gè)算法了,我把它叫做“字典迭代算法”當(dāng)然是我自己命名的,這個(gè)里面涉及到很多的坑,最后我們需要把這個(gè)功能封裝起來(lái)。
3.數(shù)據(jù)保存也就是,CSV文件的寫(xiě)入數(shù)據(jù),最后利用Python的內(nèi)置模塊OS進(jìn)行文件夾的分類(lèi)創(chuàng)建,最后實(shí)現(xiàn)保存數(shù)據(jù),這個(gè)時(shí)候我們還要解決CSV文件的中文亂碼問(wèn)題。
難點(diǎn)
1.解析數(shù)據(jù)之后如何分割數(shù)據(jù),進(jìn)行保存
2.寫(xiě)入文件的時(shí)候如何解決亂碼問(wèn)題
3.怎樣去結(jié)構(gòu)化我們的代碼程序
代碼介紹
大概的思路就是這樣,下面我們來(lái)具體看看這個(gè)程序的功能實(shí)現(xiàn)的功能步驟
解析數(shù)據(jù)
# 1.解析CSV海量數(shù)據(jù),用字典保存在內(nèi)存空間
def csv_data():
global dormitory_data
import csv
dormitory_data = []
with open(r"寢室數(shù)據(jù).csv", encoding='utf-8-sig') as file:#將你的CSV文件和該程序文件放在一個(gè)文件夾下面
f_csv = csv.reader(file)#讀取文件里面的每一行數(shù)據(jù),轉(zhuǎn)換為列表賦值給新的變量
header = next(f_csv)#利用迭代的方法,直接取出表頭行(標(biāo)題行),更新f_csv的數(shù)據(jù),去除了標(biāo)題行
for row in f_csv:
data = {}
for index in range(7):
data[header[index]] = row[index]
dormitory_data.append(data)
這里我們對(duì)一份Excel的數(shù)據(jù),修改它的后綴名,變成CSV文件的后綴名即可,然后我們就對(duì)這個(gè)數(shù)據(jù)進(jìn)行導(dǎo)入和解析了。
這個(gè)解析過(guò)程和我們之前的一篇文章《用Python寫(xiě)一個(gè)成績(jī)計(jì)算系統(tǒng)》的有異曲同工之妙。主要要理解對(duì)表頭行的提取很數(shù)據(jù)迭代解析,最后存儲(chǔ)在一個(gè)列表里面。注意這里一般都是需要聲明全局變量的。
效果執(zhí)行
分割數(shù)據(jù)
# 分割數(shù)據(jù),按照數(shù)據(jù)的特點(diǎn)
def csv_sort():
global dicts
dicts=[];i = 0
dormitory_datas = dormitory_data.copy()#字典迭代刪除迭代數(shù)據(jù)是一個(gè)坑,需要我們時(shí)刻更新數(shù)據(jù)庫(kù)值
dormitory_datass= dormitory_data.copy()
for x in dormitory_datass:
b = []
for sort in dormitory_datass:
a_1 = sort["宿舍編號(hào)"]
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
這里不要小看這個(gè)幾行代碼,這個(gè)里面的算法是需要進(jìn)行反復(fù)的測(cè)試,才實(shí)行的,里面有幾個(gè)坑,真的是有點(diǎn)頭疼,還好最后解決了。
1.首先我們要按照一個(gè)算法去分割數(shù)據(jù),我們?yōu)g覽數(shù)據(jù)之后發(fā)現(xiàn),每一個(gè)組團(tuán)的1-4棟寢室數(shù)據(jù)都是有相關(guān)聯(lián)的,1樓到2樓的寢室編號(hào)我們按照前三位的數(shù)據(jù)節(jié)點(diǎn),進(jìn)行索引判斷,這樣去迭代每一個(gè)數(shù)據(jù),然后進(jìn)行比較,最后如果不同的話,我們就發(fā)現(xiàn)那么肯定是不同的樓層了,需要我們進(jìn)行分割數(shù)據(jù)了。
2.但是我們發(fā)現(xiàn)我們跳出循環(huán)之后,也就是迭代完1樓的寢室數(shù)據(jù)之后,我們驚奇的字典的數(shù)據(jù)雖然是變化了,但是唯獨(dú)也發(fā)生了變化,這個(gè)就是第一個(gè)坑,因?yàn)榱斜淼膭h除有一個(gè)特點(diǎn),它是利用迭代索引進(jìn)行刪除的,這個(gè)在我之前的計(jì)算機(jī)二級(jí)Python程序語(yǔ)言設(shè)計(jì)-疑難雜癥知識(shí)點(diǎn)匯總,提到了這個(gè)解決辦法。我最后利用字典的復(fù)制存儲(chǔ),不斷的去更新和彌補(bǔ)這個(gè)數(shù)據(jù)字典,bug才解決,這個(gè)時(shí)候真的需要靜下心來(lái)慢慢思索。
3.利用字典迭代算法,判斷什么時(shí)候需要分割數(shù)據(jù),最后封裝這個(gè)函數(shù)功能。
保存數(shù)據(jù)
#保存數(shù)據(jù),按照不同的分類(lèi)
def keep_data():
import csv
import os
import codecs
for w in range(65,73):
W=chr(w)
path = '%s棟寢室'%W? ? ? # 創(chuàng)建總的文件夾
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():? # 把字典的鍵取出來(lái),注意不要使用sorted不然會(huì)導(dǎo)致鍵的順序改變
a.append(headers)
header = a? # 把列名給提取出來(lái),用列表形式呈現(xiàn)
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,)? # 提前預(yù)覽列名,當(dāng)下面代碼寫(xiě)入數(shù)據(jù)時(shí),會(huì)將其一一對(duì)應(yīng)。
writer.writeheader()? # 寫(xiě)入列名
writer.writerows(dicts)? # 寫(xiě)入數(shù)據(jù)
print("{}組{}棟寢室{}樓數(shù)據(jù)已經(jīng)寫(xiě)入成功!!!! ! !".format(W,K,P))
這個(gè)功能同樣有幾個(gè)坑,首先我們需要對(duì)數(shù)據(jù)設(shè)計(jì)好迭代for循環(huán)保存,并且利用OS模塊繼續(xù)自動(dòng)的創(chuàng)建文件夾,最后對(duì)其數(shù)據(jù)進(jìn)行命名,方便我們查看還有就是我們的CSV文件里面的編碼是utf-8模式,但是Excel里面的編碼不同,這個(gè)就會(huì)造成我們的中文數(shù)據(jù)形式的亂碼問(wèn)題。
所以我們就去用了這個(gè)辦法來(lái)解決了
encoding='utf-8-sig'
下面我們來(lái)看看整體操作的演示效果
代碼升級(jí)版
1.我們還可以參考一些辦法,對(duì)這個(gè)表格數(shù)據(jù)進(jìn)行自動(dòng)制作,添加頭部文件信息,當(dāng)然我這里就不做演示了,你們可以自己去尋找不同的解決方法。
2.我們還可以對(duì)數(shù)據(jù)表格進(jìn)行網(wǎng)格線繪制,使其我們的表格更加美觀,比如字體居中等
3.編寫(xiě)一個(gè)自動(dòng)打印的程序,鏈接到我們的電腦打印機(jī),一鍵化打印這些數(shù)據(jù),極大地提高了我們的效率。
這些功能讀者可以自己去實(shí)現(xiàn),我這里就不做說(shuō)明了,畢竟代碼的涉及和項(xiàng)目不容易,哈哈哈哈!
自動(dòng)化辦公,一鍵化處理,本來(lái)就是Python的強(qiáng)項(xiàng),我們可以利用它的功能來(lái)解決我們學(xué)習(xí)生活的難題,最后我想致敬那些每天為了數(shù)據(jù)整理,瘋狂的點(diǎn)擊Excel的工作人員,畢竟這個(gè)東西頭大,難搞,枯燥,乏味
最后我想要說(shuō)的是雖然設(shè)計(jì)項(xiàng)目程序比較的頭疼,但是它可以移植,并且不斷的升級(jí),最后別人用1個(gè)小時(shí),你只需要3秒鐘運(yùn)行查看即可!
程序源碼
# -*- coding :? utf-8 -*-
# @Time? ? ? :? 2020/9/15 13:26
# @author? ? :? 王小王
# @Software? :? PyCharm
# @File? ? ? :? 寢室數(shù)據(jù)分類(lèi).py-1.0版本
# @CSDN? ? ? :? https://blog.csdn.net/weixin_47723732
# 1.解析CSV海量數(shù)據(jù),用字典保存在內(nèi)存空間
def csv_data():
global dormitory_data
import csv
dormitory_data = []
with open(r"寢室數(shù)據(jù).csv", encoding='utf-8-sig') as file:#將你的CSV文件和該程序文件放在一個(gè)文件夾下面
f_csv = csv.reader(file)#讀取文件里面的每一行數(shù)據(jù),轉(zhuǎn)換為列表賦值給新的變量
header = next(f_csv)#利用迭代的方法,直接取出表頭行(標(biāo)題行),更新f_csv的數(shù)據(jù),去除了標(biāo)題行
for row in f_csv:
data = {}
for index in range(7):
data[header[index]] = row[index]
dormitory_data.append(data)
# 分割數(shù)據(jù),按照數(shù)據(jù)的特點(diǎn)
def csv_sort():
global dicts
dicts=[];i = 0
dormitory_datas = dormitory_data.copy()#字典迭代刪除迭代數(shù)據(jù)是一個(gè)坑,需要我們時(shí)刻更新數(shù)據(jù)庫(kù)值
dormitory_datass= dormitory_data.copy()
for x in dormitory_datass:
b = []
for sort in dormitory_datass:
a_1 = sort["宿舍編號(hào)"]
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
#保存數(shù)據(jù),按照不同的分類(lèi)
def keep_data():
import csv
import os
import codecs
for w in range(65,73):
W=chr(w)
path = '%s棟寢室'%W? ? ? # 創(chuàng)建總的文件夾
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():? # 把字典的鍵取出來(lái),注意不要使用sorted不然會(huì)導(dǎo)致鍵的順序改變
a.append(headers)
header = a? # 把列名給提取出來(lái),用列表形式呈現(xiàn)
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,)? # 提前預(yù)覽列名,當(dāng)下面代碼寫(xiě)入數(shù)據(jù)時(shí),會(huì)將其一一對(duì)應(yīng)。
writer.writeheader()? # 寫(xiě)入列名
writer.writerows(dicts)? # 寫(xiě)入數(shù)據(jù)
print("{}組{}棟寢室{}樓數(shù)據(jù)已經(jīng)寫(xiě)入成功!!!! ! !".format(W,K,P))
def main():
csv_data()
keep_data()
if __name__ == '__main__':
main()
學(xué)到了嗎?學(xué)到了就點(diǎn)贊轉(zhuǎn)發(fā)呀!
此文轉(zhuǎn)載文,著作權(quán)歸作者所有,如有侵權(quán)聯(lián)系小編刪除!
總結(jié)
以上是生活随笔為你收集整理的python文本分类汇总_用Python解决海量数据的分类汇总一键化办公的神器!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 海量数据处理问题知识点复习手册
- 下一篇: 「Python海龟画图」利用海龟画笔绘制