CSV檔案儲存

JJJhr發表於2024-06-09

CSV 檔案儲存

  CSV,全稱為 Comma-Separated Values,中文可以叫作逗號分隔值或字元分隔值,其檔案以純文字形式儲存表格資料。該檔案是一個字元序列,可以由任意數目的記錄組成,記錄間以某種換行符分隔。每條記錄由若干欄位組成,欄位間的分隔符是其他字元或字串,最常見的是逗號或製表符。不過所有記錄都有完全相同的欄位序列,相當於一個結構化表的純文字形式。它比 Excel 檔案更加簡潔,XLS 文字是電子表格,包含文字、數值、公式和格式等內容,而 CSV 中不包含這些內容,就是特定字元分隔的純文字,結構簡單清晰。所以,有時候用 CSV 來儲存資料是比較方便的。本節時 Python 讀取和寫入 CSV 檔案的過程。

寫入

例子:

import csv

with open('data.csv', 'w') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['id', 'name', 'age'])
    writer.writerow(['10001', 'Mike', 20])
    writer.writerow(['10002', 'Bob', 22])
    writer.writerow(['10003', 'Jordan', 21])

  開啟 data.csv 檔案,然後指定開啟的模式為 w(即寫入),獲得檔案控制代碼,隨後呼叫 csv 庫的 writer 方法初始化寫入物件,傳入該控制代碼,然後呼叫 writerow 方法傳入每行的資料即可完成寫入。

  執行結束後,會生成一個名為 data.csv 的檔案,此時資料就成功寫入了。直接以文字形式開啟的話,其內容如下:

id,name,age

10001,Mike,20

10002,Bob,22

10003,Jordan,21

  寫入的文字預設以逗號分隔,呼叫一次 writerow 方法即可寫入一行資料。用 Excel 開啟的結果如圖所示。

  如果想修改列與列之間的分隔符,可以傳入 delimiter 引數,其程式碼如下:

import csv

with open('data.csv', 'w') as csvfile:
    writer = csv.writer(csvfile, delimiter=' ')
    writer.writerow(['id', 'name', 'age'])
    writer.writerow(['10001', 'Mike', 20])
    writer.writerow(['10002', 'Bob', 22])
    writer.writerow(['10003', 'Jordan', 21])

這裡在初始化寫入物件時傳入 delimiter 為空格,此時輸出結果的每一列就是以空格分隔了,內容如下:

id name age

10001 Mike 20

10002 Bob 22

10003 Jordan 21

  也可以呼叫 writerows 方法同時寫入多行,此時引數就需要為二維列表,例如:

import csv

with open('data.csv', 'w') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['id', 'name', 'age'])
    writer.writerows([['10001', 'Mike', 20], ['10002', 'Bob', 22], ['10003', 'Jordan', 21]])

輸出效果是相同,內容如下:

id,name,age

10001,Mike,20

10002,Bob,22

10003,Jordan,21

  但是一般情況下,爬蟲爬取的都是結構化資料,一般會用字典來表示。在 csv 庫中也提供了字典的寫入方式,示例如下:

import csv

with open('data.csv', 'w') as csvfile:
    fieldnames = ['id', 'name', 'age']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow({'id': '10001', 'name': 'Mike', 'age': 20})
    writer.writerow({'id': '10002', 'name': 'Bob', 'age': 22})
    writer.writerow({'id': '10003', 'name': 'Jordan', 'age': 21})

  先定義 3 個欄位,用 fieldnames 表示,然後將其傳給 DictWriter 來初始化一個字典寫入物件,接著可以呼叫 writeheader 方法先寫入頭資訊,然後再呼叫 writerow 方法傳入相應字典即可。最終寫入的結果是完全相同的,內容如下:

id,name,age

10001,Mike,20

10002,Bob,22

10003,Jordan,21

  這樣就可以完成字典到 CSV 檔案的寫入了。

  如果想追加寫入的話,可以修改檔案的開啟模式,即將 open 函式的第二個引數改成 a,程式碼如下:

import csv  

with open('data.csv', 'a') as csvfile:  
    fieldnames = ['id', 'name', 'age']  
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)  
    writer.writerow({'id': '10004', 'name': 'Durant', 'age': 22})

  在上面的基礎上再執行這段程式碼,檔案內容便會變成:

id,name,age

10001,Mike,20

10002,Bob,22

10003,Jordan,21

10004,Durant,22
  資料被追加寫入到檔案中。

  如果要寫入中文內容的話,可能會遇到字元編碼的問題,此時需要給 open 引數指定編碼格式。例如,這裡再寫入一行包含中文的資料,程式碼需要改寫如下:

import csv

with open('data.csv', 'a', encoding='utf-8') as csvfile:
    fieldnames = ['id', 'name', 'age']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writerow({'id': '10004', 'name': '李四', 'age': 22})

  需要給 open 函式指定編碼,否則可能發生編碼錯誤。

  如果接觸過 pandas 等庫的話,可以呼叫 DataFrame 物件的 to_csv 方法來將資料寫入 CSV 檔案中。

  安裝pandas庫,安裝命令:

pip3 install pandas

  安裝完之後,便可以使用pandas庫將資料儲存為CSV檔案:

import pandas as pd

data = [
    {'id': '10001', 'name': 'Mike', 'age': 20},
    {'id': '10002', 'name': 'Fsdf', 'age': 22},
    {'id': '10003', 'name': 'Sdfs', 'age': 23}
]

df = pd.DataFrame(data)
df.to_csv('data.csv', index=False)

  定義幾條資料,每條資料都是一個字典,然後將其組成一個列表,賦值為data。緊接著使用pandas的DataFrame類新建了一個DataFrame物件,引數傳入data,並把該物件賦值為df。最後呼叫df的to_csv方法也可以將資料儲存為CSV物件。

讀取

  可以使用 csv 庫來讀取 CSV 檔案。例如,將剛才寫入的檔案內容讀取出來,相關程式碼如下:

import csv

with open('data.csv', 'r', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        print(row)

執行結果:

['id', 'name', 'age']  
['10001', 'Mike', '20']  
['10002', 'Bob', '22']  
['10003', 'Jordan', '21']  
['10004', 'Durant', '22']  
['10005', ' 李四 ', '22']

  這裡構造的是 Reader 物件,透過遍歷輸出了每行的內容,每一行都是一個列表形式。注意,如果 CSV 檔案中包含中文的話,還需要指定檔案編碼。

  也可以使用pandas 的 read_csv 方法將資料從 CSV 中讀取出來,例如:

import pandas as pd

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

執行結果:

      id  name  age
0  10001  Mike   20
1  10002  Fsdf   22
2  10003  Sdfs   23

  這裡的df實際上是一個DataFrame物件,如果對此比較熟悉,可以直接使用它完成一些資料的分析處理。

  如果只想讀取檔案裡面的資料,可以吧df再進一步轉換為列表或元組:

import pandas as pd

df = pd.read_csv('data.csv')
data = df.values.tolist()
print(data)

  這裡呼叫了df的values屬性,再呼叫tolist方法,即可將資料轉化為列表形式,執行結果:

[[10001, 'Mike', 20], [10002, 'Fsdf', 22], [10003, 'Sdfs', 23]]

  若直接對df進行遍歷,同樣能得到列表型別的結果:

import pandas as pd

df = pd.read_csv('data.csv')
for index, row in df.iterrows():
    print(row.tolist())

執行結果:

[10001, 'Mike', 20]
[10002, 'Fsdf', 22]
[10003, 'Sdfs', 23]

相關文章