背景
最近需要把一份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文件中。