十分鐘學(xué)會(huì)如何用Python處理CSV文件
時(shí)間:2021-09-06 15:23:42
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]▼點(diǎn)擊下方名片,關(guān)注公眾號(hào)▼一切的開(kāi)始在前幾年,如果你和嵌入式開(kāi)發(fā)人員推薦Python,大概會(huì)是這樣一種場(chǎng)景:A:”誒,老王,你看Python開(kāi)發(fā)這么方便,以后會(huì)不會(huì)用到嵌入式設(shè)備?“B:“別做夢(mèng)了,那玩意兒速度賊慢,肯定滿足不了性能要求......”但近幾年,隨著半導(dǎo)體行業(yè)的迅...
▼點(diǎn)擊下方名片,關(guān)注公眾號(hào)▼
一切的開(kāi)始
在前幾年,如果你和嵌入式開(kāi)發(fā)人員推薦Python,大概會(huì)是這樣一種場(chǎng)景:
A:”誒,老王,你看Python開(kāi)發(fā)這么方便,以后會(huì)不會(huì)用到嵌入式設(shè)備?“B:“別做夢(mèng)了,那玩意兒速度賊慢,肯定滿足不了性能要求......”但近幾年,隨著半導(dǎo)體行業(yè)的迅猛發(fā)展,嵌入式處理器的性能有了很大幅度的提高。與此同時(shí),Python語(yǔ)言本身也在不斷優(yōu)化。因此,在嵌入式領(lǐng)域引入Python已經(jīng)成為了必然趨勢(shì)。今天,作者就來(lái)總結(jié)一下使用Python處理物聯(lián)網(wǎng)行業(yè)中一種常見(jiàn)的文件格式:csv文件。
Python庫(kù):csv
Python中集成了專用于處理csv文件的庫(kù),名為:
csv
。csv 庫(kù)中有4個(gè)常用的對(duì)象:csv.reader
:以列表的形式返回讀取的數(shù)據(jù)。csv.writer
:以列表的形式寫(xiě)入數(shù)據(jù)。csv.DictReader
:以字典的形式返回讀取的數(shù)據(jù)。csv.DictWriter
:以字典的形式寫(xiě)入數(shù)據(jù)。
讀取CSV文件
假設(shè)現(xiàn)在要讀取的csv文件內(nèi)容如下:可以看到,該文件的第一行表明數(shù)據(jù)類型,我們暫且稱之為
header
。從第2行開(kāi)始,保存的是設(shè)備采集到的數(shù)據(jù)。使用csv.reader讀取文件
# 導(dǎo)入 csv 庫(kù)
import csv
# 以讀方式打開(kāi)文件
with open關(guān)于寫(xiě)入,需要注意:"data.csv", mode="r", encoding="utf-8-sig") as f:
? ?
? ?# 基于打開(kāi)的文件,創(chuàng)建csv.reader實(shí)例
? ?reader = csv.reader(f)
? ?# 獲取第一行的header
? ?# header[0] = "設(shè)備編號(hào)"
? ?# header[1] = "溫度"
? ?# header[2] = "濕度"
? ?# header[3] = "轉(zhuǎn)速"
? ?header = next(reader)
? ?# 逐行獲取數(shù)據(jù),并輸出
? ?for row in reader:
? ? ? ?print("{}{}: {}={}, {}={}, {}={}".format(header[0], row[0],
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? header[1], row[1],
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? header[2], row[2],
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? header[3], row[3]))
程序運(yùn)行結(jié)果如下:設(shè)備編號(hào)0: 溫度=31, 濕度=20, 轉(zhuǎn)速=1000
設(shè)備編號(hào)1: 溫度=30, 濕度=22, 轉(zhuǎn)速=998
設(shè)備編號(hào)2: 溫度=32, 濕度=23, 轉(zhuǎn)速=1005
使用csv.DictReader讀取文件
# 導(dǎo)入 csv 庫(kù)
import csv
# 打開(kāi)文件
with open("data.csv", encoding="utf-8-sig", mode="r") as f:
? ?# 基于打開(kāi)的文件,創(chuàng)建csv.DictReader實(shí)例
? ?reader = csv.DictReader(f)
? ?# 輸出信息
? ?for row in reader:
? ? ? ?print("設(shè)備編號(hào){}: 溫度={}, 濕度={}, 轉(zhuǎn)速={}".format(row["設(shè)備編號(hào)"],
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? row["溫度"],
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? row["濕度"],
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? row["轉(zhuǎn)速"]))
程序運(yùn)行結(jié)果如下:設(shè)備編號(hào)0: 溫度=31, 濕度=20, 轉(zhuǎn)速=1000
設(shè)備編號(hào)1: 溫度=30, 濕度=22, 轉(zhuǎn)速=998
設(shè)備編號(hào)2: 溫度=32, 濕度=23, 轉(zhuǎn)速=1005
寫(xiě)入CSV文件
假設(shè)我們現(xiàn)在要?jiǎng)?chuàng)建一個(gè)csv文件,將數(shù)據(jù)保存為如下形式:
使用csv.writer寫(xiě)入文件
# 導(dǎo)入 csv 庫(kù)
import csv
# 創(chuàng)建列表,保存header內(nèi)容
header_list = ["設(shè)備編號(hào)", "溫度", "濕度", "轉(zhuǎn)速"]
# 創(chuàng)建列表,保存數(shù)據(jù)
data_list = [
? ?[0, 31, 20, 1000],
? ?[1, 30, 22, 998],
? ?[2, 32, 33, 1005]
]
# 以寫(xiě)方式打開(kāi)文件。注意添加 newline="",否則會(huì)在兩行數(shù)據(jù)之間都插入一行空白。
with open("new_data.csv", mode="w", encoding="utf-8-sig", newline="") as f:
? ?
? ?# 基于打開(kāi)的文件,創(chuàng)建 csv.writer 實(shí)例
? ?writer = csv.writer(f)
? ?# 寫(xiě)入 header。
? ?# writerow() 一次只能寫(xiě)入一行。
? ?writer.writerow(header_list)
? ?# 寫(xiě)入數(shù)據(jù)。
? ?# writerows() 一次寫(xiě)入多行。
? ?writer.writerows(data_list)
使用csv.DictWriter寫(xiě)入文件
# 導(dǎo)入 csv 庫(kù)
import csv
# 創(chuàng)建 header 列表
header_list = ["設(shè)備編號(hào)", "溫度", "濕度", "轉(zhuǎn)速"]
# 創(chuàng)建數(shù)據(jù)列表,列表的每個(gè)元素都是字典
data_list = [
? ?{"設(shè)備編號(hào)": "0", "溫度": 31, "濕度": 20, "轉(zhuǎn)速": 1000},
? ?{"設(shè)備編號(hào)": "1", "溫度": 30, "濕度": 22, "轉(zhuǎn)速": 998},
? ?{"設(shè)備編號(hào)": "2", "溫度": 32, "濕度": 23, "轉(zhuǎn)速": 1005},
]
# 以寫(xiě)方式打開(kāi)文件。注意添加 newline="",否則會(huì)在兩行數(shù)據(jù)之間都插入一行空白。
with open("new_data.csv", mode="w", encoding="utf-8-sig", newline="") as f:
? ?
? ?# 基于打開(kāi)的文件,創(chuàng)建 csv.DictWriter 實(shí)例,將 header 列表作為參數(shù)傳入。
? ?writer = csv.DictWriter(f, header_list)
? ?# 寫(xiě)入 header
? ?writer.writeheader()
? ?# 寫(xiě)入數(shù)據(jù)
? ?writer.writerows(data_list)
關(guān)于寫(xiě)入,需要主語(yǔ):
- 在打開(kāi)文件時(shí),需要添加
newline = ""
。否則,會(huì)在每2行有效內(nèi)容之間添加一行空白。 - 如果要保存的內(nèi)容有中文,而且之后需要用Excel打開(kāi)文件,那么需要選用
utf-8-sig
編碼。如果使用utf-8
編碼,會(huì)導(dǎo)致使用Excel查看文件時(shí)中文亂碼。
微信公眾號(hào)后臺(tái)回復(fù)關(guān)鍵字“加群”,添加小編微信,拉你入技術(shù)群。