CSV文件读取和处理
CSV的特點(diǎn)
- 每行文本都呈現(xiàn)為行,字段被分隔符分隔開(kāi)。這個(gè)分隔符通常是逗號(hào),有時(shí)也是制表符。
- 不需要使用專門的CSV軟件來(lái)導(dǎo)入CSV文件。使用最簡(jiǎn)單的文本編輯器就可以打開(kāi)CSV文件。
- 對(duì)于大多數(shù)編程語(yǔ)言而言,讀取編寫CSV文件的程序會(huì)相對(duì)簡(jiǎn)單。
- 任何電子表格應(yīng)用都可以用來(lái)讀取CSV文件。
使用Python對(duì)CSV文件進(jìn)行讀寫
with語(yǔ)句介紹
通常情況下使用python進(jìn)行讀文件的語(yǔ)句是這樣的
f = open('/Users/michael/test.txt', 'r')如果文件打開(kāi)成功,接下來(lái),調(diào)用read()方法可以一次讀取文件的全部?jī)?nèi)容
f.read()由于文件讀寫時(shí)都有可能產(chǎn)生IOError,一旦出錯(cuò),后面的f.close()就不會(huì)調(diào)用。所以,為了保證無(wú)論是否出錯(cuò)都能正確地關(guān)閉文件,我們可以使用try … finally來(lái)實(shí)現(xiàn):
try:f = open('/path/to/file', 'r')print(f.read()) finally:if f:f.close()但是每次都這么寫實(shí)在太繁瑣,所以,Python引入了with語(yǔ)句來(lái)自動(dòng)幫我們調(diào)用close()方法:
with open('/path/to/file', 'r') as f:print(f.read())這和前面的try …finally是一樣的,但是代碼更佳簡(jiǎn)潔,并且不必調(diào)用f.close()方法。
將CSV語(yǔ)句轉(zhuǎn)換為列表的方法
方法一:
import unincodecsv enrollments=[] with open('enrollments.csv','rb') as f:reader=unicodecsv.DictReader(f)for row in reader:enrollments.append(row) enrollments[0]我們讀文件時(shí)使用DictReader()方法而不用reader()方法的原因是DictReader()方法返回的是一個(gè)字典,而用reader()方法返回的是一個(gè)迭代對(duì)象。之后將reader中的內(nèi)容按行讀取,放到enrollments中。
更簡(jiǎn)潔的方法二:
import unincodecsv with open('enrollments.csv','rb') as f:reader=unicodecsv.DictReader(f)enrollmenst=list(reader) enrollments[0]這種方法的好處是可以省去for循環(huán),將reader強(qiáng)制轉(zhuǎn)換為列表。
從CSV文件中讀取前十行并將其值存為字典
def parse_file(datafile):data=[]with open(datafile,"rb") as f:header=f.readline().splite(",")counter=0for line in f: #從新讀取十行if counter==10:breakfields=line.splite(",") #設(shè)立一個(gè)entry空字典,每次賦給data后都將這個(gè)字典清空entry={}for i,value in enumerate(fields):entry[header[i].strip()]=value.strip()data.append(entry)counter+=1return data這段代碼中首先使用with語(yǔ)句打開(kāi)文件,接下來(lái)讀取文件第一行的內(nèi)容并按照“,”進(jìn)行分割。header中的內(nèi)容將作為字典的關(guān)鍵字。header[i]為header中的對(duì)應(yīng)項(xiàng),用strip()方法處理之后就是關(guān)鍵字。value.strip()為值。
read()、readline()和readlines()方法
這三個(gè)方法都是讀文本中的字符串,下面簡(jiǎn)單介紹一下用法
read()
read() 每次讀取整個(gè)文件,它通常用于將文件內(nèi)容放到一個(gè)字符串變量中。
readline()和readlines()
readline() 和 readlines()之間的差異是后者一次讀取整個(gè)文件對(duì)象 。
readlines()一次讀取整個(gè)文件=。并且自動(dòng)將文件內(nèi)容分析成一個(gè)行的列表,該列表可以由 Python 的 for… in … 結(jié)構(gòu)進(jìn)行處理。另一方面,readline()每次只讀取一行,通常比 readlines()慢得多。僅當(dāng)沒(méi)有足夠內(nèi)存可以一次讀取整個(gè)文件時(shí),才應(yīng)該使用readline()。
enumerate()函數(shù)介紹
enumerate是枚舉的意思,在python中這個(gè)函數(shù)的作用是用于遍歷序列中的元素以及它們的下標(biāo)。可以用于創(chuàng)建字典,將鍵和值對(duì)應(yīng)歸類。如下代碼所示(當(dāng)然并不是用下面的代碼就能創(chuàng)建字典,index通常是提供鍵位置的索引):
list1 = ["這", "是", "一個(gè)", "測(cè)試"] for index, item in enumerate(list1):print index, item >>> 0 這 1 是 2 一個(gè) 3 測(cè)試strip()方法介紹
strip()方法用于移除字符串頭尾指定的字符(默認(rèn)為空格)。本程序中使用的strip()方法通常是用來(lái)清除文件這行的標(biāo)題值或者單個(gè)值周圍無(wú)關(guān)的空白部分(空行)
更簡(jiǎn)潔的方法
import csv def parse_csv(datafile):data=[]with open(datafile,"rb") as sd:r=csv.DictReader(sd)for line in r;data.append(line)return data這里引入csv模塊,使用DictReader方法,直接將數(shù)據(jù)讀取為字典。DictReader方法假設(shè)所讀取的文件的第一行為標(biāo)題行,將其作為鍵。
CSV官方幫助文檔
最后附上我的優(yōu)達(dá)學(xué)城優(yōu)惠碼:C7B2877A
總結(jié)
以上是生活随笔為你收集整理的CSV文件读取和处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 推论统计学基础一:Estimation
- 下一篇: 用XLRD批处理Excel