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文件中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章