CSV文件操作

CSV文件操作

2026年9月19日·#编程学习/python学习笔记Python/爬虫·1042 字 5 分钟
浏览量加载中...
AI 摘要- DeepSeek

CSV 是逗号分隔值的表格文件格式:手写方式与 csv.DictWriter/DictReader 两种读写方法

封面图
CSV文件操作 - 封面图

CSV 是什么#

CSV:(Comma-Separated Values,逗号分隔值),是一种简单、通用的文本文件格式,用于存储表格数据,可以直接使用 Excel 打开。

爬虫抓到的数据通常就存成 CSV。

方式一:文件操作的原始方式#

把每一行当成普通字符串写,列之间用逗号分隔:

with open("csv_data/01.csv", "w", encoding="utf-8") as f:
f.write("姓名,年龄,性别,爱好\n") # 先写表头
f.write("小王,18,男,'football,Java'\n") # 再一行一行写数据
f.write("小李,18,女,Python\n")
# 读:按行读出来即可
with open("csv_data/01.csv", "r", encoding="utf-8") as f:
for line in f:
print(line.strip())
Warning

原始方式的坑:如果某个值自己带逗号(如爱好 football,Java),会把一行的列数弄乱,只能靠加引号手动规避——所以推荐方式二。

方式二:csv 模块(推荐)#

import csv
# 写
with open("csv_data/02.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.DictWriter(f, fieldnames=["姓名", "年龄", "性别", "爱好"])
writer.writeheader() # 写入表头
writer.writerow({"姓名": "小王", "年龄": 18, "性别": "男", "爱好": "football,Java"})
writer.writerow({"姓名": "小李", "年龄": 18, "性别": "女", "爱好": "Python"})
# 读
with open("csv_data/02.csv", "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
print(row) # 每行是一个字典,如 {'姓名': '小王', '年龄': '18', ...}
要点说明
newline=""写 CSV 必须加:避免 Windows 下每行之间多出空行
csv.DictWriter(f, fieldnames=...)按字典写入,fieldnames 指定列名和顺序
writer.writeheader()写入表头(就是 fieldnames 那一行)
writer.writerow(字典)写一行;writer.writerows(列表) 一次写多行
csv.DictReader(f)按字典读,第一行自动当表头,每行是 {列名: 值}

相关#

练习题#

一、知识回顾(读完直接做下面的实践题)#

  1. CSV 全称 Comma-Separated Values(逗号分隔值),是一种用于存储表格数据的文本文件格式,可以直接用 Excel 打开
  2. 原始方式的坑:值里自带逗号会把一行的列数弄乱
  3. 推荐用 csv 模块按字典读写
  4. 写文件时必须加 newline="",否则 Windows 下行与行之间会多出空行
  5. writer.writeheader() 写表头;writer.writerow(字典) 写一行;writer.writerows(列表) 一次写多行
  6. 按字典读 CSV 用 DictReader,第一行自动当表头

二、裸写题#

  • 2-1 原始方式写 CSV 不用 csv 模块:用文件操作把表头 + 3 行学生数据写进 students_raw.csv。

    提示(先自己想,实在想不出再点开)

    一级 · 思路:一行一个字符串,列之间用逗号,行尾加换行 二级 · 方法:open(..., "w") + f.write(...) 三级 · 骨架:f.write("姓名,年龄,性别\____")

    参考答案(做完再点开)
    # 2-1 原始方式
    with open("students_raw.csv", "w", encoding="utf-8") as f:
    f.write("姓名,年龄,性别,爱好\n")
    f.write("小王,18,男,'football,Java'\n")
    f.write("小李,18,女,Python\n")
    f.write("小张,18,男,C++\n")
  • 2-2 DictWriter 写 + DictReader 读 用 csv 模块把 3 个学生(含一个爱好带逗号的)写入 students.csv,再读回来打印每一行。

    提示(先自己想,实在想不出再点开)

    一级 · 思路:写用 DictWriter(先 writeheader),读用 DictReader 二级 · 方法:csv.DictWriter / writerow / csv.DictReader 三级 · 骨架:with open(..., "w", encoding="utf-8", newline="") as f:

    参考答案(做完再点开)
    import csv
    students = [
    {"姓名": "小王", "年龄": 18, "性别": "男", "爱好": "football,Java"},
    {"姓名": "小李", "年龄": 18, "性别": "女", "爱好": "Python"},
    {"姓名": "小张", "年龄": 18, "性别": "男", "爱好": "C++"},
    ]
    # 2-2 / 2-3 csv 模块(writerows 一次写多行)
    with open("students.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.DictWriter(f, fieldnames=["姓名", "年龄", "性别", "爱好"])
    writer.writeheader()
    writer.writerows(students)
    with open("students.csv", "r", encoding="utf-8") as f:
    for row in csv.DictReader(f):
    print(row)
  • 2-3 批量写入 把一个包含 3 个学生字典的列表,用 一次调用 全部写入 CSV。

    提示(先自己想,实在想不出再点开)

    一级 · 思路:DictWriter 有一个方法就是”写多行” 二级 · 方法:writer.writerows(列表)(一次写多行) 三级 · 骨架:writer.____(students)

    参考答案(做完再点开)
    import csv
    students = [
    {"姓名": "小王", "年龄": 18, "性别": "男", "爱好": "football,Java"},
    {"姓名": "小李", "年龄": 18, "性别": "女", "爱好": "Python"},
    {"姓名": "小张", "年龄": 18, "性别": "男", "爱好": "C++"},
    ]
    # 2-2 / 2-3 csv 模块(writerows 一次写多行)
    with open("students.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.DictWriter(f, fieldnames=["姓名", "年龄", "性别", "爱好"])
    writer.writeheader()
    writer.writerows(students)
    with open("students.csv", "r", encoding="utf-8") as f:
    for row in csv.DictReader(f):
    print(row)

评论区

[ 标签 ]
# AI37# AI 编程2# AI工具1# AI绘图1# AI辅助开发2# Ajax7# Apifox1# AstrBot3# Astro2# CC Switch1# CDN2# Claude Code1# claudecode2# ClaudeCode1# Cloudflare2# CloudFlare2# CloudFlare-ImgBed3# coc4# CSS10# DeepSeek6# deepseek2# DELETE1# Docker5# EdgeOne3# Gist1# git1# GitHub1# hexo-circle-of-friends1# HTML9# HTTP10# ImageManager1# Java23# java13# JavaScript11# JavaWeb113# JDBC7# JSON2# JUnit1# LangChain25# Linux4# Logback1# Maven17# Muse Spark1# Mybatis1# MyBatis18# MySQL45# MySql1# NapCat1# Node.js1# obsidian2# Obsidian5# OpenCode4# ORM1# PathVariable1# PicGo1# PyCharm1# Python70# RequestBody1# RequestMapping1# RESTful风格1# skills1# Slf4j1# SpringBoot37# SpringMVC5# SQL2# Streamlit5# Svelte2# TailwindCSS1# Telegram3# Tlias2# Vercel1# vscode2# Vue20# Waline3# Web3# WebDAV1# Web基础6# Web开发6# WinSCP1# YAML1# 三层架构1# 中二宣言1# 书籍1# 使用文档10# 写作1# 函数2# 刷步数1# 前端52# 动态1# 动漫1# 包1# 单词2# 博客8# 博客工作流1# 博客开发2# 参数接收1# 友链1# 反思2# 后端48# 图床6# 地图1# 备份2# 大模型1# 奇思妙想1# 存储1# 学习方法6# 学校1# 宝塔面板3# 宝宝10# 实战4# 对象1# 导航栏1# 工具2# 布局2# 开发1# 开发工具1# 开发规范1# 开心1# 异常处理1# 影视2# 微信1# 性能优化2# 总结1# 想法15# 感受1# 感悟11# 指南1# 提示词工程2# 插件5# 故障排除1# 效率工具2# 教程10# 数据分析9# 数据库27# 数据结构1# 文件操作2# 斩神1# 日常95# 日志框架1# 朋友圈1# 朱元璋1# 模块1# 模板1# 正则表达式2# 测试3# 游戏2# 爬虫7# 生活迁移1# 电影2# 电脑1# 碎碎念1# 视觉识别1# 类1# 类型注解1# 网络基础2# 网络教室1# 羊毛2# 脚本2# 脚本工具1# 自动化2# 蓝奏云1# 表单1# 订阅推荐2# 记录2# 评论系统1# 词根1# 词缀1# 说说1# 足迹1# 跑步2# 路径参数1# 转载2# 运动1# 部署11# 部落冲突1# 配置1# 随机图1# 面向对象5# 音乐3# 音标1# 项目实战11# 饮食1# 驼峰命名1# 高德地图1
[ 公告 ]

如果你喜欢,那么欢迎来到我的世界!

了解更多
[ 音乐 ]
封面

音乐

暂未播放

0:000:00
暂无歌词
找不到相关结果。
[ contents ]
[ 全部文章 ]