Python讀取CSV的四種方式實(shí)現(xiàn)與對(duì)比
概述
CSV(Comma-Separated Values)是一種常見的數(shù)據(jù)交換格式。Python提供了多種讀取CSV文件的方法,每種方法都有其特點(diǎn)和適用場(chǎng)景。
方法一:使用csv模塊(內(nèi)置)
1.1 csv.reader()
import csv
with open('data.csv', 'r', encoding='utf-8') as file:
csv_reader = csv.reader(file)
headers = next(csv_reader) # 讀取表頭
for row in csv_reader:
print(row) # 每行是一個(gè)列表
特點(diǎn):
- Python內(nèi)置,無需安裝額外庫(kù)
- 內(nèi)存占用小,適合大文件
- 逐行讀取,節(jié)省內(nèi)存
- 功能相對(duì)簡(jiǎn)單
1.2 csv.DictReader()
import csv
with open('data.csv', 'r', encoding='utf-8') as file:
csv_reader = csv.DictReader(file)
for row in csv_reader:
print(row['column_name']) # 通過列名訪問
特點(diǎn):
- 可以通過列名訪問數(shù)據(jù)
- 代碼更易讀
- 內(nèi)存占用比reader()稍大
方法二:使用pandas庫(kù)
2.1 基本用法
import pandas as pd
df = pd.read_csv('data.csv')
print(df.head()) # 顯示前5行
2.2 高級(jí)參數(shù)
df = pd.read_csv(
'data.csv',
encoding='utf-8', # 編碼
sep=',', # 分隔符
header=0, # 表頭行
index_col=0, # 索引列
usecols=['col1', 'col2'], # 指定列
nrows=1000, # 讀取行數(shù)
skiprows=1, # 跳過行數(shù)
na_values=['NULL', ''], # 空值標(biāo)識(shí)
dtype={'col1': str} # 數(shù)據(jù)類型
)
特點(diǎn):
- 功能強(qiáng)大,參數(shù)豐富
- 支持?jǐn)?shù)據(jù)分析和處理
- 與其他數(shù)據(jù)科學(xué)庫(kù)集成好
- 需要安裝pandas
- 內(nèi)存占用較大
方法三:使用numpy庫(kù)
3.1 numpy.loadtxt()
import numpy as np
# 適用于純數(shù)值數(shù)據(jù)
data = np.loadtxt('data.csv', delimiter=',', skiprows=1)
3.2 numpy.genfromtxt()
import numpy as np
data = np.genfromtxt(
'data.csv',
delimiter=',',
names=True, # 使用第一行作為列名
dtype=None, # 自動(dòng)推斷類型
encoding='utf-8'
)
特點(diǎn):
- 處理數(shù)值數(shù)據(jù)性能高
- 內(nèi)存效率好
- 主要適用于數(shù)值數(shù)據(jù)
- 文本處理能力有限
方法四:手動(dòng)解析
with open('data.csv', 'r', encoding='utf-8') as file:
lines = file.readlines()
headers = lines[0].strip().split(',')
data = []
for line in lines[1:]:
row = line.strip().split(',')
data.append(row)
特點(diǎn):
- 完全可控,靈活性高
- 可處理特殊格式
- 代碼復(fù)雜,容易出錯(cuò)
- 需要處理各種邊界情況
特殊情況處理
處理編碼問題
def read_csv_auto_encoding(filename):
encodings = ['utf-8', 'gbk', 'gb2312', 'utf-16']
for encoding in encodings:
try:
return pd.read_csv(filename, encoding=encoding)
except UnicodeDecodeError:
continue
return None
處理大文件(分塊讀?。?/h3>
chunk_list = []
for chunk in pd.read_csv('large_file.csv', chunksize=1000):
# 處理每個(gè)塊
chunk_list.append(chunk)
df = pd.concat(chunk_list, ignore_index=True)
chunk_list = []
for chunk in pd.read_csv('large_file.csv', chunksize=1000):
# 處理每個(gè)塊
chunk_list.append(chunk)
df = pd.concat(chunk_list, ignore_index=True)
處理復(fù)雜CSV(包含引號(hào)、逗號(hào))
import csv
with open('complex.csv', 'r') as file:
reader = csv.reader(file, quotechar='"', delimiter=',', quoting=csv.QUOTE_ALL)
for row in reader:
print(row)
方法選擇指南
| 場(chǎng)景 | 推薦方法 | 理由 |
|---|---|---|
| 數(shù)據(jù)分析 | pandas | 功能強(qiáng)大,生態(tài)完善 |
| 簡(jiǎn)單讀取 | csv模塊 | 內(nèi)置庫(kù),輕量級(jí) |
| 數(shù)值計(jì)算 | numpy | 性能優(yōu)秀 |
| 大文件處理 | csv模塊 + 逐行處理 | 內(nèi)存友好 |
| 特殊格式 | 手動(dòng)解析 | 靈活可控 |
| 快速原型 | pandas | 開發(fā)效率高 |
性能對(duì)比
| 方法 | 內(nèi)存占用 | 處理速度 | 功能豐富度 | 學(xué)習(xí)成本 |
|---|---|---|---|---|
| csv模塊 | 低 | 中 | 低 | 低 |
| pandas | 高 | 中 | 高 | 中 |
| numpy | 低 | 高 | 中 | 中 |
| 手動(dòng)解析 | 低 | 低 | 自定義 | 高 |
最佳實(shí)踐
優(yōu)先使用pandas:除非有特殊需求,pandas是最佳選擇
注意編碼問題:中文數(shù)據(jù)常用utf-8或gbk編碼
處理大文件:使用分塊讀取或csv模塊
數(shù)據(jù)驗(yàn)證:讀取后檢查數(shù)據(jù)完整性
異常處理:添加適當(dāng)?shù)腻e(cuò)誤處理機(jī)制
示例代碼
# Python讀取CSV的幾種方式
# 1. 使用csv模塊(Python內(nèi)置)
import csv
# 方法1.1: 使用csv.reader()讀取
def read_csv_with_reader(filename):
"""
使用csv.reader()逐行讀取CSV文件
適用于:簡(jiǎn)單的CSV文件讀取,內(nèi)存占用小
"""
with open(filename, 'r', encoding='utf-8') as file:
csv_reader = csv.reader(file)
# 讀取表頭
headers = next(csv_reader)
print(f"表頭: {headers}")
# 讀取數(shù)據(jù)行
for row in csv_reader:
print(row)
# 方法1.2: 使用csv.DictReader()讀取
def read_csv_with_dictreader(filename):
"""
使用csv.DictReader()將每行轉(zhuǎn)換為字典
適用于:需要按列名訪問數(shù)據(jù)的場(chǎng)景
"""
with open(filename, 'r', encoding='utf-8') as file:
csv_reader = csv.DictReader(file)
for row in csv_reader:
print(row) # 每行是一個(gè)字典
# 可以通過列名訪問:row['column_name']
# 2. 使用pandas庫(kù)(需要安裝:pip install pandas)
import pandas as pd
# 方法2.1: 基本讀取
def read_csv_with_pandas_basic(filename):
"""
使用pandas讀取CSV文件
適用于:數(shù)據(jù)分析、處理大量數(shù)據(jù)
"""
df = pd.read_csv(filename)
print(df.head()) # 顯示前5行
return df
# 方法2.2: 帶參數(shù)的讀取
def read_csv_with_pandas_advanced(filename):
"""
使用pandas的高級(jí)參數(shù)讀取CSV
"""
df = pd.read_csv(
filename,
encoding='utf-8', # 指定編碼
sep=',', # 分隔符
header=0, # 表頭行號(hào)
index_col=0, # 索引列
usecols=['col1', 'col2'], # 只讀取指定列
nrows=1000, # 只讀取前1000行
skiprows=1, # 跳過第1行
na_values=['NULL', ''], # 指定空值表示
dtype={'col1': str} # 指定列的數(shù)據(jù)類型
)
return df
# 3. 使用numpy庫(kù)(需要安裝:pip install numpy)
import numpy as np
# 方法3.1: 使用numpy.loadtxt()
def read_csv_with_numpy_loadtxt(filename):
"""
使用numpy.loadtxt()讀取數(shù)值型CSV
適用于:純數(shù)值數(shù)據(jù),性能要求高
"""
data = np.loadtxt(filename, delimiter=',', skiprows=1) # 跳過表頭
return data
# 方法3.2: 使用numpy.genfromtxt()
def read_csv_with_numpy_genfromtxt(filename):
"""
使用numpy.genfromtxt()讀取CSV(更靈活)
適用于:包含缺失值的數(shù)值數(shù)據(jù)
"""
data = np.genfromtxt(
filename,
delimiter=',',
names=True, # 第一行作為列名
dtype=None, # 自動(dòng)推斷數(shù)據(jù)類型
encoding='utf-8',
missing_values='', # 缺失值標(biāo)識(shí)
filling_values=0 # 缺失值填充
)
return data
# 4. 使用內(nèi)置open()函數(shù)手動(dòng)解析
def read_csv_manually(filename):
"""
手動(dòng)解析CSV文件
適用于:特殊格式的CSV或需要自定義解析邏輯
"""
with open(filename, 'r', encoding='utf-8') as file:
lines = file.readlines()
# 解析表頭
headers = lines[0].strip().split(',')
# 解析數(shù)據(jù)
data = []
for line in lines[1:]:
row = line.strip().split(',')
data.append(row)
return headers, data
# 5. 處理特殊情況的CSV
# 方法5.1: 處理不同編碼的CSV
def read_csv_different_encoding(filename):
"""
處理不同編碼的CSV文件
"""
encodings = ['utf-8', 'gbk', 'gb2312', 'utf-16']
for encoding in encodings:
try:
df = pd.read_csv(filename, encoding=encoding)
print(f"成功使用 {encoding} 編碼讀取文件")
return df
except UnicodeDecodeError:
continue
print("無法確定文件編碼")
return None
# 方法5.2: 處理大文件(分塊讀?。?
def read_large_csv_in_chunks(filename, chunk_size=1000):
"""
分塊讀取大型CSV文件
適用于:內(nèi)存不足以加載整個(gè)文件的情況
"""
chunk_list = []
for chunk in pd.read_csv(filename, chunksize=chunk_size):
# 對(duì)每個(gè)塊進(jìn)行處理
processed_chunk = chunk # 這里可以添加處理邏輯
chunk_list.append(processed_chunk)
# 合并所有塊
df = pd.concat(chunk_list, ignore_index=True)
return df
# 方法5.3: 處理包含引號(hào)和逗號(hào)的CSV
def read_csv_with_quotes(filename):
"""
處理包含引號(hào)和逗號(hào)的復(fù)雜CSV
"""
with open(filename, 'r', encoding='utf-8') as file:
csv_reader = csv.reader(file, quotechar='"', delimiter=',', quoting=csv.QUOTE_ALL)
for row in csv_reader:
print(row)
# 使用示例
if __name__ == "__main__":
# 創(chuàng)建示例CSV文件
sample_data = '''姓名,年齡,城市,薪資
張三,25,北京,8000
李四,30,上海,12000
王五,28,廣州,10000
趙六,35,深圳,15000'''
with open('sample.csv', 'w', encoding='utf-8') as f:
f.write(sample_data)
print("=== 方法1: 使用csv.reader() ===")
read_csv_with_reader('sample.csv')
print("\n=== 方法2: 使用csv.DictReader() ===")
read_csv_with_dictreader('sample.csv')
print("\n=== 方法3: 使用pandas ===")
df = read_csv_with_pandas_basic('sample.csv')
print(df)
print("\n=== 方法4: 手動(dòng)解析 ===")
headers, data = read_csv_manually('sample.csv')
print(f"表頭: {headers}")
print(f"數(shù)據(jù): {data}")
# 各種方法的對(duì)比總結(jié):
"""
1. csv模塊:
- 優(yōu)點(diǎn):Python內(nèi)置,無需安裝額外庫(kù),內(nèi)存占用小
- 缺點(diǎn):功能相對(duì)簡(jiǎn)單,不支持復(fù)雜的數(shù)據(jù)操作
- 適用:簡(jiǎn)單的CSV讀取,小文件處理
2. pandas:
- 優(yōu)點(diǎn):功能強(qiáng)大,支持?jǐn)?shù)據(jù)分析和處理,參數(shù)豐富
- 缺點(diǎn):需要安裝額外庫(kù),內(nèi)存占用較大
- 適用:數(shù)據(jù)分析,復(fù)雜的數(shù)據(jù)處理,大部分CSV處理場(chǎng)景
3. numpy:
- 優(yōu)點(diǎn):處理數(shù)值數(shù)據(jù)性能高,內(nèi)存效率好
- 缺點(diǎn):主要適用于數(shù)值數(shù)據(jù),對(duì)文本處理支持有限
- 適用:純數(shù)值CSV文件,科學(xué)計(jì)算
4. 手動(dòng)解析:
- 優(yōu)點(diǎn):完全可控,可以處理特殊格式
- 缺點(diǎn):代碼復(fù)雜,容易出錯(cuò),需要處理各種邊界情況
- 適用:特殊格式的CSV,需要自定義解析邏輯
選擇建議:
- 數(shù)據(jù)分析:首選pandas
- 簡(jiǎn)單讀?。菏褂胏sv模塊
- 數(shù)值計(jì)算:考慮numpy
- 特殊需求:手動(dòng)解析
"""
以上就是Python讀取CSV的四種方式實(shí)現(xiàn)與對(duì)比的詳細(xì)內(nèi)容,更多關(guān)于Python讀取CSV的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Pytorch 神經(jīng)網(wǎng)絡(luò)—自定義數(shù)據(jù)集上實(shí)現(xiàn)教程
今天小編就為大家分享一篇Pytorch 神經(jīng)網(wǎng)絡(luò)—自定義數(shù)據(jù)集上實(shí)現(xiàn)教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01
如何將你的應(yīng)用遷移到Python3的三個(gè)步驟
這篇文章主要介紹了如何將你的應(yīng)用遷移到Python3的三個(gè)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
Django + Uwsgi + Nginx 實(shí)現(xiàn)生產(chǎn)環(huán)境部署的方法
Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比較常見的一種方式。這篇文章主要介紹了Django + Uwsgi + Nginx 實(shí)現(xiàn)生產(chǎn)環(huán)境部署,感興趣的小伙伴們可以參考一下2018-06-06
Pycharm中python調(diào)用另一個(gè)文件類或者函數(shù)
本文主要介紹了Pycharm中python調(diào)用另一個(gè)文件類或者函數(shù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
python實(shí)現(xiàn)隨機(jī)加減法生成器
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)隨機(jī)加減法生成器,練手小項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02
python實(shí)現(xiàn)在cmd窗口顯示彩色文字
今天小編就為大家分享一篇python實(shí)現(xiàn)在cmd窗口顯示彩色文字,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06
Python自動(dòng)化之UnitTest框架實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了關(guān)于Python自動(dòng)化之UnitTest框架實(shí)戰(zhàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09

