上一篇我們講了怎么用 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模塊再進行一次封裝,封裝后的包應該滿足下面的標准:
- 統一的分隔符 delimiter
- 統一的編碼
- 統一的打開文件的方式
- 能夠自己判斷文件是否存在並且選擇合適的方式打開文件
- 輸入格式和輸出格式保持一致
- 強制檢查格式,格式錯誤禁止插入並報錯
封裝后的包的源碼會在完成后貼出( ̄▽ ̄)"
最后讓我們來總結一下使用 csv庫的注意事項:
- 打開文件時要 注意模式 讀用 r,寫用 w
- 打開文件時要設置 newline=''(空字符)
- 打開文件時要指定編碼打開,寫入時也一樣
- 如果設置過分隔符就要一直保持,讀寫時的分隔符必須一致
- csv不會檢查格式(雖然有個 strict模式,但 strict模式下也不會對格式進行檢查),寫入文件時一定要注意格式
作者:漁父歌
鏈接:https://www.jianshu.com/p/51211fcdf4b8
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。