Python读取csv文件(循环删除列表中符合条件的元素)

背景

最近需要把一份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时,不能循环的同时删除自身元素

解决办法

  1. 新建一个相同的临时列表,用for循环临时列表,删除原列表中的元素!
  2. 使用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文件中。