(Python基礎教程之十二)Python讀寫CSV檔案

yifanwu發表於2021-09-09

學習在使用CSV檔案。CSV(逗號分隔值)格式是電子表格和資料庫中非常流行的匯入和匯出格式。Python語言包含該模組,該模組具有用於讀取和寫入CSV格式的資料的類。

目錄





Reading CSV file with csv.reader()

該方法返回一個reader物件,該物件將遍歷給定CSV檔案中的行。

假設我們有以下numbers.csv包含數字的檔案:

6,5,3,9,8,6,7

以下python指令碼從此CSV檔案讀取資料。

#!/usr/bin/python3

import csv
f = open('numbers.csv', 'r')
with f:
	reader = csv.reader(f)
	for row in reader:
		print(row)

在上面的程式碼示例中,我們開啟了numbers.csv以讀取並使用csv.reader()方法載入資料。

現在,假設CSV檔案將使用其他定界符。(嚴格來說,這不是CSV檔案,但是這種做法很常見。)例如,我們有以下items.csv檔案,其中的元素由豎線字元(|)分隔:

pen|table|keyboard

以下指令碼從items.csv檔案讀取資料。

#!/usr/bin/python3

import csv
f = open('items.csv', 'r')
with f:
	reader = csv.reader(f, delimiter="|")
	for row in reader:
		for e in row:
			print(e)

我們delimiter在csv.reader()方法中使用引數指定新的分隔字元。

Reading CSV file with csv.DictReader

該班的運作就像一個普通的讀者,但讀入字典中的資訊對映

字典的鍵可以與fieldnames引數一起傳遞,也可以從CSV檔案的第一行推斷出來。

我們有以下values.csv檔案:

min, avg, max
1, 5.5, 10

第一行代表字典的鍵,第二行代表值。

#!/usr/bin/python3

import csv
f = open('values.csv', 'r')
with f:
	reader = csv.DictReader(f)
	for row in reader:
		print(row)

上面的python指令碼使用讀取values.csv檔案中的值csv.DictReader。

這是示例的輸出。

$ ./read_csv3.py 
{' max': ' 10', 'min': '1', ' avg': ' 5.5'}

Writing CSV file using csv.writer()

該方法返回一個writer物件,該物件負責將使用者資料轉換為給定檔案狀物件上的定界字串。

#!/usr/bin/python3

import csv
nms = [[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]]
f = open('numbers2.csv', 'w')
with f:
	writer = csv.writer(f)
	for row in nms:
		writer.writerow(row)

該指令碼將數字寫入numbers2.csv檔案。該writerow()方法將一行資料寫入指定的檔案。

該指令碼將產生以下檔案(numbers2.csv):

1,2,3,4,5,6 7,8,9,10,11,12

可以一次寫入所有資料。該writerows()方法將所有給定的行寫入CSV檔案。

下一個程式碼示例將Python列表寫入numbers3.csv檔案。該指令碼將三行數字寫入檔案。

#!/usr/bin/python3

import csv
nms = [[1, 2, 3], [7, 8, 9], [10, 11, 12]]
f = open('numbers3.csv', 'w')
with f:
	writer = csv.writer(f)
	writer.writerows(nms)

執行上述程式時,以下輸出將寫入numbers3.csv檔案:

1,2,3 7,8,9 10,11,12

Quoting

可以在CSV檔案中引用單詞。Python CSV模組中有四種不同的引用模式

  • QUOTE_ALL —引用所有欄位
  • QUOTE_MINIMAL-僅引用那些包含特殊字元的欄位
  • QUOTE_NONNUMERIC —引用所有非數字欄位
  • QUOTE_NONE —不引用欄位

在下一個示例中,我們向items2.csv檔案寫入三行。所有非數字欄位都用引號引起來。

#!/usr/bin/python3

import csv
f = open('items2.csv', 'w')
with f:
	writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC)
	writer.writerows((["coins", 3], ["pens", 2], ["bottles", 7]))

該程式將建立以下items2.csv檔案。引用專案名稱,不引用數字表示的數量。

"coins",3
"pens",2
"bottles",7

CSV Dialects

儘管CSV格式是一種非常簡單的格式,但還是有許多差異,例如不同的定界符,換行或引號字元。因此,有不同的CSV方言可用。

下一個程式碼示例將列印可用的方言及其特徵。

#!/usr/bin/python3

import csv
names = csv.list_dialects()
for name in names:
	print(name)
	dialect = csv.get_dialect(name)
	print(repr(dialect.delimiter), end=" ")
	print(dialect.doublequote, end=" ")
	print(dialect.escapechar, end=" ")
	print(repr(dialect.lineterminator), end=" ")
	print(dialect.quotechar, end=" ")
	print(dialect.quoting, end=" ")
	print(dialect.skipinitialspace, end=" ")
	print(dialect.strict)

在csv.list_dialects()返回方言名稱的列表和csv.get_dialect()方法返回與方言名稱相關聯的方言。

$ ./dialects.py 
excel
',' 1 None 'rn' " 0 0 0
excel-tab
't' 1 None 'rn' " 0 0 0
unix
',' 1 None 'n' " 1 0 0

程式將列印此輸出。有三個內建的方言excel,excel-tab和unix。

Custom CSV Dialect

在本教程的最後一個示例中,我們將建立一個自定義方言。使用該csv.register_dialect()方法建立自定義方言。

#!/usr/bin/python3

import csv
csv.register_dialect("hashes", delimiter="#")
f = open('items3.csv', 'w')
with f:
	writer = csv.writer(f, dialect="hashes")
	writer.writerow(("pencils", 2))
	writer.writerow(("plates", 1))
	writer.writerow(("books", 4))

該程式使用(#)字元作為分隔符。使用方法中的dialect選項指定方言csv.writer()。

該程式將產生以下檔案(items3.csv):

pencils#2
plates#1
books#4

在本教程中,我們探索了Python csv模組,並介紹了一些在python中讀寫CSV檔案的示例。

學習愉快!

作者:
出處:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2157/viewspace-2825417/,如需轉載,請註明出處,否則將追究法律責任。

相關文章