Python讀取CSV的四種方式實現(xiàn)與對比
概述
CSV(Comma-Separated Values)是一種常見的數(shù)據(jù)交換格式。Python提供了多種讀取CSV文件的方法,每種方法都有其特點和適用場景。
方法一:使用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) # 每行是一個列表
特點:
- Python內(nèi)置,無需安裝額外庫
- 內(nèi)存占用小,適合大文件
- 逐行讀取,節(jié)省內(nèi)存
- 功能相對簡單
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']) # 通過列名訪問
特點:
- 可以通過列名訪問數(shù)據(jù)
- 代碼更易讀
- 內(nèi)存占用比reader()稍大
方法二:使用pandas庫
2.1 基本用法
import pandas as pd
df = pd.read_csv('data.csv')
print(df.head()) # 顯示前5行
2.2 高級參數(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', ''], # 空值標識
dtype={'col1': str} # 數(shù)據(jù)類型
)
特點:
- 功能強大,參數(shù)豐富
- 支持數(shù)據(jù)分析和處理
- 與其他數(shù)據(jù)科學庫集成好
- 需要安裝pandas
- 內(nèi)存占用較大
方法三:使用numpy庫
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, # 自動推斷類型
encoding='utf-8'
)
特點:
- 處理數(shù)值數(shù)據(jù)性能高
- 內(nèi)存效率好
- 主要適用于數(shù)值數(shù)據(jù)
- 文本處理能力有限
方法四:手動解析
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)
特點:
- 完全可控,靈活性高
- 可處理特殊格式
- 代碼復雜,容易出錯
- 需要處理各種邊界情況
特殊情況處理
處理編碼問題
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
處理大文件(分塊讀取)
chunk_list = []
for chunk in pd.read_csv('large_file.csv', chunksize=1000):
# 處理每個塊
chunk_list.append(chunk)
df = pd.concat(chunk_list, ignore_index=True)
處理復雜CSV(包含引號、逗號)
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)
方法選擇指南
| 場景 | 推薦方法 | 理由 |
|---|---|---|
| 數(shù)據(jù)分析 | pandas | 功能強大,生態(tài)完善 |
| 簡單讀取 | csv模塊 | 內(nèi)置庫,輕量級 |
| 數(shù)值計算 | numpy | 性能優(yōu)秀 |
| 大文件處理 | csv模塊 + 逐行處理 | 內(nèi)存友好 |
| 特殊格式 | 手動解析 | 靈活可控 |
| 快速原型 | pandas | 開發(fā)效率高 |
性能對比
| 方法 | 內(nèi)存占用 | 處理速度 | 功能豐富度 | 學習成本 |
|---|---|---|---|---|
| csv模塊 | 低 | 中 | 低 | 低 |
| pandas | 高 | 中 | 高 | 中 |
| numpy | 低 | 高 | 中 | 中 |
| 手動解析 | 低 | 低 | 自定義 | 高 |
最佳實踐
優(yōu)先使用pandas:除非有特殊需求,pandas是最佳選擇
注意編碼問題:中文數(shù)據(jù)常用utf-8或gbk編碼
處理大文件:使用分塊讀取或csv模塊
數(shù)據(jù)驗證:讀取后檢查數(shù)據(jù)完整性
異常處理:添加適當?shù)腻e誤處理機制
示例代碼
# Python讀取CSV的幾種方式
# 1. 使用csv模塊(Python內(nèi)置)
import csv
# 方法1.1: 使用csv.reader()讀取
def read_csv_with_reader(filename):
"""
使用csv.reader()逐行讀取CSV文件
適用于:簡單的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()將每行轉換為字典
適用于:需要按列名訪問數(shù)據(jù)的場景
"""
with open(filename, 'r', encoding='utf-8') as file:
csv_reader = csv.DictReader(file)
for row in csv_reader:
print(row) # 每行是一個字典
# 可以通過列名訪問:row['column_name']
# 2. 使用pandas庫(需要安裝: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的高級參數(shù)讀取CSV
"""
df = pd.read_csv(
filename,
encoding='utf-8', # 指定編碼
sep=',', # 分隔符
header=0, # 表頭行號
index_col=0, # 索引列
usecols=['col1', 'col2'], # 只讀取指定列
nrows=1000, # 只讀取前1000行
skiprows=1, # 跳過第1行
na_values=['NULL', ''], # 指定空值表示
dtype={'col1': str} # 指定列的數(shù)據(jù)類型
)
return df
# 3. 使用numpy庫(需要安裝: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, # 自動推斷數(shù)據(jù)類型
encoding='utf-8',
missing_values='', # 缺失值標識
filling_values=0 # 缺失值填充
)
return data
# 4. 使用內(nèi)置open()函數(shù)手動解析
def read_csv_manually(filename):
"""
手動解析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)存不足以加載整個文件的情況
"""
chunk_list = []
for chunk in pd.read_csv(filename, chunksize=chunk_size):
# 對每個塊進行處理
processed_chunk = chunk # 這里可以添加處理邏輯
chunk_list.append(processed_chunk)
# 合并所有塊
df = pd.concat(chunk_list, ignore_index=True)
return df
# 方法5.3: 處理包含引號和逗號的CSV
def read_csv_with_quotes(filename):
"""
處理包含引號和逗號的復雜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: 手動解析 ===")
headers, data = read_csv_manually('sample.csv')
print(f"表頭: {headers}")
print(f"數(shù)據(jù): {data}")
# 各種方法的對比總結:
"""
1. csv模塊:
- 優(yōu)點:Python內(nèi)置,無需安裝額外庫,內(nèi)存占用小
- 缺點:功能相對簡單,不支持復雜的數(shù)據(jù)操作
- 適用:簡單的CSV讀取,小文件處理
2. pandas:
- 優(yōu)點:功能強大,支持數(shù)據(jù)分析和處理,參數(shù)豐富
- 缺點:需要安裝額外庫,內(nèi)存占用較大
- 適用:數(shù)據(jù)分析,復雜的數(shù)據(jù)處理,大部分CSV處理場景
3. numpy:
- 優(yōu)點:處理數(shù)值數(shù)據(jù)性能高,內(nèi)存效率好
- 缺點:主要適用于數(shù)值數(shù)據(jù),對文本處理支持有限
- 適用:純數(shù)值CSV文件,科學計算
4. 手動解析:
- 優(yōu)點:完全可控,可以處理特殊格式
- 缺點:代碼復雜,容易出錯,需要處理各種邊界情況
- 適用:特殊格式的CSV,需要自定義解析邏輯
選擇建議:
- 數(shù)據(jù)分析:首選pandas
- 簡單讀?。菏褂胏sv模塊
- 數(shù)值計算:考慮numpy
- 特殊需求:手動解析
"""
以上就是Python讀取CSV的四種方式實現(xiàn)與對比的詳細內(nèi)容,更多關于Python讀取CSV的資料請關注腳本之家其它相關文章!
相關文章
Pytorch 神經(jīng)網(wǎng)絡—自定義數(shù)據(jù)集上實現(xiàn)教程
今天小編就為大家分享一篇Pytorch 神經(jīng)網(wǎng)絡—自定義數(shù)據(jù)集上實現(xiàn)教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
Django + Uwsgi + Nginx 實現(xiàn)生產(chǎn)環(huán)境部署的方法
Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比較常見的一種方式。這篇文章主要介紹了Django + Uwsgi + Nginx 實現(xiàn)生產(chǎn)環(huán)境部署,感興趣的小伙伴們可以參考一下2018-06-06
Pycharm中python調(diào)用另一個文件類或者函數(shù)
本文主要介紹了Pycharm中python調(diào)用另一個文件類或者函數(shù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07
Python自動化之UnitTest框架實戰(zhàn)記錄
這篇文章主要給大家介紹了關于Python自動化之UnitTest框架實戰(zhàn)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09

