爬蟲—文件存儲—CSV存儲


一,簡介  

    CSV,全稱Comma—Separated Values,可以稱為逗號分隔或者字符分隔值,其文件以純文本形式存儲表格數據。該文件是一個字符序列,可以有任意的數目記錄組成,記錄間已某種換行符分隔。每條記錄由字段組成,字段間的分隔符是其他字符或字符串,最常見的是逗號或制表符。相比EXcel更加簡潔,就是特定字符分隔的純文本。

二,寫入CSV文件

  1.簡單的例子:

import csv

with open('data.csv', 'w') as f:
    writer = csv.writer(f)
    writer.writerow(['id', 'name', 'age'])
    writer.writerow(['1', 'rain', '20'])
    writer.writerow(['2', 'godric', '22'])
    writer.writerow(['3', 'tony', '25'])

  運行結束后會生成一個data.csv的文件,此時數據就成功寫入了。直接以文本形式打開,會顯示如下內容:

id,name,age

1,rain,20

2,godric,22

3,tony,25

  可以看到寫入的文本默認以逗號分隔,調用一次writer()方法就會寫入一行數據。使用Excel打開:

  

  如果想要修改列與列之間的分隔符,使用delimiter參數:  

# 修改分隔符
with open('data.csv', 'w') as f:
    writer = csv.writer(f, delimiter="-")
    writer.writerow(['id', 'name', 'age'])
    writer.writerow(['1', 'rain', '20'])
    writer.writerow(['2', 'godric', '22'])
    writer.writerow(['3', 'tony', '25'])

  使用純文本格式打開:

id-name-age

1-rain-20

2-godric-22

3-tony-25

  另外,writer()方法也可以多行寫入,其結果是一樣的:

writer.writerow(['1', 'rain', '20'],['2', 'rain', '20'],['3', 'rain', '20'])

  2.寫入字典

    但是一般情況下,爬蟲爬取的都是結構化數據,我們一般會用字典來表示。csv中的字典寫入方式:

# 字典寫入
with open('data.csv', 'w') as f:
    field_name = ['id', 'name', 'age']
    writer = csv.DictWriter(f, fieldnames=field_name)
    writer.writeheader()
    writer.writerow({'id': '1', 'name': 'rain', 'age': '20'})
    writer.writerow({'id': '2', 'name': 'godric', 'age': '22'})
    writer.writerow({'id': '3', 'name': 'tony', 'age': '25'})

  這里先定義3個字段,使用field_name來表示,然后將其傳給DictWriter來初始化一個字典寫入對象,再使用writeheader()方法寫入頭信息,最后調用writerow()方法寫入字典即可。結果和上面的一樣。

  3.追加內容

    如果想要在文件后面追加內容,將open()函數的第二個參數改為a即可:

# 追加
with open('data.csv', 'a') as f:
    field_name = ['id', 'name', 'age']
    writer = csv.DictWriter(f, fieldnames=field_name)
    writer.writeheader()
    writer.writerow({'id': '4', 'name': 'thor', 'age': '1000'})

    結果如下:

id,name,age

1,rain,20

2,godric,22

3,tony,25

id,name,age

4,thor,1000

  4.寫入中文

    如果需要寫入中文信息,此時要指定編碼格式,否則可能會發生編碼錯誤。

# 中文需要指定編碼
with open('data.csv', 'a', encoding='utf-8') as f:
    field_name = ['id', 'name', 'age']
    writer = csv.DictWriter(f, fieldnames=field_name)
    writer.writeheader()
    writer.writerow({'id': '5', 'name': '王翔', 'age': '22'})

    結果如下:

id,name,age

1,rain,20

2,godric,22

3,tony,25

id,name,age

4,thor,1000

id,name,age

5,王翔,22

  5.去除空行

    在寫入文件的時候會像上面出現多余的空行,這時候可以在open()函數內添加,一個參數來去掉多余的空行newline='',以字典寫入為例:

with open('data.csv', 'w', newline='') as f:
    field_name = ['id', 'name', 'age']
    writer = csv.DictWriter(f, fieldnames=field_name)
    writer.writeheader()
    writer.writerow({'id': '1', 'name': 'rain', 'age': '20'})
    writer.writerow({'id': '2', 'name': 'godric', 'age': '22'})
    writer.writerow({'id': '3', 'name': 'tony', 'age': '25'})

  結果:

['id', 'name', 'age']
['1', 'rain', '20']
['2', 'godric', '22']
['3', 'tony', '25']

 

二,讀取文件

  同樣適用csv來讀取文件。讀取剛才寫入的文件:

# 文件讀取
with open('data.csv', 'r', encoding='utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

  讀取結果:

['id', 'name', 'age']
['1', 'rain', '20']
['2', 'godric', '22']
['3', 'tony', '25']

  這里我們構造了Reader對象,通過遍歷輸出了每一行內容,每一方都是一個列表形式。如果內容包含中文,需要指定編碼。

  此外,還可以使用pandas讀取文件:

import pandas as pd

data = pd.read_csv('data.csv')
print(data)

  結果:

   id    name  age
0   1    rain   20
1   2  godric   22
2   3    tony   25

  使用pandas可以快捷的讀取csv文件內容,數據分析時使用此方法較多。

 


免責聲明!

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



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