使用 Python 讀取和寫入 CSV 檔案


CSV(代表逗號分隔值)格式是一種常用的資料格式,電子表格使用它。Python 標準庫中的 csv 模組提供了用於對 CSV 檔案執行讀/寫操作的類和方法。

writer()

此函式在 csv 模組中返回一個 writer 物件,該物件將資料轉換為分隔字串並存儲在檔案物件中。該函式需要一個具有寫入許可權的檔案物件作為引數。寫入檔案中的每一行都會輸出一個換行符。為了防止行之間出現額外的空格,newline 引數設定為 ‘’。

writer 類具有以下方法

writerow()

此函式寫入可迭代物件(列表、元組或字串)中的專案,並用逗號字元分隔它們。

writerows()

此函式以列表的可迭代物件作為引數,並將每個專案寫入檔案中的逗號分隔的行。

以下示例顯示了 write() 函式的使用。首先,一個檔案以 'w' 模式開啟。此檔案用於獲取 writer 物件。然後,使用 writerow() 方法將元組列表中的每個元組寫入檔案。

>>> import csv
>>> persons=[('Lata',22,45),('Anil',21,56),('John',20,60)]
>>> csvfile=open('persons.csv','w', newline='')
>>> obj=csv.writer(csvfile)
>>> for person in persons:
obj.writerow(person)
>>> csvfile.close()

這將在當前目錄中建立 'persons.csv' 檔案。它將顯示以下資料。

Lata,22,45
Anil,21,56
John,20,60

而不是遍歷列表以單獨寫入每一行,我們可以使用 writerows() 方法。

>>> csvfile = open('persons.csv','w', newline='')
>>> obj = csv.writer(csvfile)
>>> obj.writerows(persons)
>>> obj.close()

read()

此函式返回一個 reader 物件,該物件返回 csv 檔案中行的迭代器。使用常規的 for 迴圈,以下示例中顯示了檔案中的所有行。

>>> csvfile=open('persons.csv','r', newline='')
>>> obj=csv.reader(csvfile)
>>> for row in obj:
print (row)
['Lata', '22', '45']
['Anil', '21', '56']
['John', '20', '60']

由於 reader 物件是一個迭代器,因此內建的 next() 函式也可用於顯示 csv 檔案中的所有行。

>>> csvfile = open('persons.csv','r', newline='')
>>> obj = csv.reader(csvfile)
>>> while True:
try:
row=next(obj)
print (row)
except StopIteration:
break

csv 模組還定義了一個 dialect 類。Dialect 是用於實現 CSV 協議的一組標準。可以透過 list_dialects() 函式獲取可用的方言列表。

>>> csv.list_dialects()
['excel', 'excel-tab', 'unix']

DictWriter()

此函式返回一個 DictWriter 物件。它類似於 writer 物件,但行對映到字典物件。該函式需要一個具有寫入許可權的檔案物件,以及字典中用作 fieldnames 引數的鍵列表。這用於在檔案的第一行寫入標題。

writeheader()

此方法將字典中的鍵列表作為逗號分隔的行寫入檔案的第一行。

在以下示例中,定義了一個字典項列表。列表中的每個專案都是一個字典。使用 writrows() 方法,它們以逗號分隔的方式寫入檔案。

>>> persons=[{'name':'Lata', 'age':22, 'marks':45}, {'name':'Anil', 'age':21, 'marks':56}, {'name':'John', 'age':20, 'marks':60}]
>>> csvfile=open('persons.csv','w', newline='')
>>> fields=list(persons[0].keys())
>>> obj=csv.DictWriter(csvfile, fieldnames=fields)
>>> obj.writeheader()
>>> obj.writerows(persons)
>>> csvfile.close()

該檔案顯示以下內容。

name,age,marks
Lata,22,45
Anil,21,56
John,20,60

DictReader()

此函式從底層 CSV 檔案返回一個 DictReader 物件。與 reader 物件一樣,它也是一個迭代器,可以使用它來檢索檔案的內容。

>>> csvfile = open('persons.csv','r', newline='')
>>> obj = csv.DictReader(csvfile)

該類提供 fieldnames 屬性,返回用作檔案標題的字典鍵。

>>> obj.fieldnames
['name', 'age', 'marks']

使用迴圈遍歷 DictReader 物件以獲取各個字典物件。

>>> for row in obj:
print (row)

這將產生以下輸出。

OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
OrderedDict([('name', 'Anil'), ('age', '21'), ('marks', '56')])
OrderedDict([('name', 'John'), ('age', '20'), ('marks', '60')])

要將 OrderedDict 物件轉換為普通字典,我們必須首先從 collections 模組匯入 OrderedDict。

>>> from collections import OrderedDict
>>> r=OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
>>> dict(r)
{'name': 'Lata', 'age': '22', 'marks': '45'}

本文介紹了 csv 模組的功能。

更新於:2020年6月25日

2K+ 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告