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
相关产品推荐
相关产品推荐

