将csv中根据某列重复数据将整行删除

本文介绍如何处理批量CSV文件,首先转换非UTF-8编码,然后动态定位'age'列,提取并检测重复值,最终删除重复行并保存至新的UTF-8编码CSV文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目场景:

目前对接需求,是要根据某列重复数据,将重复数据整行删除。其中将会遇到一个小问题,批量文件编码会有问题,可能出现非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'+ "保存成功")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

经常喝假酒的胡小臣

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

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

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

打赏作者

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

抵扣说明:

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

余额充值