python基础入门:6.2JSON与CSV数据处理
Python数据处理实战:JSON与CSV高效转换指南
# 天气数据转换示例
import json
import csv
from datetime import datetimedef process_weather_data(json_file, csv_file):"""将天气JSON数据转换为CSV格式"""with open(json_file, 'r', encoding='utf-8') as f:data = json.load(f)headers = ['城市', '日期', '最高温(℃)', '最低温(℃)', '天气状况', '风速(km/h)']with open(csv_file, 'w', encoding='utf-8', newline='') as f:writer = csv.DictWriter(f, fieldnames=headers)writer.writeheader()for city in data['cities']:for day in city['forecast']:writer.writerow({'城市': city['name'],'日期': datetime.strptime(day['date'], '%Y-%m-%d').strftime('%Y/%m/%d'),'最高温(℃)': day['temp_max'],'最低温(℃)': day['temp_min'],'天气状况': day['condition'],'风速(km/h)': day['wind_speed']})# 示例数据文件转换
process_weather_data('weather.json', 'weather_report.csv')
一、JSON数据处理精要
- 核心方法对比表
方法 | 作用 | 适用场景 |
---|---|---|
json.load() | 从文件对象加载JSON数据 | 读取本地JSON文件 |
json.loads() | 从字符串加载JSON数据 | 处理API响应或字符串数据 |
json.dump() | 将对象写入文件对象 | 保存数据到本地文件 |
json.dumps() | 将对象转换为JSON字符串 | 网络传输或字符串处理 |
JSONDecoder() | 自定义解码器 | 处理复杂日期格式或特殊对象 |
JSONEncoder() | 自定义编码器 | 序列化datetime等非标准类型 |
- 复杂对象处理示例
from json import JSONEncoder
from datetime import dateclass CustomEncoder(JSONEncoder):"""处理日期类型的JSON编码"""def default(self, obj):if isinstance(obj, date):return obj.isoformat()return super().default(obj)data = {'event': '会议','date': date(2023, 12, 25),'participants': ['张三', '李四']
}# 序列化
json_str = json.dumps(data, cls=CustomEncoder, ensure_ascii=False)
# {"event": "会议", "date": "2023-12-25", "participants": ["张三", "李四"]}# 反序列化
def date_hook(json_dict):for key in json_dict:if key == 'date':json_dict[key] = datetime.strptime(json_dict[key], '%Y-%m-%d').date()return json_dictrestored_data = json.loads(json_str, object_hook=date_hook)
二、CSV文件操作指南
- 读写方式对比
方式 | 优点 | 缺点 |
---|---|---|
csv.reader | 内存效率高 | 需要记住列索引 |
csv.DictReader | 通过列名访问数据 | 内存占用稍高 |
csv.writer | 简单直接 | 需要手动处理表头 |
csv.DictWriter | 自动处理列顺序 | 需要预先定义字段名 |
pandas | 处理复杂数据 | 需要安装第三方库 |
- 生产级CSV处理模板
def safe_csv_reader(file_path):"""安全的CSV读取器"""with open(file_path, 'r', encoding='utf-8-sig') as f:reader = csv.DictReader(f)for row in reader:try:# 数据清洗cleaned_row = {'name': row['姓名'].strip(),'age': int(row['年龄']),'email': row['邮箱'].lower()}yield cleaned_rowexcept (ValueError, KeyError) as e:print(f"数据格式错误,跳过该行: {row}。错误信息: {e}")continue# 使用示例
for valid_data in safe_csv_reader('users.csv'):process_user(valid_data)
三、天气数据解析实战
- JSON数据结构示例
{"update_time": "2023-07-20T14:00:00Z","cities": [{"name": "北京","code": "010","forecast": [{"date": "2023-07-21","temp_max": 32,"temp_min": 25,"condition": "晴","wind": {"speed": 15,"direction": "东南风"}},{"date": "2023-07-22","temp_max": 34,"temp_min": 27,"condition": "多云","wind": {"speed": 20,"direction": "南风"}}]}]
}
- 数据转换流程图
原始JSON
↓
解析嵌套结构
↓
清洗数据字段(日期格式化、单位转换)
↓
扁平化处理(展开嵌套字典)
↓
生成CSV行数据
↓
写入CSV文件
- 增强版转换函数
def enhanced_weather_converter(json_path, csv_path):"""带数据校验的天气数据转换"""with open(json_path, 'r', encoding='utf-8') as f:try:raw_data = json.load(f)except json.JSONDecodeError:raise ValueError("无效的JSON格式")required_fields = ['cities', 'update_time']if not all(field in raw_data for field in required_fields):raise KeyError("缺少必要字段")# 构建CSV结构fieldnames = ['城市', '日期', '星期', '最高温', '最低温','体感温度', '天气状况', '风速', '风向', '湿度']with open(csv_path, 'w', encoding='utf-8', newline='') as f:writer = csv.DictWriter(f, fieldnames=fieldnames)writer.writeheader()for city in raw_data['cities']:base_info = {'城市': city.get('name', '未知'),'湿度': city.get('humidity', 'N/A')}for forecast in city.get('forecast', []):# 日期处理date_str = forecast.get('date', '')try:date_obj = datetime.strptime(date_str, '%Y-%m-%d')weekday = date_obj.strftime('%A')except ValueError:continue# 风速处理wind = forecast.get('wind', {})row = {**base_info,'日期': date_str,'星期': weekday,'最高温': forecast.get('temp_max', ''),'最低温': forecast.get('temp_min', ''),'天气状况': forecast.get('condition', ''),'风速': wind.get('speed', 0),'风向': wind.get('direction', '未知')}writer.writerow(row)
四、最佳实践与性能优化
- 内存优化技巧
# 流式处理大文件
def stream_process_large_json(json_file):"""流式处理超大JSON文件"""with open(json_file, 'r', encoding='utf-8') as f:for line in f:record = json.loads(line)process_record(record)# 分块写入CSV
CHUNK_SIZE = 1000
def write_large_csv(data_generator, output_file):"""分块写入CSV文件"""with open(output_file, 'w', newline='', encoding='utf-8') as f:writer = Nonechunk = []for row in data_generator:chunk.append(row)if len(chunk) >= CHUNK_SIZE:if not writer:writer = csv.DictWriter(f, fieldnames=row.keys())writer.writeheader()writer.writerows(chunk)chunk = []if chunk:writer.writerows(chunk)
- 异常处理增强
class DataProcessor:"""带错误日志的数据处理器"""def __init__(self):self.error_log = []def process_row(self, row):try:# 数据验证if not row.get('date'):raise ValueError("缺少日期字段")# 类型转换return {'date': datetime.strptime(row['date'], '%Y-%m-%d'),'temperature': float(row['temp']),'city': row['city'].upper()}except Exception as e:self.error_log.append({'row': row,'error': str(e),'timestamp': datetime.now()})return None
注意事项:
- 始终指定文件编码(推荐UTF-8)
- 处理CSV中的特殊字符(使用quoting参数)
- 考虑使用pandas处理复杂转换
- 定期备份原始数据
- 对大文件进行分块处理
- 添加数据校验步骤
- 记录数据转换日志
# CSV特殊字符处理示例
with open('data.csv', 'w', newline='', encoding='utf-8') as f:writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC)writer.writerow(['ID', 'Description'])writer.writerow([1, '包含,逗号的字段'])writer.writerow([2, '有"引号的内容'])
性能对比测试结果(处理10万行数据):
方法 | 耗时(秒) | 内存占用(MB) |
---|---|---|
传统逐行处理 | 12.3 | 15.2 |
分块处理(1万行/块) | 8.7 | 9.8 |
pandas处理 | 3.2 | 45.1 |
并行处理(4线程) | 6.5 | 22.4 |
相关文章:
python基础入门:6.2JSON与CSV数据处理
Python数据处理实战:JSON与CSV高效转换指南 # 天气数据转换示例 import json import csv from datetime import datetimedef process_weather_data(json_file, csv_file):"""将天气JSON数据转换为CSV格式"""with open(json_file, r,…...
尚硅谷课程【笔记】——大数据之Zookeeper【二】
课程视频:【尚硅谷Zookeeper教程】 四、Zookeeper实战 4.1分布式安装部署 1. 集群规划 在Hadoop102、Hadoop103和Hadoop104三个节点上部署Zookeeper 2. 解压安装 1)解压Zookeeper.tar.gz到指定目录 tar -zxvf zookeeper-3.7.2.tar.gz -C /opt/mod…...
机器学习常用包matplotlib篇(一)简单图像绘制
前言 Matplotlib 是支持 Python 语言的开源绘图库,简单且完善。 一、环境配置 1.环境设置 在 Notebook 环境绘图时,需先运行 %matplotlib inline 命令,将绘制图形嵌入当前页面。在桌面环境绘图,无需上述命令,而是在…...
JUnit断言方法详解与实战
在Java开发中,JUnit是一个不可或缺的单元测试框架,而org.junit.Assert类中的断言方法则是JUnit的核心功能之一。通过这些方法,我们可以方便地验证代码的正确性。本文将详细介绍一些常用的断言方法,并通过实例展示它们的使用。 一、…...
npm运行Vue项目报错 error:0308010c:digital envelope routines::unsupported
大家好,我是 程序员码递夫。 问题 VSCode 运行Vue项目,提示错误: building 2/2 modules 0 activeError: error:0308010c:digital envelope routines::unsupported 解决方法 原因是 npm 高版本(大于17),对ssl的处理做了改进&…...
C语言操作符详解
引言 C语言作为一种强大而灵活的编程语言,操作符是其重要组成部分。操作符用于执行各种运算,如算术运算、逻辑运算、比较运算等。深入理解C语言操作符,能帮助开发者编写出高效、准确的代码。 算术操作符 基本算术操作符 - (加法…...
Lucene 中的并发错误:如何修复乐观并发失败
作者:来着 Elastic Benjamin Trent 及 Ao Li 感谢 CMU PASTA 实验室开发的确定性并发测试框架 Fray,我们找到了一个棘手的 Lucene 漏洞并将其修复。 是的,另一个修复错误博客。但这个故事有一个转折,一位开源英雄突然出现并拯救了…...
Oracle的学习心得和知识总结(三十三)|Oracle数据库数据库的SQL ID的底层计算原理分析
目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《Oracle Database SQL Language Reference》 2、参考书籍:《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…...
C# OpenCV机器视觉:智能水果采摘
在一个风景如画的小镇边上,有一座阿强家祖传的果园。每到水果成熟的季节,果园里硕果累累,红彤彤的苹果、黄澄澄的梨子、紫莹莹的葡萄,散发着诱人的香气。然而,这丰收的喜悦却总被一件烦心事笼罩 —— 摘水果。 “哎呀…...
逻辑回归不能解决非线性问题,而svm可以解决
逻辑回归和支持向量机(SVM)是两种常用的分类算法,它们在处理数据时有一些不同的特点,特别是在面对非线性问题时。 1. 逻辑回归 逻辑回归本质上是一个线性分类模型。它的目的是寻找一个最适合数据的直线(或超平面&…...
celery + redis - 入门
文章目录 一、基本使用编写任务启动服务创建生产者获取状态和结果二、多目录结构异步执行编写服务启动服务调用服务获取结果https://www.bilibili.com/video/BV1jg4y13718 https://www.cnblogs.com/pyedu/p/12461819.html 一、基本使用 编写任务 celery_task.py import cel…...
SAP-ABAP:在LOOP循环中 ASSIGNING FIELD-SYMBOL的使用代码详解
在ABAP中,ASSIGNING FIELD-SYMBOL的作用是直接引用内表行的数据,避免不必要的数据复制,从而提升性能和代码效率。以下是其核心作用和优势: 基本语法 LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>)." 处理逻辑 ENDLOOP.i…...
SpringBoot启动流程简略版
启动入口 (main 方法) ↓ SpringApplication 初始化 ↓ 加载配置 (application.properties/yml) ↓ 创建 ApplicationContext ↓ 刷新 ApplicationContext ↓ - 加载 Bean 定义 - 执行自动配置 - 实例化 Bean - 依赖注入 - 调用初…...
Python:凯撒密码
题目内容: 凯撒密码是古罗马恺撒大帝用来对军事情报进行加密的算法,它采用了替换方法对信息中的每一个英文字符循环替换为字母表序列该字符后面第三个字符,对应关系如下: 原文:A B C D E F G H I J K L M N O P Q R …...
element-plus 解决el-dialog背后的页面滚动问题,及其内容有下拉框出现错位问题
这个问题通常是因为 el‑dialog 默认会锁定 body 的滚动(通过给 body 添加隐藏滚动条的样式),从而导致页面在打开对话框时跳转到顶部。解决方法是在使用 el‑dialog 时禁用锁定滚动功能。 <el-dialogv-model"dialogVisible":lo…...
Android和DLT日志系统
1 Linux Android日志系统 1.1 内核logger机制 drivers/staging/android/logger.c static size_t logger_offset( struct logger_log *log, size_t n) { return n & (log->size - 1); } 写的off存在logger_log中(即内核内存buffer)&am…...
Ubuntu 安装 NVIDIA 驱动实操指南(含卸载)
本文将详细介绍如何在Ubuntu上安装和配置NVIDIA显卡驱动。以下是一步步的操作流程,包括禁用开源驱动的步骤。 步骤 1:安装依赖 首先,确保系统中已安装gcc和make,这些是编译驱动所需的依赖。 sudo apt update sudo apt install …...
在postman中设置环境变量和全局变量以及五大常用响应体断言
一、什么是环境变量和全局变量 环境变量(Environment Variables)和全局变量(Global Variables)是 Postman 中用于存储和管理数据的两种变量类型,它们可以提高 API 测试的灵活性和可维护性。 1、 环境变量(…...
32单片机学习记录1之GPIO
32单片机学习记录1之GPIO 前置 GPIO口在单片机中扮演着什么角色? 在单片机中,GPIO口(General Purpose Input/Output) 是一种通用输入/输出接口,扮演着连接单片机与外部设备的桥梁角色。具体来说,它在单片…...
负载测试和压力测试的原理分别是什么
负载测试和压力测试是性能测试的两种主要类型,它们的原理和应用场景有所不同。 负载测试(Load Testing) 原理: 负载测试通过模拟实际用户行为,逐步增加系统负载,观察系统在不同负载下的表现。目的是评估系…...
openAI官方prompt技巧(二)
1. 赋予 ChatGPT 角色 为 ChatGPT 指定一个角色,让其从特定的身份或视角回答问题。这有助于生成针对特定受众或场景的定制化回答。 例如: 你是一名数据分析师,负责我们的市场营销团队。请总结上个季度的营销活动表现,并强调与未…...
javaEE-11.javaScript入门
目录 一.什么是javaScript 二.快速实现 三.JS引入方式 1.行内引入: 2.内部引入: 3.外部引入: 四.基础语法 1.变量 变量命名规则: 2.数据类型 3.运算符 五.JS对象 1.数组 创建数组: 2.操作数组 3.函数 函数注意事项: 函数参数: 4.对象 1.使用字面量 创建对象:…...
Word成功接入DeepSeek详细步骤
原理 原理是利用Word的VBA宏,写代码接入API。无需下载额外插件。 步骤一、注册硅基流动 硅基流动统一登录 注册这个是为了有一个api调用的api_key,有一些免费的额度可以使用。大概就是这个公司提供token,我们使用这个公司的模型调用deepsee…...
单片机简介
一、单片机简介 电脑和单片机性能对比 二、单片机发展历程 三、CISC VS RISC...
GitCode 助力 Dora SSR:开启游戏开发新征程
项目仓库(点击阅读原文链接可直达) https://gitcode.com/ippclub/Dora-SSR 跨越技术藩篱,构建游戏开发乐园 Dora SSR 是一款致力于打破游戏开发技术壁垒的开源游戏引擎。其诞生源于开发者对简化跨平台游戏开发环境搭建的强烈渴望࿰…...
[python SQLAlchemy数据库操作入门]-25.股票数据可视化:将 SQLAlchemy 数据呈现给用户
哈喽,大家好,我是木头左! 本文将探讨如何利用SQLAlchemy从数据库中提取股票数据,并使用现代数据可视化工具将这些数据以直观的方式呈现给用户。将通过一系列步骤来演示这个过程,包括设置环境、连接数据库、提取数据、处理数据以及最终的可视化展示。 安装必要的库 接下来…...
android的Lifecycle简介
嗯,我现在需要了解Android的Lifecycle组件。Lifecycle是Jetpack的一部分,对吧?听说它帮助管理Activity和Fragment的生命周期,避免内存泄漏。那它具体是怎么工作的呢? 首先,LifecycleOwner和LifecycleObser…...
SQL-leetcode—1327. 列出指定时间段内所有的下单产品
1327. 列出指定时间段内所有的下单产品 表: Products ------------------------- | Column Name | Type | ------------------------- | product_id | int | | product_name | varchar | | product_category | varchar | ------------------------- product_id 是该表主键(具…...
在Uniapp中使用阿里云OSS插件实现文件上传
在开发小程序时,文件上传是一个常见的需求。阿里云OSS(Object Storage Service)是一个强大的云存储服务,可以帮助我们高效地存储和管理文件。本文将介绍如何在Uniapp小程序中使用阿里云OSS插件实现文件上传功能。 1. 准备工作 首…...
C#中的序列化和反序列化
序列化是指将对象转换为可存储或传输的格式,例如将对象转换为JSON字符串或字节流。反序列化则是将存储或传输的数据转换回对象的过程。这两个过程在数据持久化、数据交换以及与外部系统的通信中非常常见 把对象转换成josn字符串格式 这个过程就是序列化 josn字符…...
IGBT的两级关断
IGBT(绝缘栅双极型晶体管)的两级关断(Two-stage turn-off)是一种优化关断过程的方法,主要用于减少关断时的电压过冲和dv/dt(电压变化率)过高的问题,特别是在大功率应用中(…...
TCP/IP 协议图解 | TCP 协议详解 | IP 协议详解
注:本文为 “TCP/IP 协议” 相关文章合辑。 未整理去重。 TCP/IP 协议图解 退休的汤姆 于 2021-07-01 16:14:25 发布 TCP/IP 协议简介 TCP/IP 协议包含了一系列的协议,也叫 TCP/IP 协议族(TCP/IP Protocol Suite,或 TCP/IP Pr…...
PyCharm结合DeepSeek-R1
PyCharm结合DeepSeek-R1,打造专属 AI 编程助手 在程序员的日常工作中,提高编程效率、快速解决代码问题是重中之重。今天给大家分享一个强强联合的组合 ——PyCharm 插件 Continue 与 DeepSeek-R1,它们能帮你打造出强大的个人 AI 编程助手。 …...
深入理解Java对接DeepSeek
其实,整个对接过程很简单,就四步,获取key,找到接口文档,接口测试,代码对接。 1.获取 KEY https://platform.deepseek.com/transactions 直接付款就是了(现在官网暂停充值2025年2月7日…...
【RabbitMQ的x-death头】消息死亡记录头流转示例
Header(name "x-death", required false) List<Map<String,Object>> xDeath 是用于捕获RabbitMQ自动生成的 消息死亡记录头信息。以下是详细解析和实际应用示例: x-death头的作用 死亡原因追踪:记录消息被拒绝/过期的完整生命周…...
【DeepSeek】在本地计算机上部署DeepSeek-R1大模型实战(完整版)
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈人工智能与大模型应用 ⌋ ⌋ ⌋ 人工智能(AI)通过算法模拟人类智能,利用机器学习、深度学习等技术驱动医疗、金融等领域的智能化。大模型是千亿参数的深度神经网络(如ChatGPT&…...
二、通义灵码插件保姆级教学-IDEA(使用篇)
一、IntelliJ IDEA 中使用指南 1.1、代码解释 选择需要解释的代码 —> 右键 —> 通义灵码 —> 解释代码 解释代码很详细,感觉很强大有木有,关键还会生成流程图,对程序员理解业务非常有帮忙,基本能做到哪里不懂点哪里。…...
北斗导航 | 基于多假设解分离(MHSS)模型的双星故障监测算法(MATLAB代码实现——ARAIM)
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 双星故障监测算法 一、多星故障MHSS模型流程1、数据预处理2、构建假设模…...
OpenCV2D 特征框架 (22)人脸检测的一个类cv::FaceDetectorYN的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::FaceDetectorYN 是 OpenCV 中用于人脸检测的一个类,它基于深度学习模型实现。这个类是 OpenCV DNN(Deep Neural Netw…...
微信小程序页面制作——婚礼邀请函(含代码)
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
django中间件,中间件给下面传值
1、新建middleware.py文件 # myapp/middleware.py import time from django.http import HttpRequest import json from django.http import JsonResponse import urllib.parse class RequestTimeMiddleware:def __init__(self, get_response):self.get_response get_respons…...
调用DeepSeek官方的API接口
效果 前端样式体验链接:https://livequeen.top/deepseekshow 准备工作 1、注册deepseek官网账号 地址:DeepSeek 点击进入右上角【API开放平台】,并进行账号注册。 2、注册完成后,依次点击【API keys】-【生成API key】&#x…...
C++--iomanip库
目录 1. 设置字段宽度:std::setw() 2. 设置浮点数精度:std::setprecision() 3. 设置填充字符:std::setfill() 4. 控制对齐方式:std::left 和 std::right,std::internal 5. 控制进制输出:std::hex、std…...
程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<8>
大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。 今天我们复习前面学习的指针知识 目录 关于指针数组和数组指针的区别指针数组(Array of Poi…...
redo和binlog区别
事务是数据库区别于文件系统的最重要功能,数据库事务支持ACID四个特性,其中I:隔离性是通过锁的方式实现的,剩下的A:原子性 C:一致性 D:持久性是通过redo日志、undo日志、binlog日志来实现的。 我…...
2.11学习记录
web——CTFHub XSS学习 学习资料:xss(跨站攻击) 原理 1.黑客发送带有xss恶意脚本的链接给用户 2.用户点击了恶意链接,访问了目标服务器(正常的服务器) 3.目标服务器(正常的服务器)…...
Packer 手动修复安装腾讯云插件
文章目录 Packer [腾讯云插件文档](https://developer.hashicorp.com/packer/integrations/hashicorp/tencentcloud) 提供的版本:v1.2.0,目前 Packer 构建镜像时,不支持现有2种[硬盘类型](https://www.tencentcloud.com/zh/document/product/…...
【探索未来科技】2025年国际学术会议前瞻
【探索未来科技】2025年国际学术会议前瞻 【探索未来科技】2025年国际学术会议前瞻 文章目录 【探索未来科技】2025年国际学术会议前瞻前言1. 第四届电子信息工程、大数据与计算机技术国际学术会议( EIBDCT 2025)代码示例:机器学习中的线性回…...
【Elasticsearch】Bucket Count K-S Test 聚合
Bucket Count K-S Test是 Elasticsearch 中的一种兄弟管道聚合(sibling pipeline aggregation),用于执行双样本柯尔莫哥洛夫-斯米尔诺夫检验(Kolmogorov-Smirnov Test,简称 K-S 检验)。这种聚合主要用于比较…...
LINUX——基础指令
引言 Linux 操作系统以其强大的命令行工具著称,掌握基础指令是高效使用 Linux 的必备技能。无论是文件管理、文本处理还是系统监控,命令行都能以极简的操作完成复杂任务。本文系统梳理 Linux 最核心的 30 基础指令,配合实际场景案例和进阶技…...