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

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

1、csv簡介

CSV (Comma Separated Values),即逗號分隔值(也稱字符分隔值,由於分隔符能夠不是逗號),是一種經常使用的文本格式,用來存儲表格數據,包括數字或者字符。json

csv的使用很普遍,不少程序都會涉及到 csv的使用,可是 csv卻沒有通用的標準,因此在處理csv格式時經常會碰到麻煩。python爬蟲

所以在使用 csv時必定要遵循某一個標準,這不是固定的,但每一個人都應該有一套本身的標準,這樣在使用 csv時纔不會犯低級錯誤。編碼

2、csv庫的使用

關於 csv庫的使用,咱們從寫和讀兩個方面來說。spa

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

reader和 DictReader都接受一個能夠逐行迭代的對象做爲參數,通常是一個包含 csv格式數據的文件對象。對象

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

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

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

一、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])

二、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模式下也不會對格式進行檢查),寫入文件時必定要注意格式

以上就是 csv庫的使用方法和注意事項,以爲不錯就點個贊吧(●ˇ∀ˇ●)

上一篇:python爬蟲系列之數據的存儲(一):json庫的使用

相關文章
相關標籤/搜索