Python CSV文件讀取與寫入操作的基礎(chǔ)指南
深入理解CSV文件讀寫的核心概念、底層邏輯與實(shí)戰(zhàn)用法,掌握Python基礎(chǔ)文件操作核心技能,熟練解決讀寫過(guò)程中的常見報(bào)錯(cuò),了解行業(yè)最佳實(shí)踐,為后續(xù)數(shù)據(jù)分析、數(shù)據(jù)清洗、自動(dòng)化辦公打下基礎(chǔ)。
本文屬于《Python從入門到精通教程》Python文件操作篇(第五篇)。
上一章我們講解了二進(jìn)制文件的讀寫(rb/wb模式),本章聚焦日常開發(fā)最常用的CSV結(jié)構(gòu)化文件讀寫,零基礎(chǔ)也能快速上手!
一、核心概念與背景
1.1 什么是CSV文件讀寫?
CSV(Comma-Separated Values,逗號(hào)分隔值)是一種通用的純文本結(jié)構(gòu)化文件格式,以逗號(hào)分隔數(shù)據(jù)、換行區(qū)分行數(shù)據(jù),具備格式簡(jiǎn)單、兼容性強(qiáng)、體積小巧的特點(diǎn),是數(shù)據(jù)分析、批量數(shù)據(jù)存儲(chǔ)、跨平臺(tái)數(shù)據(jù)傳輸?shù)氖走x格式。
CSV文件的讀取與寫入是Python編程核心基礎(chǔ)知識(shí)點(diǎn),幾乎所有數(shù)據(jù)處理、自動(dòng)化辦公、數(shù)據(jù)分析項(xiàng)目都會(huì)用到,是Python開發(fā)者必備技能。
1.2 為什么必須掌握CSV讀寫?
在實(shí)際開發(fā)和學(xué)習(xí)中,這項(xiàng)技能的核心價(jià)值體現(xiàn)在4點(diǎn):
- 提升開發(fā)效率:快速實(shí)現(xiàn)批量數(shù)據(jù)導(dǎo)入導(dǎo)出,無(wú)需手動(dòng)編輯文件
- 保障代碼規(guī)范:標(biāo)準(zhǔn)化文件讀寫邏輯,適配絕大多數(shù)結(jié)構(gòu)化數(shù)據(jù)場(chǎng)景
- 快速排查問(wèn)題:熟練掌握讀寫原理,可快速定位文件編碼、路徑、格式報(bào)錯(cuò)
- 職業(yè)必備技能:數(shù)據(jù)分析、自動(dòng)化、后端開發(fā)、算法崗位的基礎(chǔ)剛需能力
1.3 典型應(yīng)用場(chǎng)景
| 場(chǎng)景類型 | 具體應(yīng)用 | 核心技術(shù)要點(diǎn) |
|---|---|---|
| 數(shù)據(jù)處理 | 批量數(shù)據(jù)清洗、格式轉(zhuǎn)換、數(shù)據(jù)篩選導(dǎo)出 | 讀寫效率優(yōu)化、異常數(shù)據(jù)捕獲、編碼適配 |
| 自動(dòng)化任務(wù) | 定時(shí)導(dǎo)出日志數(shù)據(jù)、批量統(tǒng)計(jì)業(yè)務(wù)數(shù)據(jù) | 循環(huán)讀寫、文件覆蓋/追加、日志記錄 |
| Web開發(fā) | 后端批量導(dǎo)入用戶數(shù)據(jù)、導(dǎo)出業(yè)務(wù)報(bào)表 | 批量讀寫、數(shù)據(jù)校驗(yàn)、異常處理 |
| 數(shù)據(jù)分析 | 數(shù)據(jù)集加載、數(shù)據(jù)預(yù)處理、可視化數(shù)據(jù)源導(dǎo)出 | 批量讀取、空值處理、格式標(biāo)準(zhǔn)化 |
二、技術(shù)原理詳解
2.1 Python文件操作核心原理
Python文件操作依托于內(nèi)置IO流機(jī)制,無(wú)需額外安裝第三方庫(kù)即可完成基礎(chǔ)讀寫。其核心設(shè)計(jì)依托Python三大特性:簡(jiǎn)潔易讀、面向?qū)ο?、跨平臺(tái)兼容,搭配豐富的標(biāo)準(zhǔn)庫(kù)與第三方庫(kù),實(shí)現(xiàn)高效文件處理。
核心架構(gòu)邏輯:
┌─────────────────────────────────────────────────────────┐
│ Python核心特點(diǎn) │
├─────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 簡(jiǎn)潔易讀 │ │ 面向?qū)ο? │ │ 跨平臺(tái) │ │
│ │ (Readable) │ │ (OOP) │ │ (Cross) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ ↑ ↓ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 豐富的標(biāo)準(zhǔn)庫(kù)和第三方庫(kù) │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
2.2 通用代碼實(shí)現(xiàn)范式(面向?qū)ο螅?/h3>
封裝通用數(shù)據(jù)處理類,適配文件讀寫、數(shù)據(jù)加工基礎(chǔ)邏輯,可直接復(fù)用在CSV項(xiàng)目中:
class PythonDemo:
"""Python通用數(shù)據(jù)處理演示類"""
def __init__(self, name):
"""
初始化方法
:param name: 任務(wù)名稱
"""
self.name = name
self.data = []
def add_data(self, item):
"""添加單條數(shù)據(jù)"""
self.data.append(item)
return self
def process(self):
"""批量處理數(shù)據(jù)"""
return [item * 2 for item in self.data]
def show(self):
"""打印結(jié)果"""
print(f"{self.name}的數(shù)據(jù): {self.data}")
print(f"處理結(jié)果: {self.process()}")
# 調(diào)用示例
if __name__ == "__main__":
demo = PythonDemo("測(cè)試數(shù)據(jù)")
demo.add_data(1).add_data(2).add_data(3)
demo.show()
三、實(shí)戰(zhàn)應(yīng)用(可直接運(yùn)行)
3.1 開發(fā)環(huán)境準(zhǔn)備
3.1.1 Python安裝(全平臺(tái)通用)
# Windows:官網(wǎng)下載安裝包,安裝時(shí)勾選 Add Python to PATH # 官網(wǎng)地址:https://www.python.org/downloads/ # macOS(Homebrew) brew install python3 # Linux Ubuntu/Debian sudo apt update sudo apt install python3 # 驗(yàn)證安裝是否成功 python --version # mac/linux 可使用 python3 --version
3.1.2 環(huán)境檢測(cè)代碼
import sys
# 查看Python版本
print(f"當(dāng)前Python版本: {sys.version}")
# 查看已安裝依賴包
import pip
installed_packages = pip.get_installed_distributions()
print(f"已安裝第三方包總數(shù): {len(installed_packages)}")
3.2 Python基礎(chǔ)語(yǔ)法示例(入門鋪墊)
示例1:基礎(chǔ)輸出與變量
# 第一個(gè)Python程序
print("Hello, World!")
print("你好,Python!")
# 變量定義與格式化輸出
message = "歡迎學(xué)習(xí)Python文件操作"
print(message)
name = "張三"
age = 25
score = 95.5
print(f"姓名: {name},年齡: {age},分?jǐn)?shù): {score}")
示例2:列表數(shù)據(jù)處理(CSV數(shù)據(jù)基礎(chǔ))
# 列表模擬CSV行數(shù)據(jù)
numbers = [1, 2, 3, 4, 5]
# 追加數(shù)據(jù)
numbers.append(6)
print(f"追加后數(shù)據(jù): {numbers}")
# 列表推導(dǎo)式批量處理(高效替代for循環(huán))
squares = [x**2 for x in numbers]
print(f"數(shù)據(jù)平方結(jié)果: {squares}")
# 條件過(guò)濾數(shù)據(jù)
even_numbers = [x for x in numbers if x % 2 == 0]
print(f"篩選偶數(shù): {even_numbers}")
3.3 進(jìn)階面向?qū)ο笫纠?/h3>
class Student:
"""學(xué)生信息類(模擬CSV結(jié)構(gòu)化數(shù)據(jù))"""
# 類全局屬性
school = "Python編程學(xué)院"
def __init__(self, name, age):
"""初始化學(xué)生姓名、年齡,創(chuàng)建成績(jī)列表"""
self.name = name
self.age = age
self.grades = []
def add_grade(self, grade):
"""添加單科成績(jī)"""
self.grades.append(grade)
def get_average(self):
"""計(jì)算平均分,兼容空數(shù)據(jù)場(chǎng)景"""
if not self.grades:
return 0
return sum(self.grades) / len(self.grades)
def __str__(self):
"""重寫打印方法,格式化輸出學(xué)生信息"""
return f"學(xué)生: {self.name}, 年齡: {self.age}, 平均分: {self.get_average():.2f}"
# 實(shí)戰(zhàn)調(diào)用
if __name__ == "__main__":
student = Student("李四", 20)
student.add_grade(85)
student.add_grade(90)
student.add_grade(88)
print(student)
class Student:
"""學(xué)生信息類(模擬CSV結(jié)構(gòu)化數(shù)據(jù))"""
# 類全局屬性
school = "Python編程學(xué)院"
def __init__(self, name, age):
"""初始化學(xué)生姓名、年齡,創(chuàng)建成績(jī)列表"""
self.name = name
self.age = age
self.grades = []
def add_grade(self, grade):
"""添加單科成績(jī)"""
self.grades.append(grade)
def get_average(self):
"""計(jì)算平均分,兼容空數(shù)據(jù)場(chǎng)景"""
if not self.grades:
return 0
return sum(self.grades) / len(self.grades)
def __str__(self):
"""重寫打印方法,格式化輸出學(xué)生信息"""
return f"學(xué)生: {self.name}, 年齡: {self.age}, 平均分: {self.get_average():.2f}"
# 實(shí)戰(zhàn)調(diào)用
if __name__ == "__main__":
student = Student("李四", 20)
student.add_grade(85)
student.add_grade(90)
student.add_grade(88)
print(student)
四、常見報(bào)錯(cuò)與完美解決方案
4.1 環(huán)境配置類問(wèn)題
問(wèn)題一:python不是內(nèi)部或外部命令
報(bào)錯(cuò)現(xiàn)象:終端輸入python提示:‘python’ 不是內(nèi)部或外部命令
解決方案:
- 重新安裝Python,安裝界面勾選 Add Python to PATH
- 手動(dòng)配置環(huán)境變量:此電腦→屬性→高級(jí)系統(tǒng)設(shè)置→環(huán)境變量→系統(tǒng)變量Path→添加Python安裝根目錄和Scripts目錄
問(wèn)題二:pip安裝包失敗
報(bào)錯(cuò)現(xiàn)象:ERROR: Could not find a version that satisfies the requirement
原因:官方源網(wǎng)絡(luò)卡頓、訪問(wèn)超時(shí)
解決方案(清華鏡像源):
# 臨時(shí)使用國(guó)內(nèi)鏡像安裝 pip install 包名 -i https://pypi.tuna.tsinghua.edu.cn/simple # 永久配置清華鏡像(推薦) pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
4.2 代碼運(yùn)行類問(wèn)題
問(wèn)題三:文件編碼錯(cuò)誤
報(bào)錯(cuò)現(xiàn)象:UnicodeDecodeError: ‘gbk’ codec can’t decode byte
原因:Windows默認(rèn)GBK編碼,文件實(shí)際為UTF-8編碼,編碼不匹配
解決方案:手動(dòng)指定UTF-8編碼讀取文件
# 標(biāo)準(zhǔn)寫法(推薦)
with open("file.csv", "r", encoding="utf-8") as f:
content = f.read()
# 容錯(cuò)寫法(忽略異常編碼字符)
with open("file.csv", "r", encoding="utf-8", errors="ignore") as f:
content = f.read()
問(wèn)題四:模塊導(dǎo)入失敗
報(bào)錯(cuò)現(xiàn)象:ModuleNotFoundError: No module named ‘xxx’
解決方案:
import sys # 查看模塊搜索路徑,確認(rèn)環(huán)境是否匹配 print(sys.path) # 終端安裝缺失模塊 # pip install 模塊名
五、Python編程最佳實(shí)踐
5.1 代碼規(guī)范準(zhǔn)則
# 1. 語(yǔ)義化變量名(拒絕無(wú)意義縮寫)
student_name = "張三" # 規(guī)范
a = "張三" # 不規(guī)范
# 2. 函數(shù)添加文檔字符串,方便后續(xù)維護(hù)
def calculate_average(numbers):
"""
計(jì)算數(shù)字列表平均值
:param numbers: 數(shù)字列表
:return: 平均值
"""
return sum(numbers) / len(numbers)
# 3. Python3.5+ 推薦類型注解
def greet(name: str) -> str:
return f"你好, {name}!"
# 4. 必加異常捕獲,避免程序崩潰
try:
result = 10 / 0
except ZeroDivisionError as e:
print(f"運(yùn)行錯(cuò)誤: {e}")
5.2 性能優(yōu)化技巧
| 優(yōu)化技巧 | 實(shí)現(xiàn)說(shuō)明 | 優(yōu)化效果 |
|---|---|---|
| 列表推導(dǎo)式 | 替代傳統(tǒng)for循環(huán)創(chuàng)建、篩選列表 | 速度提升2倍 |
| 使用內(nèi)置函數(shù) | 優(yōu)先使用sum/max/min等內(nèi)置方法 | 速度提升3倍 |
| 規(guī)避全局變量 | 優(yōu)先使用局部變量,減少尋址耗時(shí) | 性能提升10% |
| 生成器迭代數(shù)據(jù) | 處理超大CSV文件,不一次性加載全部數(shù)據(jù) | 內(nèi)存占用減少90% |
5.3 開發(fā)安全規(guī)范
- 禁止在代碼中硬編碼密碼、密鑰、文件路徑等敏感信息
- 使用環(huán)境變量存儲(chǔ)私密配置信息
- 對(duì)外部讀取的CSV數(shù)據(jù)做合法性校驗(yàn)
- 數(shù)據(jù)庫(kù)讀寫使用參數(shù)化查詢,防止注入攻擊
- 定期更新項(xiàng)目依賴包,修復(fù)安全漏洞
六、本章總結(jié)與學(xué)習(xí)規(guī)劃
6.1 核心知識(shí)點(diǎn)回顧
- 掌握CSV文件讀寫的核心應(yīng)用場(chǎng)景與開發(fā)價(jià)值
- 熟練使用Python基礎(chǔ)語(yǔ)法、面向?qū)ο髮?shí)現(xiàn)數(shù)據(jù)處理
- 搞定環(huán)境配置、編碼報(bào)錯(cuò)、模塊導(dǎo)入等常見問(wèn)題
- 掌握代碼規(guī)范、性能優(yōu)化、安全開發(fā)最佳實(shí)踐
6.2 分階段學(xué)習(xí)實(shí)踐建議
| 學(xué)習(xí)階段 | 實(shí)踐內(nèi)容 | 建議時(shí)長(zhǎng) |
|---|---|---|
| 入門 | 復(fù)刻本文所有基礎(chǔ)代碼,熟練運(yùn)行無(wú)報(bào)錯(cuò) | 1-2天 |
| 進(jìn)階 | 自主編寫CSV讀寫小工具,實(shí)現(xiàn)數(shù)據(jù)導(dǎo)入導(dǎo)出 | 3-5天 |
| 高級(jí) | 優(yōu)化代碼性能,處理超大文件、異常數(shù)據(jù)場(chǎng)景 | 1-2周 |
以上就是Python CSV文件讀取與寫入操作的基礎(chǔ)指南的詳細(xì)內(nèi)容,更多關(guān)于Python CSV文件操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python數(shù)據(jù)清洗之缺失值處理,重復(fù)項(xiàng)去重與異常值檢測(cè)詳解
本文主要為大家詳細(xì)介紹了Python數(shù)據(jù)清洗中的核心技能,包括缺失值處理、重復(fù)數(shù)據(jù)去重和異常值檢測(cè),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2026-05-05
在django中查詢獲取數(shù)據(jù),get, filter,all(),values()操作
這篇文章主要介紹了在django中查詢獲取數(shù)據(jù),get, filter,all(),values()操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
Python內(nèi)置函數(shù)delattr的具體用法
本篇文章主要介紹了Python內(nèi)置函數(shù)delattr的具體用法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
Python Pandas數(shù)據(jù)分析工具用法實(shí)例
這篇文章主要介紹了Python Pandas數(shù)據(jù)分析工具用法實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
python中playwright實(shí)現(xiàn)定位和點(diǎn)擊的多種方法
Playwright 提供了多種元素定位和點(diǎn)擊方法,如按角色、文本、標(biāo)簽文本、占位符文本、測(cè)試ID、CSS選擇器和XPath,下面就來(lái)介紹一下使用方法,感興趣的可以了解一下2026-01-01
Python使用Shelve保存對(duì)象方法總結(jié)
在本篇文章里我們給大家分享的是關(guān)于Python使用Shelve保存對(duì)象的知識(shí)點(diǎn)總結(jié),有興趣的朋友們學(xué)習(xí)下。2019-01-01
Python中的字符串類型基本知識(shí)學(xué)習(xí)教程
這篇文章主要介紹了Python中的字符串類型基本知識(shí)學(xué)習(xí)教程,包括轉(zhuǎn)義符和字符串拼接以及原始字符串等基礎(chǔ)知識(shí)講解,需要的朋友可以參考下2016-02-02

