1. 程式人生 > >Python--讀寫CSV文件

Python--讀寫CSV文件

Python–讀寫CSV文件

CSV是英文Comma Separate Values(逗號分隔值)的縮寫,顧名思義,文件的內容是由 “,” 分隔的一列列的資料構成的。CSV文件是一種編輯方便,視覺化效果極佳的資料儲存方式。而Python中有著非常強大的庫可以處理這種文件,所以,如果你經常用Python處理資料的話,CSV文件當然是一種簡單快捷的輕量級選擇。下面我將以一個數據處理的例子入手,展現CSV文件的建立和編輯,以及Python是如何對CSV文件讀寫的。

CSV文件的建立和編輯
1. 良好的Excel互動
(1) Excel建立CSV

說到CSV文件,大家可能不熟悉,不過Excel想必沒有人不知道,我們經常使用Excel負責資料的儲存,編輯以及輕量級的計算。而CSV文件最大的優點就是能和Excel進行方便的互動,我們可以很方便地通過Excel建立、檢視以及編輯CSV文件。

在Excel中編輯完資料後,儲存檔案的時候,會出現一種檔案格式,就是 .csv ,如圖:

這裡寫圖片描述

然後現在點選儲存,會發現“檔案格式”的選項中有“逗號分隔值(.csv)”:

這裡寫圖片描述

我們選擇檔案格式為.csv儲存,這樣,就通過Excel成功建立了一個CSV文件。

(2) 文字訪問和編輯CSV

如果現在我們將剛才建立好的CSV文件直接雙擊點開,他會預設由Excel開啟,依舊和上邊相同,用Excel可以很方便的編輯,修改資料,這裡不再贅述。我要說的是CSV文件也可以以文字的形式展現出來,比如,我現在把剛才儲存的CSV文件用Sublime(你用txt也行)開啟,展示如下:

這裡寫圖片描述

這我們就非常直觀地明白為什麼叫“逗號分隔值”了,資料之間是由 “,” 分隔開的,且格式非常規範,沒有多餘的空格,空行等。

這裡多說一句:很多mac使用者會發現自己的Excel儲存的CSV文件並不是以 “,” 分隔的,這裡面的原因恕我見識淺薄,具體也不太清楚,大概是編碼的問題,一種解決方法是講mac系統偏好中的設定改成不說漢語的其他地區就可以了(不知道有沒有更專業的方法)。

一樣的,我們也可以通過文字的形式修改這些資料,然後儲存即可,若再用Excel開啟,則會顯示修改後的結果。這裡就不演示了。

同理,除了可以通過Excel建立CSV文件,也可以用通過把其他格式的文件轉換成.csv的字尾,也一樣可以建立CSV。比如,使用sublime或者Notepad++編輯內容,然後儲存為csv格式。但是儘量不要使用類似於Word或者Mac自帶的文字編輯器這些,他會把一些自身檔案的內容也加進CSV文件,導致文件“不純淨”。

總結一下上邊說的,CSV文件是一種可以通過Excel以及普通的文字編輯器建立,訪問,編輯的文件。

Python讀寫CSV文件
上邊的文件建立好之後,我們就可以將CSV文件所儲存的資料匯入Python做處理了。和文字檔案一樣,Python也可以對CSV文件寫入內容,重新編輯。

  1. Python讀取CSV文件
    Python的庫csv就是處理CSV文件的一個非常強大的庫,我們要處理CSV文件,必須先匯入它。

程式碼如下:

import csv

# 讀取csv至字典 csvFile = open("instance.csv", "r") reader = csv.reader(csvFile)
# 建立空字典 result = {} for item in reader:
    # 忽略第一行
    if reader.line_num == 1:
        continue
    result[item[0]] = item[1] csvFile.close() print(result)

首先,跟文字檔案一樣,需要 open() 函式將CSV文件開啟,我在此將開啟方式定義為只讀。然後通過 csv.reader() 函式建立一個讀入資料的物件,我起名為reader。

既然剛才我建立的資料是個一對一的關係型資料,那索性就通過字典這種結構完成資料的讀取,所以,建立了一個空字典result(後面會講csv自帶的將CSV文件讀取為字典的函式)

reader物件其實就是由CSV文件的多行資料構成的,每行資料會有一個屬性:line_num表示行數,顯然,剛才的資料第一行”name,score”只是資料說明,我們忽略掉。

如果用for迴圈迭代訪問reader,我們會發現,每一行都是一個列表,列表的每個元素就是CSV文件的每一行中 “,” 分隔開的資料。比如:

import csv
csvFile = open("instance.csv", "r")
reader = csv.reader(csvFile)
for item in reader:
    print(item) # >>> ['name', 'score']
                # >>> ['Zhang', '100']
                # >>> ['Wang', '80']
                # >>> ['Li', '90']

其實,當然也可以按文字檔案那種直接遍歷文件物件的方式,不過得到的就是字串,而不是每一行對應元素構成的列表,顯然,對於處理資料而言,讀取成列表會更方便,那直接遍歷文件物件(這裡的csvFile)就是沒有必要的了。

所以,我們通過第一段程式碼,就可以將CSV文件中出了第一行之外的資料讀入一個Python字典了。

  1. Python寫入CSV文件
    (1)直接寫入

當然也可以將資料寫入CSV文件,我們可以將資料以列表的形式寫入:

import csv
# 檔案頭,一般就是資料名
fileHeader = ["name", "score"]
# 假設我們要寫入的是以下兩行資料
d1 = ["Wang", "100"]
d2 = ["Li", "80"]
# 寫入資料
csvFile = open("instance.csv", "w")
writer = csv.writer(csvFile)
# 寫入的內容都是以列表的形式傳入函式
writer.writerow(fileHeader)
writer.writerow(d1)
writer.writerow(d1)
csvFile.close()

當然,每次寫完一行之後,會自動換行,所以,寫結果就是我們想要的形式:

這裡寫圖片描述

需要注意的是最後還有一個空行。

當然,像這種寫入多行的情況,可以用更方便的函式 writerows(),還是上面的例子,可以把三行寫入的程式碼,換成以下一行。但是傳入的引數是一個列表,每個元素代表需要寫入的每行資料。得到的結果和上面是一樣的。

writer.writerows([fileHeader, d1, d2])

(2)追加

除了直接寫入,還能實現追加:還是剛才那個例子,我現在將一行新的資料新增到舊的資料後面,最後寫入CSV

import csv
# 新增的資料行,以列表的形式表示
add_info = ["Guo", 150]
# 以新增的形式寫入csv,跟處理txt檔案一樣,設定關鍵字"a",表追加
csvFile = open("instance.csv", "a")
# 新建物件writer
writer = csv.writer(csvFile)
# 寫入,引數還是列表形式
writer.writerow(add_info)
csvFile.close()

這樣,就完成了資訊的追加。

  1. DictReader提供的方便
    像上面這種把一個關係型資料庫儲存為CSV文件,再用Python讀取,處理的情況可以說很常見,大多都是先讀成字典的形式,再做相應的計算。所以csv庫也就提供了能直接將CSV文件讀取為字典的函式:DictReader(),當然,也有相應的 DictWriter()

還是上邊的例子:

import csv
csvFile = open("instance.csv", "r")
dict_reader = csv.DictReader(csvFile)
for row in dict_reader:
    print(row)

輸出的結果是這樣的:

{'score': '100', 'name': 'Zhang'}
{'score': '80', 'name': 'Wang'}
{'score': '90', 'name': 'Li'}

這個形式就非常清晰明瞭了,而且還不用費心地寫程式碼將第一行忽略。因為CSV檔案第一行,就是(name,score)這一行,能以這種形式輸出:

import csv
csvFile = open("instance.csv", "r")
dict_reader = csv.DictReader(csvFile)
# 輸出第一行,也就是資料名稱那一行
print(dict_reader.fieldnames) # >>> ['name', 'score']

很好理解,fieldnames 是dict_reader的一個屬性,表示CSV文件的資料名稱。

如果覺得”DictReader”物件不方便對資料處理,還想轉換成我們上邊那種普通的Python字典物件,也很容易:3行程式碼即可解決問題

result = {}
for item in dict_reader:
    result[item["name"]] = item["score"]
print(result) # >>> {'Wang': '80', 'Li': '90', 'Zhang': '100'}
  1. DictWriter 以字典形式寫入
    DictReader可以用來把CSV檔案以字典的形式讀入,當然還有相對的DictWriter以字典的形式寫入內容,比如:
import csv
csvFile = open("instance.csv", "w")
# 檔案頭以列表的形式傳入函式,列表的每個元素表示每一列的標識
fileheader = ["name", "score"]
dict_writer = csv.DictWriter(csvFile, fileheader)
# 但是如果此時直接寫入內容,會導致沒有資料名,所以,應先寫資料名(也就是我們上面定義的檔案頭)。
# 寫資料名,可以自己寫如下程式碼完成:
dict_writer.writerow(dict(zip(fileheader, fileheader)))
# 之後,按照(屬性:資料)的形式,將字典寫入CSV文件即可
dict_writer.writerow({"name": "Li", "score": "80"})
csvFile.close()

不過,csv也提供了專門的函式 writeheader()來實現新增檔案頭(資料名),簡化開發者的工作,只需要將下面的程式碼:

dict_writer.writerow(dict(zip(fileheader, fileheader)))

改成這種形式:

dict_writer.writeheader()

上面的兩個函式是一樣的。之所以這個函式沒有任何引數,實際上,是因為在建立物件dict_writer時,已經設定了引數

寫入完成。之後,該怎麼讀,還是怎麼讀:

import csv
with open("instance.csv", "r") as csvFile:
    dict_reader = csv.DictReader(csvFile)
    for i in dict_reader:
        print(i)      # >>> {'name': 'Li', 'score': '80'}

相關推薦

pythoncsv的實戰

python 自動化測試 小強測試品牌 接口測試 測試幫日記 csv介紹csv是什麽?大家估計都聽過,不過我猜很少能有人比較全面的解釋下的,那麽小弟就獻醜一下。csv我理解的是一個存儲數據的文件,裏面以逗號作為分割進行存儲(當然也可以用制表符進行分割)。csv的規則1 開頭是不留空,以行為

pythoncsv

使用 oca csv 一個 讀寫 clas 字符 pre int 1、導入python內置模塊csv import csv 2、讀取csv文件內容 csv_file = csv.reader(open("csvfile.csv","r")) for line in

Python--CSV

Python–讀寫CSV文件 CSV是英文Comma Separate Values(逗號分隔值)的縮寫,顧名思義,文件的內容是由 “,” 分隔的一列列的資料構成的。CSV文件是一種編輯方便,視覺化效果極佳的資料儲存方式。而Python中有著非常強大的庫可以處

python中利用pandascsv

and clas byte test pytho csv文件 err 文件 blog 問題1:錯誤提示:UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xb8 原因:含有中文字符 import pandas pa

Python數據分析基礎——CSV2

str iter pla ins mce python pre invoice 表變量 2.2篩選特定的行: 行中的值滿足某個條件 行中的值屬於某個集合 行中的值匹配於某個模式(即:正則表達式)   2.2.1:行中的值滿足於某個條件: 基礎python版:

python txt並用jieba庫進行中文分詞

mage 亂碼 技術分享 流行 ictclas 函數 結果 class 配置 python用來批量處理一些數據的第一步吧。 對於我這樣的的萌新。這是第一步。 #encoding=utf-8 file=‘test.txt‘ fn=open(file,"r") print f

利用JavaCSV API來csv

pro 如果 att ron maven style stat println 實現 http://blog.csdn.net/loongshawn/article/details/53423121 http://javacsv.sourceforge.net/

pythonExcel--使用xlrd模塊讀取,xlwt模塊寫入

xlrd get sta series 有趣 light log 分享 均值 一、安裝xlrd模塊和xlwt模塊 1. 下載xlrd模塊和xlwt模塊 到python官網http://pypi.python.org/pypi/xlrd下載模塊。下載的文件

python-ini】pythonini

clas edr print 代碼 cells order sta read param 【python-ini】python讀寫ini文件 本文實例講述了Python讀寫ini文件的方法。分享給大家供大家參考。具體如下: 比如有一個文件update.ini,裏面有這些

python json(dump, load),以及對json格式的數據處理(dumps, loads)

ref oat ati ID == 數據轉換 load() tro float JSON (JavaScript Object Notation) 是一種輕量級的數據交換格式。它基於ECMAScript的一個子集。 1、json.dumps()和json.loads()

CSV

csv這是已存在的一個csv文件 import os path = os.getcwd()+‘\\‘ #獲取當前路徑 print (path) with open(path+‘aaa.csv‘,‘r‘,newline=‘‘) as filereader: #讀取已有文件 with open(

python3使用csv模塊csv

單元 支持 返回 分隔符 blog ade 使用 open row python3使用csv模塊讀寫csv文件 來源 https://www.cnblogs.com/meitian/p/4626455.html 讀取csv文件: import csv #打開文件,

PythonExcel的方式比較

註釋 作者 memory enc 地方 src 即使 嚴重 adf 雖然天天跟數據打交道,也頻繁地使用Excel進行一些簡單的數據處理和展示,但長期以來總是小心地避免用Python直接讀寫Excel文件。通常我都是把數據保存為以TAB分割的文本文件(TSV),再在Exc

支持各種特殊字符的 CSV 解析類 (.net 實現)(C#CSV)

ddr namespace 明顯 文件 tostring class star 允許 def CSV是一種十分簡潔的數據結構,在DOTNET平臺實際使用中發現微軟官方並沒有提供默認的方法,而網上好多例子發現實現並不嚴謹甚至一些含有明顯錯誤,所以後面自己實現了一個讀寫工具類,

如何用pythonCSV 格式

文件 原理 color print 讀取 python 數據 pytho bold 工作中經常會碰到讀寫CSV文件的情況。記錄下,方便自己以後查詢並與大家一起分享: 寫CSV文件方法一: import csv #導入CSV with open("D:\eg

python之configParser模塊配置

pytho 配置 添加 print name imp 配置文件 所有 con 借鑒:http://www.cnblogs.com/TankXiao/p/3038350.html configParser是python自帶的模塊,用來讀寫配置文件 配置文件的格式:[]包含的叫

python-ConfigParser模塊【配置

target new start 需要 details string 如何 設置變量 board http://www.codesky.net/article/201003/122500.html http://www.linuxso.com/linuxbiancheng/

python筆記5-python2csv中文亂碼問題

tde unicode編碼 [] utf set 分享圖片 lis ber utf-8 前言 python2最大的坑在於中文編碼問題,遇到中文報錯首先加u,再各種encode、decode。當list、tuple、dict裏面有中文時,打印出來的是Unicode編碼,這個是

python:實例化configparser模塊配置

txt 號碼 DBName edr tty 示例代碼 免費註冊 word mat 之前的博客介紹過利用python的configparser模塊讀寫配置文件的基礎用法,這篇博客,介紹下如何實例化,方便作為公共類調用。 實例化的好處有很多,既方便調用,又降低了腳本的維護成本,

python open with編輯

light open mod 題目 with open 文件 行數 adl txt 題目分析: 把grade 以行方式讀進內存 命名為 grade然後取前十行 , 把它寫入到 一個名字為 grade_new.txt 的文件中去然後, 再把 最後10行 , 追加到grad