Python批量查询与汉字去重处理CSV文件实战
本文介绍使用Python处理CSV文件的两种方法:一是批量查询指定列并保存结果;二是统计指定列数据出现次数。重点讲解第二种方法中存在的重复显示问题,并提供经过优化的去重处理代码,特别针对汉字去重进行了优化,确保输出结果无重复数据且包含出现频次,适用于大规模数据快速处理场景。
使用记事本打开CSV文件时,通常看到的是由逗号分隔的字符串序列。利用Python代码可以高效处理这类数据,下文提供的代码包含详尽注释,旨在帮助不同技术水平的读者理解实现逻辑。
第一步操作是提取指定列的数据,并将提取结果保存至一个新的CSV文件中。
# -*- coding: utf-8 -*-
'''''
Author: Good_Night
Time: 2018/1/30 03:50
Edition: 1.0
'''
# 导入必须的csv库
import csv
# 创建临时文件temp.csv找出所需要的列
temp_file = open("temp.csv", "w", newline='') # 如果不指定newline='',则每写入一行将有一空行被写入
temp_csv_writer = csv.writer(temp_file, dialect="excel")
# 读取input.csv文件,此时只有指定的一列数据
with open('input.csv') as file:
temp_readcsv = csv.reader(file, delimiter=',')
for row in temp_readcsv: # 取出input.csv所有列数据
temp = [row[3]] # 得到指定列数据
# print(row[3]) #print()打印input.csv文件中第3列所有数据
temp_csv_writer.writerow(temp) # 第3列每行数据循环写入temp.csv文件中
temp_file.close()
第二步操作是统计指定列中每一行数据在整个列数据中出现的总次数,并将统计结果保存至一个新的CSV文件中。
# -*- coding: utf-8 -*-
'''''
Author: Good_Night
Time: 2018/1/30 03:50
Edition: 1.0
'''
# 导入必须的csv库
import csv
# 创建临时文件temp.csv找出所需要的列
temp_file = open("temp.csv", "w", newline='') # 如果不指定newline='',则每写入一行将有一空行被写入
temp_csv_writer = csv.writer(temp_file, dialect="excel")
# 读取input.csv文件,此时只有指定的一列数据
with open('input.csv') as file:
temp_readcsv = csv.reader(file, delimiter=',')
for row in temp_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文件,此时只有指定的一列数据
with open('temp.csv') as file2:
out_readcsv = csv.reader(file2, delimiter=',')
for St in out_readcsv: # 循环取出列的每行数据
out1.append(St) # append()将列的每行数据变为out1链表(list)的后续增加的元素,即将列数据变为一维数组。
# print(out1[1]) # 打印out1[n]的第n个元素,即原列的第n行元素
for i in range(len(out1)): # len()获得out1链表(list)中元素的个数,便于判断循环次数。
# print(out1[i]) # 打印out1链表所有元素,检验循环是否出错
flag = out1.count(out1[i]) # count()获得out1链表中第i个元素在所有元素中出现的次数。
time.append(flag) # 将获得的某元素出现的次数按顺序保存至time[]数组里
# print(time) # 打印显示所有元素出现的次数,判断是否出错
for j in range(len(out1)): # len()得到out1链表元素个数,依此作为time[]查找下标
times = [time[j]] # 取出元素对应出现的次数
out_csv_writer.writerow(times) # 写入out.csv文件里
print(times) # 打印显示次数
out_file.close()
由于这是批量处理场景,上述代码统计的是所有数据重复出现的总次数。但该方法存在一个逻辑缺陷:它并未进行去重处理。例如,若字符“a”出现在第一行和第三行,统计结果会显示第一行“a”出现2次,第三行“a”也出现2次,导致重复数据在输出中再次显现。不过,稍作修改即可实现针对特定数据的频次查询。
第三步操作是对指定列中每行数据出现的次数进行统计,并在输出前进行去重处理,最终将去重后的结果保存至新的CSV文件。
常规去重多针对数字或英文字符,可直接调用内置函数完成。然而,汉字去重往往需要手动编写循环进行比较,因此本文提供的方法具有较好的通用性和包容性。
# -*- coding: utf-8 -*-
'''''
Author: Good Night
Time: 2018/2/7 18:50
Edition: 2.0
'''
# 导入必须的csv库
import csv
# 创建临时文件temp.csv找出所需要的列
temp_file = open("temp.csv", "w", newline='') # 如果不指定newline='',则每写入一行将有一空行被写入
temp_csv_writer = csv.writer(temp_file, dialect="excel")
# 读取input.csv文件,此时只有指定的一列数据
with open('input.csv') as file:
temp_readcsv = csv.reader(file, delimiter=',')
for row in temp_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文件,此时只有指定的一列数据
with open('temp.csv') as file2:
out_readcsv = csv.reader(file2, delimiter=',')
for St in out_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直接去重的核心问题不是迭代的漏项,而是迭代不能漏掉不重复项。
for i in out1:
a = out1.count(i) # 取元素
out_time.append(a) # 得到出现的次数
# print(i, a)
if a > 1:
out1.reverse() # 将list反转来进行删除操作
for k in range(1, a):
out1.remove(i) # 从后往前删除直到最前面的第一个为止,这样即删除了后面的,又保留了第一个!
out1.reverse() # 将list再反转回来,保证下次循环又是从原始顺序来删除
print(out1) # 此时out1链表(list)即去重后的list
print(out_time) # 元素出现的次数
for j in range(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秒左右。
以上即为本文的全部内容,希望能为读者的学习提供有益参考,同时也欢迎大家对本站给予支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









