Python如何覆盖或删除CSV文件行:用另一CSV行随机替换指定行
问题原因说明
csv.writer.writerow()方法仅接受1个可迭代对象作为输入(代表单行数据),你传入row和riga两个参数属于用法错误,会直接抛出参数数量异常。- CSV是流式文本格式,不支持局部修改中间行内容。你用
r+模式打开文件后先读取了全部内容,文件指针已移动到末尾,此时写入只会在文件尾部追加内容,无法覆盖已有行。 - 直接对原文件读写容易出现内容损坏,更稳妥的方案是先把目标CSV的全量内容加载到内存修改,完成后再整体写回文件。
实现方案
方案1:随机覆盖目标行(推荐)
import csv import random # 先读取cache.csv的完整内容,保留表头 with open("cache.csv", "r") as f: cache_reader = csv.reader(f) cache_header = next(cache_reader) cache_rows = list(cache_reader) # 读取size.csv内容 with open('/content/drive/MyDrive/Colab Notebooks/size.csv') as f: size_reader = csv.reader(f) for row in size_reader: # 保留你原有的判断逻辑 if self.cache_max - self.observation < int(row[1]): # 过滤出和当前size行第一列不相等的cache行,和你原有逻辑对齐 valid_rows = [r for r in cache_rows if r[0] != row[0]] if valid_rows: # 随机选一个要替换的行的索引 replace_idx = random.randint(0, len(cache_rows)-1) # 覆盖对应行 cache_rows[replace_idx] = row # 如果你每行只需要替换一次,处理完可以加break,按需调整 # 修改完成后把全量内容写回cache.csv with open("cache.csv", "w", newline="") as f: writer = csv.writer(f) writer.writerow(cache_header) writer.writerows(cache_rows)
方案2:删除随机行后追加到末尾
如果不需要保留原cache的行数位置,可以用更简单的实现:
import csv import random with open("cache.csv", "r") as f: cache_reader = csv.reader(f) cache_header = next(cache_reader) cache_rows = list(cache_reader) with open('/content/drive/MyDrive/Colab Notebooks/size.csv') as f: size_reader = csv.reader(f) for row in size_reader: if self.cache_max - self.observation < int(row[1]): valid_rows = [r for r in cache_rows if r[0] != row[0]] if valid_rows: # 随机删除一行 del_idx = random.randint(0, len(cache_rows)-1) del cache_rows[del_idx] # 新行追加到末尾 cache_rows.append(row) # 写回文件 with open("cache.csv", "w", newline="") as f: writer = csv.writer(f) writer.writerow(cache_header) writer.writerows(cache_rows)
注意事项
- 写入CSV时加
newline=""参数是Python处理CSV的规范写法,可以避免Windows环境下出现多余空行。 - 代码中保留了你原有的
compare_row[0] != row[0]的过滤逻辑,如果不需要可以直接删除valid_rows的判断。 - 如果要处理多次替换逻辑,注意控制替换次数,避免出现重复替换同一行的情况。
内容的提问来源于stack exchange,提问作者mark99
相关产品推荐
相关产品推荐

