Python讀取CSV的四種方式實(shí)現(xiàn)與對比
概述
CSV(Comma-Separated Values)是一種常見的數(shù)據(jù)交換格式。Python提供了多種讀取CSV文件的方法,每種方法都有其特點(diǎn)和適用場景。
方法一:使用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) # 每行是一個列表
特點(diǎn):
- 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']) # 通過列名訪問
特點(diǎn):
- 可以通過列名訪問數(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', ''], # 空值標(biāo)識 dtype={'col1': str} # 數(shù)據(jù)類型 )
特點(diǎn):
- 功能強(qiáng)大,參數(shù)豐富
- 支持?jǐn)?shù)據(jù)分析和處理
- 與其他數(shù)據(jù)科學(xué)庫集成好
- 需要安裝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' )
特點(diǎn):
- 處理數(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)
特點(diǎn):
- 完全可控,靈活性高
- 可處理特殊格式
- 代碼復(fù)雜,容易出錯
- 需要處理各種邊界情況
特殊情況處理
處理編碼問題
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):
# 處理每個塊
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): # 處理每個塊 chunk_list.append(chunk) df = pd.concat(chunk_list, ignore_index=True)
處理復(fù)雜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 | 功能強(qiáng)大,生態(tài)完善 |
簡單讀取 | csv模塊 | 內(nèi)置庫,輕量級 |
數(shù)值計算 | numpy | 性能優(yōu)秀 |
大文件處理 | csv模塊 + 逐行處理 | 內(nèi)存友好 |
特殊格式 | 手動解析 | 靈活可控 |
快速原型 | pandas | 開發(fā)效率高 |
性能對比
方法 | 內(nèi)存占用 | 處理速度 | 功能豐富度 | 學(xué)習(xí)成本 |
---|---|---|---|---|
csv模塊 | 低 | 中 | 低 | 低 |
pandas | 高 | 中 | 高 | 中 |
numpy | 低 | 高 | 中 | 中 |
手動解析 | 低 | 低 | 自定義 | 高 |
最佳實(shí)踐
優(yōu)先使用pandas:除非有特殊需求,pandas是最佳選擇
注意編碼問題:中文數(shù)據(jù)常用utf-8或gbk編碼
處理大文件:使用分塊讀取或csv模塊
數(shù)據(jù)驗(yàn)證:讀取后檢查數(shù)據(jù)完整性
異常處理:添加適當(dāng)?shù)腻e誤處理機(jī)制
示例代碼
# 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()將每行轉(zhuǎn)換為字典 適用于:需要按列名訪問數(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='', # 缺失值標(biāo)識 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): # 對每個塊進(jìn)行處理 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): """ 處理包含引號和逗號的復(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: 手動解析 ===") headers, data = read_csv_manually('sample.csv') print(f"表頭: {headers}") print(f"數(shù)據(jù): {data}") # 各種方法的對比總結(jié): """ 1. csv模塊: - 優(yōu)點(diǎn):Python內(nèi)置,無需安裝額外庫,內(nèi)存占用小 - 缺點(diǎn):功能相對簡單,不支持復(fù)雜的數(shù)據(jù)操作 - 適用:簡單的CSV讀取,小文件處理 2. pandas: - 優(yōu)點(diǎn):功能強(qiáng)大,支持?jǐn)?shù)據(jù)分析和處理,參數(shù)豐富 - 缺點(diǎn):需要安裝額外庫,內(nèi)存占用較大 - 適用:數(shù)據(jù)分析,復(fù)雜的數(shù)據(jù)處理,大部分CSV處理場景 3. numpy: - 優(yōu)點(diǎn):處理數(shù)值數(shù)據(jù)性能高,內(nèi)存效率好 - 缺點(diǎn):主要適用于數(shù)值數(shù)據(jù),對文本處理支持有限 - 適用:純數(shù)值CSV文件,科學(xué)計算 4. 手動解析: - 優(yōu)點(diǎn):完全可控,可以處理特殊格式 - 缺點(diǎn):代碼復(fù)雜,容易出錯,需要處理各種邊界情況 - 適用:特殊格式的CSV,需要自定義解析邏輯 選擇建議: - 數(shù)據(jù)分析:首選pandas - 簡單讀?。菏褂胏sv模塊 - 數(shù)值計算:考慮numpy - 特殊需求:手動解析 """
以上就是Python讀取CSV的四種方式實(shí)現(xiàn)與對比的詳細(xì)內(nèi)容,更多關(guān)于Python讀取CSV的資料請關(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)教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01Django + Uwsgi + Nginx 實(shí)現(xiàn)生產(chǎn)環(huán)境部署的方法
Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比較常見的一種方式。這篇文章主要介紹了Django + Uwsgi + Nginx 實(shí)現(xiàn)生產(chǎn)環(huán)境部署,感興趣的小伙伴們可以參考一下2018-06-06Pycharm中python調(diào)用另一個文件類或者函數(shù)
本文主要介紹了Pycharm中python調(diào)用另一個文件類或者函數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07python實(shí)現(xiàn)隨機(jī)加減法生成器
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)隨機(jī)加減法生成器,練手小項目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-02-02python實(shí)現(xiàn)在cmd窗口顯示彩色文字
今天小編就為大家分享一篇python實(shí)現(xiàn)在cmd窗口顯示彩色文字,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06Python自動化之UnitTest框架實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了關(guān)于Python自動化之UnitTest框架實(shí)戰(zhàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09