Python 数据处理封神篇:CSV+JSON 全解析,从入门到天气 API 实战
·
前言
做数据分析、爬虫、办公自动化,绕不开两大数据格式:CSV(表格数据) 和 JSON(接口数据)。CSV 是 Excel 的 “亲兄弟”,用来存表格、报表、名单;JSON 是互联网的 “通用语言”,API 接口、配置文件全靠它。
这篇不讲废话、不搞应试,全是能直接用的实战代码 + 逐行讲解,从基础读写到项目实战,看完就能自己写数据处理工具,效率直接拉满!
一、先搞懂:CSV 和 JSON 到底是什么?
最简单的 CSV 样例
新建一个文本文档,把下面内容粘贴进去,保存为 data.csv 就能用:
姓名,年龄,性别,城市,成绩
张三,18,男,北京,92
李四,19,女,上海,88
王五,18,男,广州,95
赵六,19,女,深圳,90
这就是标准 CSV:
- 第一行是表头
- 每一行是一条数据
- 用逗号, 分隔
带空值、带英文的 CSV 样例
id,name,age,city,score
1,Alice,20,Beijing,85
2,Bob,,Shanghai,91
3,Charlie,21,Guangzhou,
4,Diana,19,Shenzhen,89
- 空的地方直接留空
- 支持英文、数字、中文混合
简单 JSON 样例(单个人信息)
{
"name": "张三",
"age": 18,
"city": "北京",
"score": 92,
"is_student": true,
"hobbies": ["篮球", "编程", "读书"]
}
真实接口风格 JSON(多人列表)
{
"code": 200,
"message": "success",
"data": [
{
"id": 1,
"name": "张三",
"age": 18,
"city": "北京",
"score": 92
},
{
"id": 2,
"name": "李四",
"age": 19,
"city": "上海",
"score": 88
},
{
"id": 3,
"name": "王五",
"age": 18,
"city": "广州",
"score": 95
}
]
}
| 格式 | 核心特点 | 适用场景 |
|---|---|---|
| CSV | 纯文本、逗号分隔、表格结构 | Excel 表格、数据报表、名单、批量数据 |
| JSON | 键值对、层级结构、轻量 | API 接口、配置文件、爬虫数据、结构化数据 |
一句话总结:CSV 管表格,JSON 管接口,Python 自带标准库就能处理,不用额外装复杂工具!
二、CSV 模块:表格数据全自动处理(逐行精讲)
Python 自带csv模块,专门处理 CSV 文件,不用装第三方库,开箱即用!
1. 基础读写:reader/writer 对象
1.1 用 reader 读取 CSV
import csv
# 打开CSV文件,newline=''避免空行
with open('data.csv', 'r', newline='', encoding='utf-8') as f:
# 创建reader对象,按行读取
reader = csv.reader(f)
# 遍历每一行,reader是可迭代对象
for row in reader:
# row是列表,每个元素对应一列
print(row)
输出结果:
['姓名', '年龄', '性别', '城市', '成绩']
['张三', '18', '男', '北京', '92']
['李四', '19', '女', '上海', '88']
['王五', '18', '男', '广州', '95']
['赵六', '19', '女', '深圳', '90']
代码讲解
csv.reader(f):把文件对象转成 reader,按行读取,每行是一个列表newline='':Windows 系统必加,否则会出现多余空行encoding='utf-8':解决中文乱码问题
1.2 用 writer 写入 CSV
import csv
# 要写入的数据(列表嵌套列表,对应表格行)
data = [
['姓名', '年龄', '成绩'],
['张三', '18', '95'],
['李四', '18', '92'],
['王五', '18', '98']
]
with open('output.csv', 'w', newline='', encoding='utf-8') as f:
# 创建writer对象
writer = csv.writer(f)
# 写入多行(一次性写入)
writer.writerows(data)
# 也可以逐行写入:writer.writerow(['赵六', '18', '90'])
代码讲解
csv.writer(f):创建写入器,负责把数据写入文件writerows():一次性写入多行,writerow()逐行写入- 数据格式必须是列表嵌套列表,外层列表对应行,内层列表对应列
1.3 自定义分隔符和换行符
CSV 默认用逗号分隔,我们可以自定义分隔符(比如制表符\t、分号;):
import csv
# 用分号分隔,换行符用\r\n(兼容Windows)
with open('custom.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f, delimiter=';', lineterminator='\r\n')
writer.writerow(['a', 'b', 'c'])
writer.writerow(['1', '2', '3'])
核心参数
delimiter:列分隔符,默认,lineterminator:行结束符,默认\r\n- 适合处理非标准 CSV 文件,比如用分号分隔的欧洲格式 CSV
1.4 高阶读写:DictReader/DictWriter(最常用!)
用字典读写 CSV,直接对应表头,不用记列索引,可读性拉满!
用 DictReader 读取(按表头取数据)
import csv
with open('data.csv', 'r', newline='', encoding='utf-8') as f:
# 第一行自动作为表头,每行是字典,键是表头,值是对应数据
reader = csv.DictReader(f)
# 遍历每一行
for row in reader:
# 直接用表头取数据,不用记索引!
print(f"姓名:{row['姓名']},年龄:{row['年龄']},成绩:{row['成绩']}")
输出:
张三 18 92
李四 19 88
王五 18 95
赵六 19 90
用 DictWriter 写入(按表头写数据)
import csv
# 表头(必须和字典键一致)
headers = ['姓名', '年龄', '成绩']
# 数据(列表嵌套字典)
data = [
{'姓名': '张三', '年龄': '18', '成绩': '95'},
{'姓名': '李四', '年龄': '18', '成绩': '92'},
{'姓名': '王五', '年龄': '18', '成绩': '98'}
]
with open('dict_output.csv', 'w', newline='', encoding='utf-8') as f:
# 创建DictWriter,指定表头
writer = csv.DictWriter(f, fieldnames=headers)
# 先写入表头(必须!)
writer.writeheader()
# 写入多行数据
writer.writerows(data)
代码讲解
DictReader:自动把第一行作为表头,每行是字典,直接用表头取值,再也不用记row[0]、row[1]DictWriter:必须指定fieldnames(表头),先写表头再写数据,格式工整- 适合处理有表头的 CSV,是办公自动化、数据分析的首选!
三、实战项目 1:批量删除 CSV 标题行
需求:批量处理多个 CSV,删除第一行标题行,生成新文件!
完整代码 + 逐行讲解
import csv
import os
# 1. 循环遍历文件夹中所有CSV文件
csv_folder = 'csv_files' # 存放CSV的文件夹
output_folder = 'no_header_csv' # 输出文件夹
os.makedirs(output_folder, exist_ok=True) # 不存在则创建
for filename in os.listdir(csv_folder):
if filename.endswith('.csv'):
input_path = os.path.join(csv_folder, filename)
output_path = os.path.join(output_folder, filename)
# 2. 读入CSV文件
with open(input_path, 'r', newline='', encoding='utf-8') as f_in:
reader = csv.reader(f_in)
# 跳过第一行(标题行),从第二行开始读
rows = list(reader)[1:] # 转成列表,切片去掉第一行
# 3. 写入CSV文件,无标题行
with open(output_path, 'w', newline='', encoding='utf-8') as f_out:
writer = csv.writer(f_out)
writer.writerows(rows)
print(f"已处理:{filename}")
print("所有CSV标题行删除完成!")
步骤拆解(对应目录)
- 遍历 CSV 文件:用
os.listdir扫描文件夹,筛选.csv文件 - 读入 CSV:用
csv.reader读取,转成列表后切片[1:],去掉第一行标题 - 写入新 CSV:用
csv.writer写入处理后的数据,无标题行 - 扩展思路:
- 可以加筛选条件,只删除特定表头的 CSV
- 可以批量修改列名、删除指定列
- 可以合并多个 CSV 到一个文件
四、JSON 模块:接口数据一键处理(逐行精讲)
JSON 是互联网的通用数据格式,API 接口、爬虫数据全靠它,Python 自带json模块,完美适配!
1. JSON 核心:loads ()/dumps () 读写
1.1 用 loads () 读取 JSON(字符串→Python 对象)
import json
# JSON格式的字符串(API返回的原始数据就是这种)
json_str = '{"name": "张三", "age": 18, "score": 95, "hobbies": ["篮球", "编程"]}'
# 把JSON字符串转成Python字典
data = json.loads(json_str)
print(data)
print(type(data)) # <class 'dict'>
# 直接取值,和操作字典一样
print(f"姓名:{data['name']},爱好:{data['hobbies'][0]}")
1.2 用 dumps () 写入 JSON(Python 对象→JSON 字符串)
import json
# Python字典(要转成JSON的数据)
data = {
"name": "张三",
"age": 18,
"score": 95,
"hobbies": ["篮球", "编程"]
}
# 把Python字典转成JSON字符串,indent=4自动格式化,ensure_ascii=False解决中文乱码
json_str = json.dumps(data, indent=4, ensure_ascii=False)
print(json_str)
# 写入JSON文件
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, indent=4, ensure_ascii=False)
核心参数 & 区别
| 函数 | 作用 | 适用场景 |
|---|---|---|
json.loads() |
字符串→Python 对象 | 处理 API 返回的 JSON 字符串 |
json.dumps() |
Python 对象→字符串 | 生成 JSON 字符串、格式化输出 |
json.load() |
文件→Python 对象 | 读取 JSON 文件 |
json.dump() |
Python 对象→文件 | 写入 JSON 文件 |
indent=4:自动缩进,格式化 JSON,可读性拉满ensure_ascii=False:解决中文乱码,必须加!
五、实战项目 2:获取当前天气数据(API+JSON 实战)
这是最经典的 JSON 实战项目:调用天气 API,获取当前城市天气,用 Python 自动输出!
完整代码 + 逐行讲解
import json
import requests
import sys
# 1. 从命令行参数获取位置(比如:python weather.py 北京)
if len(sys.argv) < 2:
print("用法:python weather.py 城市名")
sys.exit()
city = sys.argv[1]
# 2. 调用天气API(这里用免费的和风天气API,需要自己申请Key)
# 申请地址:https://dev.qweather.com/
api_key = "你的API密钥" # 替换成自己的Key
url = f"https://devapi.qweather.com/v7/weather/now?location={city}&key={api_key}"
# 发送请求,获取JSON数据
response = requests.get(url)
# 把响应的JSON字符串转成Python字典
weather_data = json.loads(response.text)
# 3. 加载JSON数据,提取并输出天气
if weather_data['code'] == '200':
now = weather_data['now']
print(f"城市:{city}")
print(f"当前温度:{now['temp']}℃")
print(f"天气状况:{now['text']}")
print(f"风向:{now['windDir']},风速:{now['windSpeed']}km/h")
print(f"湿度:{now['humidity']}%")
else:
print(f"获取天气失败:{weather_data['message']}")
# 4. 扩展思路
# - 可以加定时任务,每天定时获取天气
# - 可以把天气写入CSV/Excel,生成天气报表
# - 可以加预警功能,恶劣天气自动提醒
步骤拆解(对应目录)
- 获取位置:用
sys.argv从命令行获取城市名,灵活输入 - 下载 JSON 数据:用
requests调用 API,获取 JSON 格式的天气数据 - 解析 JSON:用
json.loads()转成字典,提取需要的天气信息 - 输出结果:格式化输出天气,直观清晰
六、全文总结(看完就能用)
CSV 核心知识点
- 基础读写:
reader/writer,适合无表头 CSV - 高阶读写:
DictReader/DictWriter,适合有表头 CSV,最常用 - 实战:批量删除标题行、合并 CSV、修改 CSV 数据
JSON 核心知识点
- 读写:
loads()/dumps(),字符串和 Python 对象互转 - 文件读写:
load()/dump(),直接读写 JSON 文件 - 实战:API 数据解析、配置文件处理、爬虫数据存储
一句话总结
CSV 管表格,JSON 管接口,Python 自带库就能搞定 90% 的数据处理需求,复制代码改参数就能用,效率直接起飞!
七、实践项目拓展(可直接写进 CSDN)
- CSV 批量处理工具:批量合并 CSV、删除指定列、修改数据、生成报表
- JSON 配置管理器:自动读取配置文件、修改配置、生成配置模板
- 天气提醒小工具:定时获取天气,恶劣天气自动发邮件 / 微信提醒
- API 数据可视化:用 JSON 获取股票 / 天气数据,用 Matplotlib 生成图表
更多推荐
所有评论(0)