Python 利用CSV模塊處理數(shù)據(jù)的實(shí)現(xiàn)實(shí)例
CSV(Comma-Separated Values 逗號(hào)分割值)是一種簡單的數(shù)據(jù)存儲(chǔ)與分享方式,和Excel相比,CSV文件的一個(gè)主要優(yōu)點(diǎn)是有很多程序可以存儲(chǔ),轉(zhuǎn)換和處理純文本文件,因此應(yīng)用場景更加廣泛。
一、CSV模塊簡介
考慮下面的CSV文件:salary.csv。雖然可以使用str.split(‘,’)這樣的方式處理數(shù)據(jù),但是當(dāng)遇到帶逗號(hào)分隔的金額會(huì)導(dǎo)致拆分錯(cuò)誤,除此之外還可能遇到其他各種問題:
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被錯(cuò)誤的分成了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)

對(duì)于這類問題,建議選擇標(biāo)準(zhǔn)庫中的CSV模塊來進(jìn)行處理,CSV模塊被設(shè)計(jì)成能夠識(shí)別微軟Excel所采用的編碼規(guī)則,可以識(shí)別出這種模式并正確的分析數(shù)據(jù)。
CSV模塊常用函數(shù)如下:
- csv.reader(csvfile, dialect=‘excel’, **fmtparams),返回一個(gè)reader對(duì)象,通過該對(duì)象處理csvfile中的數(shù)據(jù),此函數(shù)用來打開輸入文件。csvfile必須是包含字符串的可迭代對(duì)象,通常是文件型對(duì)象或列表,如果csvfile是一個(gè)文件對(duì)象,則打開時(shí)應(yīng)設(shè)置newline=‘’。
- csv.writer(csvfile, dialect=‘excel’, **fmtparams),返回一個(gè)writer對(duì)象,該對(duì)象負(fù)責(zé)將數(shù)據(jù)在給定的文件型對(duì)象上轉(zhuǎn)換為帶分隔符的字符串,此函數(shù)用來打開輸出文件。如果csvfile是一個(gè)文件對(duì)象,則打開時(shí)應(yīng)設(shè)置newline=‘’。
二、用法示例
下面兩個(gè)示例演示從CSV文件中選取特定的行、列,更復(fù)雜的操作都可以在此基礎(chǔ)上進(jìn)行擴(kuò)展。
2.1 使用CSV模塊選取特定的行
對(duì)于文件salary.csv,過濾出salary列大于1000的行,并寫入results.csv。由于原數(shù)據(jù)類型為字符串且包含逗號(hào),所以需要先去除值里的逗號(hào),最后用float函數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)與1000進(jìn)行比較。篩選出符合條件的數(shù)據(jù)后調(diào)用writer對(duì)象上的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)分隔符就是逗號(hào),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(',', '')) # 去除逗號(hào)并轉(zhuǎn)換為float型
if salary > 1000:
print(row)
writer.writerow(row)

這里可以看到CSV模塊可以正確處理金額中的逗號(hào),不會(huì)拆分為2段。
2.2 優(yōu)化:通過標(biāo)題名引用列
上面的示例中,在判斷金額大于1000時(shí),因?yàn)橐厥馓幚?,所以我們用row[3]這種索引方式來選取salary列。如果要處理的列很多,那么都通過row[idx]來引用不僅麻煩而且容易搞混淆。這里用命名元組(collections.namedtuple)優(yōu)化一下,命名元組賦予每個(gè)位置一個(gè)含義,提供可讀性并添加了通過列名獲取值的能力(用索引依然也是可以的)。
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)分隔符就是逗號(hào),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)分隔符就是逗號(hào),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ù)的實(shí)現(xiàn)實(shí)例的文章就介紹到這了,更多相關(guān)Python CSV模塊處理數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(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ù)的實(shí)例
- 利用Python如何將數(shù)據(jù)寫到CSV文件中
- Python 中導(dǎo)入csv數(shù)據(jù)的三種方法
- Python將列表數(shù)據(jù)寫入文件(txt, csv,excel)
- Python使用Pandas對(duì)csv文件進(jìn)行數(shù)據(jù)處理的方法
- python數(shù)據(jù)處理之如何選取csv文件中某幾行的數(shù)據(jù)
- python讀寫數(shù)據(jù)讀寫csv文件(pandas用法)
- Python從csv文件中讀取數(shù)據(jù)及提取數(shù)據(jù)的方法
相關(guān)文章
Python中UserWarning:The NumPy module was
在 Python 項(xiàng)目中,我們經(jīng)常需要導(dǎo)入許多庫來完成各種任務(wù),NumPy 作為一個(gè)核心的科學(xué)計(jì)算庫,被廣泛應(yīng)用于數(shù)據(jù)處理和分析,然而,有時(shí)我們會(huì)遇到 NumPy 重載的警告,本文將詳細(xì)講解這一警告的原因,并提供解決方案,需要的朋友可以參考下2024-07-07
使用Python爬蟲庫requests發(fā)送表單數(shù)據(jù)和JSON數(shù)據(jù)
今天再為大家介紹下使用Python爬蟲庫requests發(fā)送表單數(shù)據(jù)和JSON數(shù)據(jù)的方法,這是最基本的使用方法,大家可以參考測試下2020-01-01
python函數(shù)中return后的語句一定不會(huì)執(zhí)行嗎?
這篇文章主要給大家詳細(xì)分析講解了關(guān)于python函數(shù)中return語句后的語句是否一定不會(huì)執(zhí)行的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。2017-07-07
使用Python自動(dòng)化處理Excel表格的操作方法
本文介紹Python操作Excel的多種方法及工具,如xlrd/xlwt/xlutils、openpyxl、xlwings和Pandas,涵蓋讀寫、交互及數(shù)據(jù)分析,并提供實(shí)際應(yīng)用場景,感興趣的朋友跟隨小編一起看看吧2025-08-08
關(guān)于Python不換行輸出和不換行輸出end=““不顯示的問題(親測已解決)
這篇文章主要介紹了關(guān)于Python不換行輸出和不換行輸出end=““不顯示的問題(親測已解決),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10

