Python 利用CSV模塊處理數(shù)據(jù)的實現(xiàn)實例
CSV(Comma-Separated Values 逗號分割值)是一種簡單的數(shù)據(jù)存儲與分享方式,和Excel相比,CSV文件的一個主要優(yōu)點是有很多程序可以存儲,轉(zhuǎn)換和處理純文本文件,因此應(yīng)用場景更加廣泛。
一、CSV模塊簡介
考慮下面的CSV文件:salary.csv。雖然可以使用str.split(‘,’)這樣的方式處理數(shù)據(jù),但是當(dāng)遇到帶逗號分隔的金額會導(dǎo)致拆分錯誤,除此之外還可能遇到其他各種問題:
id,name,hire_date, salary ,bonus 1,Vincent,2024/1/1," 1,000.00 ",100 2,Victor,2024/1/2," 2,000.00 ",200 3,Grace,2024/1/3," 3,000.00 ",300
使用split拆分代碼如下,金額1,000.00被錯誤的分成了2段:
input_file = 'salary.csv' with open(input_file, 'r', newline='') as fi: header = fi.readline() header = header.strip() header_list = header.split(',') print(header_list) for row in fi: field_list = row.strip().split(',') print(field_list)
對于這類問題,建議選擇標(biāo)準(zhǔn)庫中的CSV模塊來進行處理,CSV模塊被設(shè)計成能夠識別微軟Excel所采用的編碼規(guī)則,可以識別出這種模式并正確的分析數(shù)據(jù)。
CSV模塊常用函數(shù)如下:
- csv.reader(csvfile, dialect=‘excel’, **fmtparams),返回一個reader對象,通過該對象處理csvfile中的數(shù)據(jù),此函數(shù)用來打開輸入文件。csvfile必須是包含字符串的可迭代對象,通常是文件型對象或列表,如果csvfile是一個文件對象,則打開時應(yīng)設(shè)置newline=‘’。
- csv.writer(csvfile, dialect=‘excel’, **fmtparams),返回一個writer對象,該對象負(fù)責(zé)將數(shù)據(jù)在給定的文件型對象上轉(zhuǎn)換為帶分隔符的字符串,此函數(shù)用來打開輸出文件。如果csvfile是一個文件對象,則打開時應(yīng)設(shè)置newline=‘’。
二、用法示例
下面兩個示例演示從CSV文件中選取特定的行、列,更復(fù)雜的操作都可以在此基礎(chǔ)上進行擴展。
2.1 使用CSV模塊選取特定的行
對于文件salary.csv,過濾出salary列大于1000的行,并寫入results.csv。由于原數(shù)據(jù)類型為字符串且包含逗號,所以需要先去除值里的逗號,最后用float函數(shù)轉(zhuǎn)換為浮點數(shù)與1000進行比較。篩選出符合條件的數(shù)據(jù)后調(diào)用writer對象上的writerow方法逐行寫入results.csv:
import csv input_file = 'salary.csv' output_file = 'results.csv' with open(input_file, 'r', newline='') as fi: with open(output_file, 'w', newline='') as fo: reader = csv.reader(fi, delimiter=',') # 默認(rèn)分隔符就是逗號,delimiter=','也可省略 writer = csv.writer(fo) header = next(reader) # 讀取第一行標(biāo)題 print(header) writer.writerow(header) # 先將標(biāo)題寫入文件 for row in reader: salary = float(row[3].replace(',', '')) # 去除逗號并轉(zhuǎn)換為float型 if salary > 1000: print(row) writer.writerow(row)
這里可以看到CSV模塊可以正確處理金額中的逗號,不會拆分為2段。
2.2 優(yōu)化:通過標(biāo)題名引用列
上面的示例中,在判斷金額大于1000時,因為要特殊處理,所以我們用row[3]這種索引方式來選取salary列。如果要處理的列很多,那么都通過row[idx]來引用不僅麻煩而且容易搞混淆。這里用命名元組(collections.namedtuple)優(yōu)化一下,命名元組賦予每個位置一個含義,提供可讀性并添加了通過列名獲取值的能力(用索引依然也是可以的)。
import csv from collections import namedtuple input_file = 'salary.csv' output_file = 'results.csv' with open(input_file, 'r', newline='') as fi: with open(output_file, 'w', newline='') as fo: reader = csv.reader(fi, delimiter=',') # 默認(rèn)分隔符就是逗號,delimeter=','也可省略 writer = csv.writer(fo) header = next(reader) # 讀取第一行標(biāo)題 print(header) writer.writerow(header) # 先將標(biāo)題寫入文件 namedrow = namedtuple('namedrow', header) # 命名元組定義 for row in reader: row = namedrow(*row) # 轉(zhuǎn)換為命名元組 salary = float(row.salary.replace(',', '')) # 通過row.salary引用salary列 if salary > 1000: print(row) writer.writerow(row)
2.3 使用CSV模塊篩選特定的行
現(xiàn)只需要選取id, name, salary三列。處理思路為通過標(biāo)題先將3列的索引位置保存到列表中,然后在每行循環(huán)中,根據(jù)索引位置只保存這3列數(shù)據(jù):
import csv input_file = 'salary.csv' output_file = 'results.csv' with open(input_file, 'r', newline='') as fi: with open(output_file, 'w', newline='') as fo: reader = csv.reader(fi, delimiter=',') # 默認(rèn)分隔符就是逗號,delimiter=','也可省略 writer = csv.writer(fo) header = next(reader) # 讀取第一行標(biāo)題 columns = ['id', 'name', 'salary'] # 需要的列 col_idx = [] for idx in range(len(header)): if header[idx] in columns: # 如果在選取的范圍內(nèi),保存索引 col_idx.append(idx) writer.writerow(columns) # 先將標(biāo)題寫入文件 for row in reader: results = [] for idx in col_idx: results.append(row[idx]) # 通過索引只保留需要的列 print(results) writer.writerow(results)
到此這篇關(guān)于Python 利用CSV模塊處理數(shù)據(jù)的實現(xiàn)實例的文章就介紹到這了,更多相關(guān)Python CSV模塊處理數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python處理csv數(shù)據(jù)的方法
- Python導(dǎo)出數(shù)據(jù)到Excel可讀取的CSV文件的方法
- 利用python將json數(shù)據(jù)轉(zhuǎn)換為csv格式的方法
- 使用python獲取csv文本的某行或某列數(shù)據(jù)的實例
- 利用Python如何將數(shù)據(jù)寫到CSV文件中
- Python 中導(dǎo)入csv數(shù)據(jù)的三種方法
- Python將列表數(shù)據(jù)寫入文件(txt, csv,excel)
- Python使用Pandas對csv文件進行數(shù)據(jù)處理的方法
- python數(shù)據(jù)處理之如何選取csv文件中某幾行的數(shù)據(jù)
- python讀寫數(shù)據(jù)讀寫csv文件(pandas用法)
- Python從csv文件中讀取數(shù)據(jù)及提取數(shù)據(jù)的方法
相關(guān)文章
python中requests爬去網(wǎng)頁內(nèi)容出現(xiàn)亂碼問題解決方法介紹
這篇文章主要介紹了python中requests爬去網(wǎng)頁內(nèi)容出現(xiàn)亂碼問題解決方法,2017-10-10python元組和字典的內(nèi)建函數(shù)實例詳解
這篇文章主要介紹了python元組和字典的內(nèi)建函數(shù),結(jié)合實例形式詳細(xì)分析了Python元組和字典的各種常見內(nèi)建函數(shù)功能與相關(guān)使用技巧,需要的朋友可以參考下2019-10-10Pytorch使用CUDA流(CUDA?stream)的實現(xiàn)
本文主要介紹了Pytorch使用CUDA流(CUDA?stream)的實現(xiàn),CUDA流是在GPU上并行執(zhí)行操作的一種機制,通過使用CUDA流,可以將不同的操作分配給不同的流,在不同的流上并行執(zhí)行這些操作,從而提高代碼的性能2023-12-12django框架配置swagger以及自定義參數(shù)使用方式
這篇文章主要介紹了django框架配置swagger以及自定義參數(shù)使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11python中format函數(shù)與round函數(shù)的區(qū)別
大家好,本篇文章主要講的是python中format函數(shù)與round函數(shù)的區(qū)別,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01Python?虛擬環(huán)境遷移到其他電腦的實現(xiàn)
本文主要介紹了Python?虛擬環(huán)境遷移到其他電腦的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04python中pandas.DataFrame對行與列求和及添加新行與列示例
pandas是python環(huán)境下最有名的數(shù)據(jù)統(tǒng)計包,而DataFrame翻譯為數(shù)據(jù)框,是一種數(shù)據(jù)組織方式,這篇文章主要給大家介紹了python中pandas.DataFrame對行與列求和及添加新行與列的方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來一起看看吧。2017-03-03Python利用帶權(quán)重隨機數(shù)解決抽獎和游戲爆裝備問題
帶權(quán)重隨機數(shù)即是隨機數(shù)各個區(qū)間段被抽中的概率根據(jù)權(quán)重而不同,這里我們就來看一下Python利用帶權(quán)重隨機數(shù)解決抽獎和游戲爆裝備問題的方法,首先還是來進一步解釋帶權(quán)隨機數(shù):2016-06-06純numpy卷積神經(jīng)網(wǎng)絡(luò)實現(xiàn)手寫數(shù)字識別的實踐
本文主要介紹了純numpy卷積神經(jīng)網(wǎng)絡(luò)實現(xiàn)手寫數(shù)字識別的實踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08