教你用Python讀取CSV文件的5種方式
在python里面,讀取或?qū)懭隿sv文件時(shí),首先要import csv這個(gè)庫(kù),然后利用這個(gè)庫(kù)提供的方法進(jìn)行對(duì)文件的讀寫(xiě)。
典型的數(shù)據(jù)集stocks.csv:
一個(gè)股票的數(shù)據(jù)集,其實(shí)就是常見(jiàn)的表格數(shù)據(jù)。有股票代碼,價(jià)格,日期,時(shí)間,價(jià)格變動(dòng)和成交量。這個(gè)數(shù)據(jù)集其實(shí)就是一個(gè)表格數(shù)據(jù),有自己的頭部和身體。
第一招:簡(jiǎn)單的讀取
我們先來(lái)看一種簡(jiǎn)單讀取方法,先用csv.reader()函數(shù)讀取文件的句柄f生成一個(gè)csv的句柄,其實(shí)就是一個(gè)迭代器,我們看一下這個(gè)reader的源碼:
喂給reader一個(gè)可迭代對(duì)象或者是文件的object,然后返回一個(gè)可迭代對(duì)象。
- 首先讀取csv 文件,然后用csv.reader生成一個(gè)csv迭代器f_csv
- 然后利用迭代器的特性,next(f_csv)獲取csv文件的頭,也就是表格數(shù)據(jù)的頭
- 接著利用for循環(huán),一行一行打印row的內(nèi)容,也就是表格數(shù)據(jù)的身體
第二招:用nametuple
上面的第一招其實(shí)是最簡(jiǎn)單的,下面我們用nametuple 來(lái)包裹一下這個(gè)生成的row數(shù)據(jù)。
- nametuple其實(shí)是一個(gè)非常有用的類,這個(gè)類屬于collections模塊,而這個(gè)模塊簡(jiǎn)直就是一個(gè)百寶箱里面有非常多的牛逼的庫(kù);
- 這里我們用next(f_csv)其實(shí)就是獲取表格的頭部來(lái)初始化這個(gè)Row;
- 然后循環(huán)來(lái)構(gòu)造這個(gè)Row的數(shù)據(jù),把我們表格里面的每一行的數(shù)據(jù)都喂成nametuple格式的row_info;
- 這樣做的好處就是你可以隨心所欲的訪問(wèn)這個(gè)row_info里面的數(shù)據(jù),就想訪問(wèn)類數(shù)據(jù)一樣,比如row_info.price
第三招:用tuple類型轉(zhuǎn)換
如果我們對(duì)csv數(shù)據(jù)每一行的類型都非常清楚的話,嘿嘿可以用一個(gè)設(shè)定好的數(shù)據(jù)格式轉(zhuǎn)換頭來(lái)對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換。
操作的步驟其實(shí)跟上面差不多,就是對(duì)數(shù)據(jù)結(jié)果的清洗處理稍微不一樣。這里非常巧妙的zip來(lái)構(gòu)造一個(gè)嵌套的數(shù)據(jù)列表,然后用convert(data)把csv文件里面每一行的數(shù)據(jù)進(jìn)行類型轉(zhuǎn)換,這招真的不錯(cuò)!
看一下結(jié)果:
第四招:用DictReader
上面用的nametuple其實(shí)也是一個(gè)數(shù)據(jù)的映射,有沒(méi)有什么方法可以直接把csv 的內(nèi)容用映射的方法讀取,直接出來(lái)一個(gè)字典,還真有的,來(lái)看一下代碼:
是不是非常簡(jiǎn)捷,原來(lái)csv模塊直接內(nèi)置了DictReader(),按照字典的方法進(jìn)行讀取,然后生成一個(gè)有序的字典,看一下結(jié)果:
有興趣的可以看一下這個(gè)DictReader()的源碼,它其實(shí)一個(gè)內(nèi)部構(gòu)造的迭代器類,在內(nèi)部的__next__其實(shí)也是用的OrderedDict(zip(self.fieldnames, row))來(lái)生成的。
第五招:用字典轉(zhuǎn)換
如果我們需要對(duì)這個(gè)csv里面的數(shù)據(jù)進(jìn)行清洗,因?yàn)樽x出來(lái)的時(shí)候都是字符串,我們需要更新為特定的數(shù)據(jù)類型,這個(gè)時(shí)候也可以用字典轉(zhuǎn)換這一招,也是非常巧妙的,我們看一下源碼:
原來(lái)的數(shù)據(jù)價(jià)格Price和成交量,我希望最后讀取生成的是一個(gè)浮點(diǎn)型數(shù)據(jù)和整形的數(shù)據(jù),這么搞呢,用一個(gè)字典來(lái)巧妙的更新key即可。
- 首先我們聲明一個(gè)自定義的類型轉(zhuǎn)換器field_types;
- 然后循環(huán)生成一個(gè)可迭代的對(duì)象(key,conversion(row[key]);
- 最后更新一下字典里面相同的key,比如row[‘price']的內(nèi)容就會(huì)被更新了
參考鏈接 :
用Python讀取CSV文件的5種方式https://mp.weixin.qq.com/s/cs4buSULva1FgCctp_fB6g
到此這篇關(guān)于教你用Python讀取CSV文件的5種方式的文章就介紹到這了,更多相關(guān)Python讀取CSV文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)兩個(gè)list求交集,并集,差集的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)兩個(gè)list求交集,并集,差集的方法,結(jié)合實(shí)例形式分析了Python使用intersection、union及difference方法實(shí)現(xiàn)兩個(gè)集合list的交集、并集與差集操作技巧,需要的朋友可以參考下2018-08-08python 利用pywifi模塊實(shí)現(xiàn)連接網(wǎng)絡(luò)破解wifi密碼實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)
這篇文章主要介紹了python 利用pywifi模塊實(shí)現(xiàn)連接網(wǎng)絡(luò)破解wifi密碼實(shí)時(shí)監(jiān)控網(wǎng)絡(luò),需要的朋友可以參考下2019-09-09使用python和Django完成博客數(shù)據(jù)庫(kù)的遷移方法
下面小編就為大家分享一篇使用python和Django完成博客數(shù)據(jù)庫(kù)的遷移方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01windows10環(huán)境下用anaconda和VScode配置的圖文教程
這篇文章主要介紹了windows10環(huán)境下用anaconda和VScode配置的圖文教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家介紹的非常詳細(xì),需要的朋友可以參考下2020-03-03Python爬蟲(chóng)信息輸入及頁(yè)面的切換方法
今天小編就為大家分享一篇Python爬蟲(chóng)信息輸入及頁(yè)面的切換方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Python模擬登陸淘寶并統(tǒng)計(jì)淘寶消費(fèi)情況的代碼實(shí)例分享
借助urllib、urllib2和BeautifulSoup等幾個(gè)模塊的常用爬蟲(chóng)開(kāi)發(fā)組合,我們能夠輕易實(shí)現(xiàn)一份淘寶對(duì)賬單,這里我們就來(lái)看一則Python模擬登陸淘寶并統(tǒng)計(jì)淘寶消費(fèi)情況的代碼實(shí)例分享:2016-07-07OpenCV圖像修復(fù)cv2.inpaint()的使用
這篇博客將介紹如何通過(guò)OpenCV中圖像修復(fù)的技術(shù)——cv2.inpaint() 去除舊照片中的小噪音、筆劃等。并提供一個(gè)可交互式的程序,感興趣的可以了解一下2021-08-08Scrapy-Redis之RedisSpider與RedisCrawlSpider詳解
這篇文章主要介紹了Scrapy-Redis之RedisSpider與RedisCrawlSpider詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11