python爬蟲系列之數據的存儲(二):csv庫的使用


上一篇我們講了怎么用 json格式保存數據,這一篇我們來看看如何用 csv模塊進行數據讀寫。

一、csv簡介

CSV (Comma Separated Values),即逗號分隔值(也稱字符分隔值,因為分隔符可以不是逗號),是一種常用的文本格式,用來存儲表格數據,包括數字或者字符。

csv的使用很廣泛,很多程序都會涉及到 csv的使用,但是 csv卻沒有通用的標准,所以在處理csv格式時常常會碰到麻煩。

因此在使用 csv時一定要遵循某一個標准,這不是固定的,但每個人都應該有一套自己的標准,這樣在使用 csv時才不會犯低級錯誤。

二、csv庫的使用

關於 csv庫的使用,我們從寫和讀兩個方面來講。

csv庫有四個主要的類 writer,DictWriter,reader,DictReader

reader和 DictReader都接受一個可以逐行迭代的對象作為參數,一般是一個包含 csv格式數據的文件對象。

writer和 DictWriter則接受一個 csv文件對象,csv格式的數據將會寫入到這個文件中。

他們都會返回一個對應的對象,我們通過這個對象來進行數據的讀和寫。

這四者中 reader和 writer對應,DictReader和 DictWriter對應,也就是說通過 writer類寫的 csv文件只能通過 reader類來讀取,DictReader同理。

1、csv將數據寫入文件

#-*- coding: utf-8 -* import csv #通過 writer類寫入數據 #待寫入的數據 注意到兩個列表的元素個數不一樣 test_writer_data_1 = ['Tom', 'Cody', 'Zack'] test_writer_data_2 = ['Mike', 'Bill'] #創建並打開文件 with open('test_writer.csv', 'w', newline='', encoding='utf-8') as csvfile: #獲得 writer對象 delimiter是分隔符 默認為 "," writer = csv.writer(csvfile, delimiter=' ') #調用 writer的 writerow方法將 test_writer_data寫入 test_writer.csv文件 writer.writerow(test_writer_data_1) writer.writerow(test_writer_data_2) #通過 DictWriter類寫入數據 #待寫入的數據 注意到待寫入的數據類型為 dict 且第二個字典沒有 lastname test_dict_writer_data_1 = {'firstname': 'Tom', 'lastname': 'Loya'} test_dict_writer_data_2 = {'firstname': 'Tom', 'lastname': 'Loya'} #創建並打開文件 with open('test_dict_writer.csv', 'w', newline='', encoding='utf-8') as csvfile: #設置表頭 fieldnames=['firstname', 'lastname'] # 獲得 DictWriter對象 delimiter是分隔符 默認為 "," 表頭為 'firstname' 'lastname' dict_writer = csv.DictWriter(csvfile, delimiter=' ', fieldnames=fieldnames) #第一次寫入數據先寫入表頭 dict_writer.writeheader() #調用 DictWriter的 writerow方法將 test_dict_writer_data寫入 test_dict_writer.csv文件 dict_writer.writerow(test_dict_writer_data_1) dict_writer.writerow(test_dict_writer_data_2) 

前面講到,csv沒有統一的標准,通過上面的例子我們可以發現,csv對寫入的數據不做任何檢查,也就是說幾乎沒有任何標准可言。

我們發現 writerow方法不會對數據進行檢查,即使前后兩句 writerow語句寫入的數據的格式不同也不會報錯。

所以在用 csv寫入數據時要特別注意數據的格式問題!!!

也可以用 writerows(list) 一次寫入多行,例如:

with open('test_writer.csv', 'w', newline='', encoding='utf-8') as csvfile: #獲得 writer對象 delimiter是分隔符 默認為 "," writer = csv.writer(csvfile, delimiter=' ') #調用 writer的 writerows方法將 test_writer_data寫入 test_writer.csv文件 writer.writerows([test_writer_data_1, test_writer_data_2]) with open('test_dict_writer.csv', 'w', newline='', encoding='utf-8') as csvfile: #設置表頭 fieldnames=['firstname', 'lastname'] # 獲得 DictWriter對象 delimiter是分隔符 默認為 "," 表頭為 'firstname' 'lastname' dict_writer = csv.DictWriter(csvfile, delimiter=' ', fieldnames=fieldnames) #第一次寫入數據先寫入表頭 dict_writer.writeheader() #調用 DictWriter的 writerows方法將 test_dict_writer_data寫入 test_dict_writer.csv文件 dict_writer.writerows([test_dict_writer_data_1, test_dict_writer_data_2]) 

2、csv從文件讀取數據

#-*- coding: utf-8 -* import csv #通過 reader讀取文件內容 注意到之前我們設置了 delimiter為空格,這里也要繼續設置為空格 with open('test_writer.csv', 'r', newline='', encoding='utf-8') as csvfile: reader = csv.reader(csvfile, delimiter=' ') for row in reader: print(row) with open('test_dict_writer.csv', 'r', newline='', encoding='utf-8') as csvfile: dict_reader = csv.DictReader(csvfile, delimiter=' ') for row in dict_reader: print(row) 

打印結果:

 
 

觀察打印出的結果我們發現,reader讀取的內容打印出來后還是列表格式,而 DictReader讀取的內容卻變為了列表加元組的格式,顯然和我們剛開時傳入的字典格式很不同。

而我們總是希望輸入和輸出能夠一致,但是 csv模塊並沒有提供這樣的方法,所以我們需要自己將 csv模塊再進行一次封裝,封裝后的包應該滿足下面的標准:

  1. 統一的分隔符 delimiter
  2. 統一的編碼
  3. 統一的打開文件的方式
  4. 能夠自己判斷文件是否存在並且選擇合適的方式打開文件
  5. 輸入格式和輸出格式保持一致
  6. 強制檢查格式,格式錯誤禁止插入並報錯

封裝后的包的源碼會在完成后貼出( ̄▽ ̄)"

最后讓我們來總結一下使用 csv庫的注意事項:

  1. 打開文件時要 注意模式 讀用 r,寫用 w
  2. 打開文件時要設置 newline=''(空字符)
  3. 打開文件時要指定編碼打開,寫入時也一樣
  4. 如果設置過分隔符就要一直保持,讀寫時的分隔符必須一致
  5. csv不會檢查格式(雖然有個 strict模式,但 strict模式下也不會對格式進行檢查),寫入文件時一定要注意格式


作者:漁父歌
鏈接:https://www.jianshu.com/p/51211fcdf4b8
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM