1. JSON与CSV格式核心解析
1.1 JSON数据结构本质
JSON(JavaScript Object Notation)本质上是一种轻量级的数据交换格式,采用完全独立于语言的文本格式。我在处理API接口数据时发现,其核心优势在于层次化的键值对结构。典型JSON对象由大括号包裹,键名必须用双引号标注,例如:
json复制{
"employee": {
"name": "张三",
"salary": 8500.00,
"projects": ["库存系统", "CRM升级"]
}
}
这种结构特别适合处理嵌套数据,比如我从电商平台抓取的订单数据通常包含3-4层嵌套。要注意的是,JSON标准仅支持以下数据类型:
- 字符串(必须双引号)
- 数字(整数或浮点数)
- 布尔值(true/false)
- 数组(方括号包裹)
- 对象(大括号包裹)
- null
1.2 CSV表格化特征
CSV(Comma-Separated Values)是表格数据的纯文本表示形式。在金融数据分析项目中,我发现其最大特点是:
- 每行对应一条记录
- 字段间用逗号分隔(实际可能用制表符或分号)
- 首行常作列标题
示例数据:
csv复制ID,Product,Price,Stock
1001,键盘,299.00,45
1002,鼠标,159.00,120
处理CSV时最常遇到的坑是编码问题。上周处理供应商数据时就遇到中文乱码,解决方案是明确指定encoding参数:
python复制with open('data.csv', encoding='gb18030') as f:
reader = csv.reader(f)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Python处理实战指南
2.1 JSON模块深度使用
Python内置的json模块提供四个核心方法:
json.load()- 从文件对象读取json.loads()- 从字符串读取json.dump()- 写入文件对象json.dumps()- 输出为字符串
处理API响应时的最佳实践:
python复制import json
# 反序列化时处理日期等特殊格式
def date_parser(dct):
if 'create_time' in dct:
dct['create_time'] = datetime.fromisoformat(dct['create_time'])
return dct
response = '''{"order_id": 10086, "create_time": "2023-08-15T14:32:00"}'''
data = json.loads(response, object_hook=date_parser)
2.2 CSV读写技巧
csv模块的DictReader和DictWriter是处理带标题行的最佳选择。上周处理销售报表时我这样优化内存:
python复制import csv
def process_large_file(input_path):
with open(input_path, newline='') as f:
for row in csv.DictReader(f):
# 逐行处理避免内存溢出
if float(row['amount']) > 10000:
yield row
关键提示:处理GB级CSV时务必使用生成器,避免readlines()导致内存崩溃
3. 格式转换实战
3.1 CSV转JSON完整流程
这是电商数据迁移时的标准操作:
python复制import csv
import json
def csv_to_json(csv_path, json_path):
records = []
with open(csv_path) as f:
reader = csv.DictReader(f)
for row in reader:
records.append(row)
with open(json_path, 'w') as f:
json.dump(records, f, indent=2)
return len(records)
# 使用示例
count = csv_to_json('products.csv', 'products.json')
print(f"成功转换{count}条记录")
3.2 JSON转CSV注意事项
处理嵌套JSON时需要展平结构:
python复制def flatten_json(data):
result = {}
for key, value in data.items():
if isinstance(value, dict):
for k, v in flatten_json(value).items():
result[f"{key}.{k}"] = v
else:
result[key] = value
return result
4. 性能优化方案
4.1 大文件处理策略
当处理500MB+的JSON文件时:
- 使用ijson库进行流式解析
- 分块写入CSV
python复制import ijson
import csv
def large_json_to_csv(json_path, csv_path):
with open(json_path, 'rb') as f_json, \
open(csv_path, 'w') as f_csv:
writer = csv.writer(f_csv)
writer.writerow(['id', 'name']) # 写入列头
items = ijson.items(f_json, 'item')
for i, item in enumerate(items, 1):
writer.writerow([item['id'], item['name']])
if i % 10000 == 0:
print(f"已处理{i}条")
4.2 内存映射技术
对于超大型CSV文件(10GB+):
python复制import pandas as pd
def analyze_huge_csv(path):
# 使用内存映射模式
df = pd.read_csv(path, memory_map=True)
# 执行聚合操作
return df.groupby('category')['sales'].sum()
5. 常见问题排雷
5.1 编码问题解决方案
中文字符乱码的三种处理方式:
- 明确指定文件编码
python复制open('data.csv', encoding='utf-8-sig') - 使用chardet检测编码
python复制import chardet with open('data.csv', 'rb') as f: encoding = chardet.detect(f.read(1024))['encoding'] - 统一转换为UTF-8
python复制df = pd.read_csv('data.csv', encoding='gbk') df.to_csv('data_utf8.csv', encoding='utf-8')
5.2 特殊字符处理
处理包含换行符的CSV字段:
python复制import csv
with open('data.csv', newline='') as f:
reader = csv.reader(f, escapechar='\\')
for row in reader:
print(row)
6. 高级应用场景
6.1 动态JSON解析
处理不规则JSON结构时:
python复制def extract_values(obj, key):
"""递归提取特定键的值"""
arr = []
if isinstance(obj, dict):
for k, v in obj.items():
if k == key:
arr.append(v)
elif isinstance(v, (dict, list)):
arr.extend(extract_values(v, key))
elif isinstance(obj, list):
for item in obj:
arr.extend(extract_values(item, key))
return arr
# 示例:提取所有email字段
emails = extract_values(data, 'email')
6.2 CSV数据清洗管道
构建自动化清洗流程:
python复制import csv
from datetime import datetime
def clean_row(row):
# 空值处理
row['price'] = float(row['price'] or 0)
# 日期标准化
row['date'] = datetime.strptime(row['date'], '%m/%d/%Y').date()
# 字符串清理
row['name'] = row['name'].strip().title()
return row
def process_csv(input_path, output_path):
with open(input_path) as fin, open(output_path, 'w') as fout:
reader = csv.DictReader(fin)
writer = csv.DictWriter(fout, fieldnames=reader.fieldnames)
writer.writeheader()
for row in reader:
writer.writerow(clean_row(row))
7. 工具链推荐
7.1 可视化校验工具
- JSONLint(在线验证JSON格式)
- CSVkit(命令行CSV处理套件)
- VisiData(终端数据浏览工具)
7.2 Python高效库
- orjson:比标准json快5倍的替代库
- pandas:适合表格数据分析
- dask:处理超大型数据集
- pyarrow:列式存储处理
python复制# orjson示例
import orjson
data = orjson.loads(b'{"name": "张三", "age": 30}')
# 注意:orjson返回bytes而非str
print(data.decode('utf-8'))
8. 实际案例剖析
8.1 电商订单处理系统
典型数据处理流程:
- 从API获取JSON格式订单
- 转换为CSV供财务系统使用
- 生成JSON统计报表
python复制def process_orders(api_url, output_dir):
# 获取数据
response = requests.get(api_url)
orders = response.json()['data']
# CSV输出
csv_path = f"{output_dir}/orders.csv"
with open(csv_path, 'w') as f:
writer = csv.DictWriter(f, fieldnames=['id','total','items'])
writer.writeheader()
writer.writerows(orders)
# JSON统计
stats = {
'total_orders': len(orders),
'total_amount': sum(o['total'] for o in orders)
}
with open(f"{output_dir}/stats.json", 'w') as f:
json.dump(stats, f)
8.2 物联网传感器数据
处理高频传感器数据的技巧:
python复制import csv
from collections import deque
class SensorDataBuffer:
def __init__(self, maxlen=1000):
self.buffer = deque(maxlen=maxlen)
def add_reading(self, timestamp, value):
self.buffer.append({
'timestamp': timestamp,
'value': value
})
def flush_to_csv(self, path):
with open(path, 'a', newline='') as f:
writer = csv.DictWriter(f, fieldnames=['timestamp', 'value'])
if f.tell() == 0: # 新文件才写header
writer.writeheader()
writer.writerows(self.buffer)
self.buffer.clear()
