项目场景:
目前对接需求,是要根据某列重复数据,将重复数据整行删除。其中将会遇到一个小问题,批量文件编码会有问题,可能出现非utf-8编码
解决方案
首先遇到这个问题,我们首先需要将所给的CSV表格批量全部转成utf-8编码,这里我是通过小工具批量进行转换,软件名称叫做TextEncoding,之后我们在进行需求实现。
第一步:
首先将在.py同一级别下创建inputcsv文件夹,将批量全部转成utf-8编码的CSV放入其中,循环读取里面文件名
osfile = []
dir = r"./inputcsv/"
for root, dirs, files in os.walk(dir):
for file in files:
if file.split('.')[1] == 'csv':
osfile.append(file)
print(osfile)
print("+++++++++++++++++++++++++++++")
因为需求中每个CSV文件夹里面age所在列不同,表现形式不同有的是写程ages,ages(MA),AGE这种,所有需要动态找到标签所在的列因此代码为:`
ageint = -1
for index in range(len(content[0])):
if content[0][index].lower().find('age')!=-1:#头标签全部转换的小写,再找age在哪列
ageint=index
if ageint != -1:
print("age在第X列"+str(ageint))
# 将age这列单独存放
ages = []
for indexage in range(1,len(content)):
# print(content[indexage][ageint])
ages.append(content[indexage][ageint])
print(ages)
print("+++++++++++++++++++++++++++++")
将age放入到一个数组里面用一个前后值比较找到重复的数值,将该数值下标存入到列表中,因为存在多个重复原因,因此进一步将重复数值下标从低到高排序,这样得到一个要删除的重复值下标列表。
# 将所有重复的数字下标都存在一个数组里面
congfutest = []
congfu = []
for i in range(0, len(ages)):
for j in range(i + 1, len(ages)):
if ages[i] == ages[j]:
congfutest.append(j)
print(congfutest)
print("=================================")
seen = set()
for item in congfutest:
if item not in seen:
seen.add(item)
congfu.append(item+1)# 加上第一行标签行
print(congfu)
congfu.sort()# 排序
print(congfu)
最后删除重复值存入到自定的一个同级py的一个文件夹。
for counter, index in enumerate(congfu):
index = index - counter
content.pop(index)
for index in range(len(content)):
print(content[index])
with open('./outputcsv/'+osfile[indexFile].split('.')[0]+'.csv', "w",encoding='utf-8', newline="") as csvfile:
writer = csv.writer(csvfile)
# 先写入columns_name
writer.writerow(content[0])
# 写入多行用writerows
for index in range(1,len(content)):
writer.writerow(content[index])
print(osfile[indexFile].split('.')[0]+'.csv'+ "保存成功")
整体代码
import csv
import os
import pandas as pd
import numpy as np
osfile = []
dir = r"./inputcsv/"
for root, dirs, files in os.walk(dir):
for file in files:
if file.split('.')[1] == 'csv':
osfile.append(file)
print(osfile)
print("+++++++++++++++++++++++++++++")
for indexFile in range(len(osfile)):
csv_file=csv.reader(open('./inputcsv/'+osfile[indexFile],'r',encoding='utf-8'))
print(osfile[indexFile].split('.')[0]+'.csv'+ "开始")
content=[] #用来存储整个文件的数据,存成一个列表,列表的每一个元素又是一个列表,表示的是文件的某一行
for line in csv_file:
if line:
content.append(line)
# print(content[0])
# 确定Age这列所在的位置
ageint = -1
for index in range(len(content[0])):
if content[0][index].lower().find('age')!=-1:#头标签全部转换的小写,再找age在哪列
ageint=index
if ageint != -1:
print("age在第X列"+str(ageint))
# 将age这列单独存放
ages = []
for indexage in range(1,len(content)):
# print(content[indexage][ageint])
ages.append(content[indexage][ageint])
print(ages)
print("+++++++++++++++++++++++++++++")
# 将所有重复的数字下标都存在一个数组里面
congfutest = []
congfu = []
for i in range(0, len(ages)):
for j in range(i + 1, len(ages)):
if ages[i] == ages[j]:
congfutest.append(j)
print(congfutest)
print("=================================")
seen = set()
for item in congfutest:
if item not in seen:
seen.add(item)
congfu.append(item+1)# 加上第一行标签行
print(congfu)
congfu.sort()# 排序
print(congfu)
# 删除重复的行
for counter, index in enumerate(congfu):
index = index - counter
content.pop(index)
for index in range(len(content)):
print(content[index])
with open('./outputcsv/'+osfile[indexFile].split('.')[0]+'.csv', "w",encoding='utf-8', newline="") as csvfile:
writer = csv.writer(csvfile)
# 先写入columns_name
writer.writerow(content[0])
# 写入多行用writerows
for index in range(1,len(content)):
writer.writerow(content[index])
print(osfile[indexFile].split('.')[0]+'.csv'+ "保存成功")