You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python删除CSV文件中指定完整行数据的问题求助

根据完整行数据删除CSV对应行的解决方案

原始CSV内容

Veids;Razotajs;Modelis;Spec;Cena
HDD;Seagate;Barracuda;1TB;35,99
HDD;Seagate;Barracuda;2TB;79
HDD;Intenso;;5TB;140
HDD;Fujitsu;;1TB;71,4
HDD;Western Digital;Purple Series;2TB;59
SSD;Western Digital;Blue;500GB;57
SSD;Samsung;970 EVO Plus;500GB;90,99
RAM;Corsair;Vengeance LPX;16GB;99
RAM;Corsair;ValueSelect;4G;27
RAM;Kingston;HyperX Fury Black;8GB;46
RAM;Patriot;Viper Steel;64GB;355
GPU;Gigabyte;GeForce GT 710;2GB;79
GPU;Asus;TUF Radeon RX 6900 XT;16GB;2625
GPU;Asus;GeForce GTX 1650;4GB;349
GPU;Palit;GeForce GT 710;2GB;52
CPU;AMD;Ryzen 5 3600;3.6GHz;239
CPU;AMD;Ryzen 7 5800X;3.8GHz;469
CPU;Intel;i7-10700K;3.8GHz;327
CPU;Intel;i9-11900;2.5GHz;455
MB;Gigabyte;B450 AORUS Elite V2;;96,93
MB;MSI;Z490-A PRO;;165
MB;Asus;TUF GAMING B460-PLUS;;113,99
MB;ASRock;B460M Pro4;;100
PSU;Be Quiet!;System Power 9;500W;54
PSU;Chieftec;ATX 2.3;600W;45,98
PSU;Corsair;TX-M Series;750W;110,46
PSU;Corsair;ATX 2.4;650W;89
Korpuss;Corsair;iCUE 220T RGB Black;;109
Korpuss;Aerocool;Cylon Mini RGB Black;;56
Korpuss;Aerocool;Zauron Mid-Tower ATX Black;;55
Korpuss;Chieftec;Mini Tower IX-01B-OP;;32
Disc;Asus;ZenDrive U9M External DVD Writer Silver;;36,3
Disc;Gembird;External USB CD/DVD Drive;;18,1
PSU;Corsair;ATX 2.4;650W;89
asd;sadad;asffa;2355hgh;423

问题背景

需要编写函数根据完整行内容删除CSV对应行,但尝试的方法均存在问题:

  • 结合csv模块与pandas的set_value方法,报错:
    AttributeError: 'DataFrame' object has no attribute 'set_value'. Did you mean: '_set_value'
    
  • 仅用csv模块操作,输出CSV出现多余空行;
  • 使用pandas的drop方法,无任何效果。

需求:从GUI获取完整行(如RAM;Kingston;HyperX Fury Black;8GB;46)后,删除CSV中对应行,生成新的CSV文件。


解决方案

方法1:使用pandas实现

drop方法无效通常是因为未正确匹配行数据或未保存结果。以下是可靠实现:

import pandas as pd

def delete_row_by_full_line(csv_path, target_line, sep=';'):
    # 读取CSV,指定分号为分隔符
    df = pd.read_csv(csv_path, sep=sep)
    # 将目标行拆分为列值列表
    target_values = target_line.split(sep)
    # 匹配所有列完全一致的行
    match_mask = (df == target_values).all(axis=1)
    # 保留不匹配的行
    cleaned_df = df[~match_mask]
    # 保存清理后的CSV,禁止生成索引列
    cleaned_df.to_csv(csv_path, sep=sep, index=False)

# 调用示例
target = "RAM;Kingston;HyperX Fury Black;8GB;46"
delete_row_by_full_line('your_file.csv', target)

关键说明:

  • 目标行拆分后的列表能完美匹配CSV中的空白字段(如空的Modelis列);
  • ~match_mask用于取反,过滤掉匹配的行;
  • 保存时必须加index=False,避免额外生成索引列。

方法2:使用csv模块解决空行问题

csv模块生成空行的原因是打开文件时未指定newline='',导致换行符处理异常。正确写法:

import csv

def delete_row_by_full_line(csv_path, target_line):
    rows = []
    # 读取所有行,指定newline=''避免换行符问题
    with open(csv_path, 'r', newline='', encoding='utf-8') as f:
        reader = csv.reader(f, delimiter=';')
        for row in reader:
            # 将当前行转为与目标行一致的字符串格式
            current_line = ';'.join(row)
            if current_line != target_line:
                rows.append(row)
    # 写入清理后的行,同样指定newline=''
    with open(csv_path, 'w', newline='', encoding='utf-8') as f:
        writer = csv.writer(f, delimiter=';')
        writer.writerows(rows)

# 调用示例
target = "RAM;Kingston;HyperX Fury Black;8GB;46"
delete_row_by_full_line('your_file.csv', target)

关键说明:

  • newline=''让csv模块自行处理换行符,避免多余空行;
  • 统一编码为utf-8,防止读写时出现乱码;
  • 通过';'.join(row)将行转为字符串,与目标行直接比较,确保匹配准确。

内容的提问来源于stack exchange,提问作者DeathLight

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:20:34