背景
最近需要把一份csv文件里的数据读出来,然后删除里边的人名所在的整行数据,然后把数据清洗过后的数据在写入到一份新的csv文件中。
思路
- 使用Python中的csv模块对csv文件进行读取,生成一个list
- 循环删除list中不符合条件的元素
- 将最终的list中的数据在写入到一个新的csv文件里,这里依然借助csv模块。
遇到的坑
在循环遍历删除list中不符合条件的元素时,发现最终得到的list中还是有不符合条件的元素存在,后来经过网上查资料得到以下解释。
a = [1,2,3,4,5,6]
for i in a:
a.remove(i)
print(a)
# 返回:[2, 4, 6]
想通过循环遍历list a
删除a
的所有元素,但实际确有数据保留了下来!!!
因为在循环a
,并删除a
的元素时,列表的位置发生了移位,当删除1
后,第二个元素2
补位,这样2
就躲过了被删除的命运,轮到3
了,3
被删除之后,4
来补位,逃过一劫,以此类推!!
结论
在循环list时,不能循环的同时删除自身元素
解决办法
- 新建一个相同的临时列表,用for循环临时列表,删除原列表中的元素!
- 使用Python中的深拷贝对原列表拷贝一份作为临时列表,然后用for循环临时列表,删除原列表中的元素!
现在回归到csv文件处理的那个问题上,有了上边的解决办法,这样一来问题就迎刃而解了。
代码示例
from copy import deepcopy
import csv
with open("/home/桌面/cs.csv", encoding='gbk') as f:
reader = csv.reader(f)
rows = [row for row in reader]
rows1 = deepcopy(rows)
while True:
name = input('请输出name,输入0退出>>>')
if name == '0':
break
else:
for i in rows1:
if name == i[3]:
rows.remove(i)
with open('/home/桌面/cs_new.csv', 'w', newline='', encoding='utf-8') as csv_file:
writer = csv.writer(csv_file)
writer.writerows(rows)
以上程序支持循环删除csv文件中不符合条件的name所在的整行数据(也就是一个list)。输入0
跳出循环并将最终拿到的符合要求的list的数据写入到一个新的csv文件中。