如何修改CSV指定行单字段值 且可同步对数据进行运算处理
实现方案
原有代码核心问题
- 索引使用错误:需求要求校验索引为1的第二个字段是否为USA,原有代码错误判断
line[2],同时误将国家字段当做价格字段转int,会直接抛出类型错误 - CSV reader是单向迭代器:遍历一次后文件指针已到末尾,后续再次遍历无法读取到任何内容
- 语法错误:写入行的代码
[row[0], row[1], ,new_price]存在多余逗号,无法运行 - 文件打开模式错误:只读模式打开的文件无法执行写入操作
小文件最优实现(先读入内存处理)
3行3列的文件体积极小,直接读入内存处理逻辑更简单,无需临时文件:
import csv # 读取所有行并打印原内容 all_rows = [] with open("countries.csv", "r", newline="", encoding="utf-8") as f: reader = csv.reader(f, delimiter=";") for row in reader: print(*row, sep=";") all_rows.append(row) # 逐行处理USA对应价格 for row in all_rows: if row[1] == "USA": # 价格乘2后替换原字段 row[2] = str(int(row[2]) * 2) # 写回处理后的内容到原文件 with open("countries.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f, delimiter=";", quoting=csv.QUOTE_MINIMAL) writer.writerows(all_rows)
大文件临时文件方案
如果后续处理大文件内存放不下,使用临时文件方案只需一次遍历完成所有操作即可:
import csv import os with open("countries.csv", "r", newline="", encoding="utf-8") as old_file, \ open("countries.tmp", "w", newline="", encoding="utf-8") as tmp_file: reader = csv.reader(old_file, delimiter=";") writer = csv.writer(tmp_file, delimiter=";", quoting=csv.QUOTE_MINIMAL) for row in reader: # 打印原行内容 print(*row, sep=";") # 处理USA行价格 if row[1] == "USA": row[2] = str(int(row[2]) * 2) # 写入临时文件 writer.writerow(row) # 用处理后的临时文件替换原文件 os.replace("countries.tmp", "countries.csv")
内容的提问来源于stack exchange,提问作者Mirek6
相关产品推荐
相关产品推荐

