python批量查询、汉字去重处理CSV文件
CSV文件用记事本打开后一般为由逗号隔开的字符串,其处理方法用Python的代码如下。为方便各种程度的人阅读在代码中有非常详细的注释。
1.查询指定列,并保存到新的csv文件。
#-*-coding:utf-8-*-
'''''
Author:Good_Night
Time:2018/1/3003:50
Edition:1.0
'''
#导入必须的csv库
importcsv
#创建临时文件temp.csv找出所需要的列
temp_file=open("temp.csv","w",newline='')#如果不指定newline='',则每写入一行将有一空行被写入
temp_csv_writer=csv.writer(temp_file,dialect="excel")
#读取input.csv文件,此时只有指定的一列数据
withopen('input.csv')asfile:
temp_readcsv=csv.reader(file,delimiter=',')
forrowintemp_readcsv:#取出input.csv所有列数据
temp=[row[3]]#得到指定列数据
#print(row[3])#print()打印input.csv文件中第3列所有数据
temp_csv_writer.writerow(temp)#第3列每行数据循环写入temp.csv文件中
temp_file.close()
2.查询指定列中,每行数据出现在所有行数据的次数,并保存到新的csv文件。
#-*-coding:utf-8-*-
'''''
Author:Good_Night
Time:2018/1/3003:50
Edition:1.0
'''
#导入必须的csv库
importcsv
#创建临时文件temp.csv找出所需要的列
temp_file=open("temp.csv","w",newline='')#如果不指定newline='',则每写入一行将有一空行被写入
temp_csv_writer=csv.writer(temp_file,dialect="excel")
#读取input.csv文件,此时只有指定的一列数据
withopen('input.csv')asfile:
temp_readcsv=csv.reader(file,delimiter=',')
forrowintemp_readcsv:#取出input.csv所有列数据
temp=[row[3]]#得到指定列数据
#print(row[3])#print()打印input.csv文件中第3列所有数据
temp_csv_writer.writerow(temp)#第3列每行数据循环写入temp.csv文件中
temp_file.close()
#在临时文件基础上匹配所要找的数据,计算出次数生成out.csv文件
flag=0#临时变量
out1=[]#新建数组来保存指定列的每行数据
time=[]#新建数组来保存指定列的每行数据出现的次数
out_file=open("out.csv","w",newline='')#如果不指定newline='',则每写入一行将有一空行被写入
out_csv_writer=csv.writer(out_file,dialect="excel")
out_csv_writer.writerow(["TIMES"])
#读取temp.csv文件,此时只有指定的一列数据
withopen('temp.csv')asfile2:
out_readcsv=csv.reader(file2,delimiter=',')
forStinout_readcsv:#循环取出列的每行数据
out1.append(St)#append()将列的每行数据变为out1链表(list)的后续增加的元素,即将列数据变为一维数组。
#print(out1[1])#打印out1[n]的第n个元素,即原列的第n行元素
foriinrange(len(out1)):#len()获得out1链表(list)中元素的个数,便于判断循环次数。
#print(out1[i])#打印out1链表所有元素,检验循环是否出错
flag=out1.count(out1[i])#count()获得out1链表中第i个元素在所有元素中出现的次数。
time.append(flag)#将获得的某元素出现的次数按顺序保存至time[]数组里
#print(time)#打印显示所有元素出现的次数,判断是否出错
forjinrange(len(out1)):#len()得到out1链表元素个数,依此作为time[]查找下标
times=[time[j]]#取出元素对应出现的次数
out_csv_writer.writerow(times)#写入out.csv文件里
print(times)#打印显示次数
out_file.close()
因为是批量处理嘛~所以写的是所有数据重复出现的次数(但这个有点BUG,可能看完代码就知道了,没有去重!!!举个例子说a出现在第一行和第三行共2次,结果出来后就是第一行出现a,对应次数为2,第三行又出现a,对应次数也是2....这就是没有去重的麻烦之处,重复的数据会再次显示。)。但稍微修改一下可实现搜索某一数据出现的次数啦~
3.查询指定列中,每行数据出现在所有行数据的次数,去重处理后,并保存到新的csv文件。
一般去重都是数字或者字符去重,可以直接调用相应函数,而汉字去重就比只能循环比较了。所以这个算是包容性相当大的一种方式。
#-*-coding:utf-8-*-
'''''
Author:GoodNight
Time:2018/2/718:50
Edition:2.0
'''
#导入必须的csv库
importcsv
#创建临时文件temp.csv找出所需要的列
temp_file=open("temp.csv","w",newline='')#如果不指定newline='',则每写入一行将有一空行被写入
temp_csv_writer=csv.writer(temp_file,dialect="excel")
#读取input.csv文件,此时只有指定的一列数据
withopen('input.csv')asfile:
temp_readcsv=csv.reader(file,delimiter=',')
forrowintemp_readcsv:#取出input.csv所有列数据
temp=[row[3]]#得到指定列数据
#print(row[3])#print()打印input.csv文件中第3列所有数据
temp_csv_writer.writerow(temp)#第3列每行数据循环写入temp.csv文件中
temp_file.close()
#在临时文件基础上匹配所要找的数据,计算出次数生成out.csv文件
out1=[]#新建数组来保存指定列的每行数据
out_time=[]#新建数组来保存指定列的每行数据出现的次数
out_file=open("out.csv","w",newline='')#如果不指定newline='',则每写入一行将有一空行被写入
out_csv_writer=csv.writer(out_file,dialect="excel")
out_csv_writer.writerow(["ID","TIMES"])#写入标题数据,出现次数
#读取temp.csv文件,此时只有指定的一列数据
withopen('temp.csv')asfile2:
out_readcsv=csv.reader(file2,delimiter=',')
forStinout_readcsv:#循环取出列的每行数据
out1.append(St)#append()将列的每行数据变为out1链表(list)的后续增加的元素,即将列数据变为一维数组。
print(out1)#打印out1[n]的第n个元素,即原列的第n行元素
#list的迭代其实是以list中项的序列号来遍历的,不会因为list的的改变而改变,
#永远都是按照序号的0,1,2...遍历。当删除其中某一项时,它之后的每一项的序列号各往前移一项.
#当遍历list时,若发现0项是重复项(因为内嵌函数均处理第一个发现项),于是将其移除。当移除0项时,
#原来的1项变为0项,以此类推。此时list迭代由1开始(0项已过),但此时的1项是原list的2项,这样子就漏掉原list的1项!
#可以将list反转来进行删除操作,其本质就是放当发现某项具有重复项时,就从后往前删除。
#比如迭代0项发现1项是它的重复项,那么就删除1项,删除1项后2项变1项,而此时list迭代正则到了1项。
#从原始list的角度上来说,就跳过了1项。但是它却不影响去重,因为它跳过的是重复项。
#list的不重复迭代反而使去重效率更高且不会漏掉不重复项。因此原始list直接去重的核心问题不是迭代的漏项,而是迭代不能漏掉不重复项。
foriinout1:
a=out1.count(i)#取元素
out_time.append(a)#得到出现的次数
#print(i,a)
ifa>1:
out1.reverse()#将list反转来进行删除操作
forkinrange(1,a):
out1.remove(i)#从后往前删除直到最前面的第一个为止,这样即删除了后面的,又保留了第一个!
out1.reverse()#将list再反转回来,保证下次循环又是从原始顺序来删除
print(out1)#此时out1链表(list)即去重后的list
print(out_time)#元素出现的次数
forjinrange(len(out1)):#len()得到out1链表元素个数,依此作为time[]查找下标
out_row=[out1[j],out_time[j]]#取元素和对应的次数
out_csv_writer.writerow(out_row)#写入out.csv文件里
out_file.close()
划重点!这个代码是经过了去重处理后的,完全不用担心会有重复数据显示啦~
Python处理此类数据相当快,大概一万行数据只需要1秒.......
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。