Python爬蟲3.2 — csv用法教程
綜述
本系列文檔用於對Python爬蟲技術的學習進行簡單的教程講解,鞏固自己技術知識的同時,萬一一不小心又正好對你有用那就更好了。
Python 版本是3.7.4
上一篇文章講了怎麼用json格式保存數據,這一篇我們來看看如何用csv模塊進行數據讀寫。
csv 介紹
什麼是csv
CSV(Comma Separated Values),即逗號分隔值(也稱字符分隔值,因爲分隔符可以不是逗號),是一種常用的文本格式,用來存儲表格數據,包括數字或者字符。
csv的使用很廣泛,很多程序都會涉及到csv的使用,但是 csv卻沒有通用的標準,所以在處理csv格式時常常會碰到麻煩。因此在使用csv時一定要遵循某一個標準,這不是固定的,但每個人都應該有一套自己的標準,這樣在使用csv時纔不會犯低級錯誤。
csv庫的使用
csv庫和json庫一樣也是Python的一個標準庫,不需要安裝就能使用。關於csv庫的使用,也是從寫和讀兩個方面來講,csv庫有四個主要的方法分別是:
csv.reader()
讀取csv文件中數據csv.DictReader()
創建一個像常規閱讀器一樣操作的對象,但將讀取的信息映射到一個dictcsv.writer()
將數據寫入csv文件csv.DictWriter()
創建一個像常規編寫器一樣操作的對象,但將字典映射到輸出行
reader()
讀操作
reader(iterable, dialect='excel', *args, **kwargs)
返回一個reader對象,它將迭代給定csvfile中的行。
iterable
可以是任何支持迭代器協議的對象,並在每次next()
調用其方法時返回一個字符串-文件對象和列表對象都是合適的。如果csvfile是一個文件對象,那麼它必須在平臺上以“r”標誌打開。可以給出可選的dialect
參數,該參數用於定義特定於CSV方言的一組參數。如果想修改列與列之間的分隔符,可以傳入delimiter
參數。其他可選的args
可以給出關鍵字參數來覆蓋當前方言中的各個格式參數。使用示例代碼如下:
# 引入csv庫
import csv
# 以讀的方式打開order.csv文件
with open('order.csv', 'r') as csv_reader:
reader = csv.reader(csv_reader)
# 如果不想獲取標題,則使用next()函數從下一行開始獲取數據
next(reader)
for row in reader:
print(row)
# 可以根據下標進行獲取指定列數據
# print(row[2])
DictReader()
讀操作
class csv.DictReader(f,fieldnames = None,restkey = None,restval = None,dialect ='excel',* args,** kwds)
這是另一種讀操作,創建一個像常規閱讀器一樣操作的對象,但將讀取的信息映射到一個dict
,其鍵由可選的fieldnames
參數給出。字段名的參數是一個序列,其元素與輸入數據的順序中的字段相關聯。這些元素成爲結果字典的關鍵。如果省略fieldnames
參數,則文件f的第一行中的值將用作字段名。如果讀取的行包含的字段多於字段名序列,則將剩餘數據添加爲由restkey值鍵入的序列。如果讀取的行的字段數少於字段名序列,則其餘的鍵將採用可選的restval參數的值。任何其他可選或關鍵字參數都將傳遞給基礎reader實例。使用示例代碼如下:
# 引入csv庫
import csv
# 以讀的方式打開order.csv文件
with open('order.csv', 'r') as csv_reader:
reader = csv.DictReader(csv_reader, fieldnames=['order_no', 'user_name'])
for row in reader:
print(row)
# print(row['order_no'])
writer()
寫操作
writer(fileobj, dialect='excel', *args, **kwargs)
返回一個編寫器對象,負責將用戶的數據轉換爲給定的類文件對象上的分隔字符串。fileobj
可以是帶有write()方法的任何對象。如果fileobj
是一個文件對象,那麼它必須在平臺上以“b”標誌打開,這會產生影響。可以給出可選的dialect
參數,該參數用於定義特定於CSV方言的一組參數。使用示例代碼如下:
# 引入csv庫
import csv
# 聲明定義頭
header = ['username', 'age', 'height']
# 聲明定義一個列表
lt = [
('張三', 25, 180),
('李四', 26, 172),
('王五', 27, 183)
]
# 設置編碼方式爲utf8,新行爲空字符串,否則默認爲\n
with open('user.csv', 'w', encoding='utf-8', newline='') as fp:
writer = csv.writer(fp)
# 寫入單行
writer.writerow(header)
# 寫入多行
writer.writerows(lt)
DictWriter()
寫操作
class csv.DictWriter(f,fieldnames,restval ='',extrasaction ='raise',dialect ='excel',* args,** kwds)
創建一個像常規編寫器一樣操作的對象,但將字典映射到輸出行。fieldnames
字段名的參數是一個序列識別在哪些值在傳遞給字典中的順序按鍵的writerow()方法被寫入到文件f
。如果字典缺少字段名中的鍵,則可選的restval
參數指定要寫入的值。如果傳遞給方法的字典包含在字段名中找不到的鍵,則可選的extrasaction
參數指示要採取的操作。使用示例代碼如下:
# 引入csv庫
import csv
with open('user.csv', 'w', encoding='utf-8', newline='') as fp:
# 聲明定義頭
header = ['username', 'age', 'height']
# 聲明定義一個列表,裏面是對象
lt = [
{'username': '張三', 'age': 26, 'height': 183},
{'username': '李四', 'age': 24, 'height': 180},
{'username': '王五', 'age': 23, 'height': 189},
]
writer = csv.DictWriter(fp, header)
# 寫入表頭數據的時候,需要掉用writeheader方法
writer.writeheader()
writer.writerows(lt)
總結
使用csv庫的注意事項:
- 打開文件時要注意模式,讀用
r
,寫用w
; - 打開文件時要設置
newline=''
(空字符); - 打開文件時要指定編碼打開,寫入時也一樣;
- 如果設置過分隔符就要一直保持,讀寫時的分隔符必須一致;
- csv不會檢查格式(雖然有個strict模式,但strict模式下也不會對格式進行檢查),寫入文件時一定要注意格式。
以上就是 csv庫的使用方法和注意事項。