【Python爬蟲學習筆記7】CSV文件存儲


CSV文件簡介

CSV(Comma-Separated Values,逗號分隔值),是一種純文本形式存儲表格數據的文件。該文件由任意數目的記錄組成,每條記錄被分隔符分隔為字段(最常見的分隔符是逗號或制表符),且每條記錄都有相同的字段序列,因此csv相當於一個結構化表的純文本形式。從直觀上看,它比Excel文件更加簡潔,然而它不包含諸如XLS電子表格的數值、公式和格式等內容,它僅僅為一個結構化的純文本。

如下圖分別為csv文本打開方式和Excel打開方式的內容,其第0行為記錄標題,而后的若干行為所記錄的數據:

image_thumb1

image_thumb4

CSV文件讀取和寫入

在CSV文件讀寫操作中,常用兩種讀寫方式是列表讀寫和字典讀寫,下面我們分別來對此進行介紹。

1.文件讀取

csv文件讀取主要是使用reader()和DictReader()方法,二者均接收一個csv文件參數,並返回一個用於文件讀取迭代器。這兩個方法的區別是:reader()方法獲取的是一行行列表數據的迭代器,每行的數據可通過下標來獲取,而DictReader()方法獲取的是一行行字典數據的迭代器,每行的數據可通過鍵來獲取。

##CSV文件讀取的兩種方式
import csv

# 列表讀取
with open('data.csv', 'r') as fp:
    reader = csv.reader(fp)   #返回讀取迭代器
    titles = next(reader)     #提取出文件記錄標題
    print(type(titles))       #<class 'list'>
    print(titles)             #['id', 'name', 'city']
    for x in reader:          #遍歷向下迭代
        print(x)              #['001', 'Mike', 'Beijing']...
        id = x[0]
        name = x[1]
        city = x[2]
        print({'id': id, 'name': name, 'city': city})    #{'id': '001', 'name': 'Mike', 'city': 'Beijing'}

# 字典讀取
with open('data.csv', 'r') as fp:
    reader = csv.DictReader(fp)     #迭代器,但不包含標題數據(第0行)
    for x in reader:
        print(type(x))              #<class 'collections.OrderedDict'>
        print(x)                    #OrderedDict([('id', '001'), ('name', 'Mike'), ('city', 'Beijing')])...
        id = x['id']
        name = x['name']
        city = x['city']
        print({'id': id, 'name': name, 'city': city})    #{'id': '001', 'name': 'Mike', 'city': 'Beijing'}

2.文件寫入

同文件讀取一樣,文件的寫入也有兩種方法——writer()和DictWriter(),其含義和reader()/DictReader()相類似,writer()用於列表數據寫入,而DictWriter()用於字典數據寫入。二者使用方法也比較簡單,但需要注意的是由於是寫入文件,需要指明文件的編碼方式(特別是需要寫入中文字符時),具體的用法如下所示。

##CSV文件寫入的兩種方式
import csv

# 列表寫入
# 設置記錄標題(列表)和記錄值(一個嵌套元組集或列表集的列表)
headers = ['id','name','province']
values = [
    ('001','ShenZhen','GuangDong'),
    ('002', 'WuHan', 'HuBei'),
    ('003', 'ChengDu', 'SiChuan')
]
# 使用open函數時設置參數encoding以防止亂碼
with open('citylist.csv','w',encoding='utf-8',newline='') as fp:
    writer = csv.writer(fp)    #獲取文件“寫筆”
    writer.writerow(headers)   #寫入一行記錄
    writer.writerows(values)   #寫入多行記錄,傳入的參數為列表結構

# 字典寫入
# 設置記錄標題(列表)和記錄值(一個嵌套字典集的列表)
headers = ['id', 'name', 'province']
values = [
    {'id': '001', 'name': 'ShenZhen', 'province': 'GuangDong'},
    {'id': '002', 'name': 'WuHan', 'province': 'HuBei'},
    {'id': '003', 'name': 'ChengDu', 'province': 'SiChuan'}
]
with open('citydict.csv', 'w', encoding='utf-8', newline='') as fp:
    writer = csv.DictWriter(fp,headers)    #獲取文件“寫筆”,注意參數還需傳遞記錄標題以映射,注意此時並不會真正寫入標題
    writer.writeheader()                   #寫入記錄標題
    writer.writerows(values)               #寫入多行記錄

在打開待寫入CSV文件時,這里我們還傳入了一個newline參數,並且其值為空字符串,這么做是為了防止在每次寫完一行后其會自動再寫入一個換行符,如下圖為設置和不設置newline的文件寫入對應結果:

設置了newline的文件寫入結果:

“””

id,name,province

001,ShenZhen,GuangDong

002,WuHan,HuBei

003,ChengDu,SiChuan

“””

未設置newline的文件寫入結果:

“””

id,name,province

 

001,ShenZhen,GuangDong

 

002,WuHan,HuBei

 

003,ChengDu,SiChuan

 

“””

 


以上便是關於CSV文件的簡單介紹和基本的讀寫方法,在讀寫方法中又含有列表和字典兩種類型的讀寫方式,而具體使用哪一種方式就需要我們根據實際擬存儲的數據類型來進行選擇了。


免責聲明!

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



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