当前位置: 首页 > news >正文

Python爬虫(7)Python数据存储实战:CSV文件读写与复杂数据处理指南

目录

      • 一、背景与核心价值‌
      • 二、CSV基础与核心应用场景‌
        • ‌2.1 CSV文件结构解析‌
        • 2.2 适用场景
      • 三、Python csv模块核心操作‌
        • 3.1 安装与基础读写‌
        • 3.2 高级功能:字典读写与自定义格式‌
      • 四、处理复杂数据场景‌
        • 4.1 含特殊字符的字段‌
        • 4.2 嵌套数据(如JSON字段)‌
      • 五、性能优化与最佳实践‌
        • 5.1 大文件处理方案‌
        • 5.2 与Pandas结合提升效率‌
        • 5.3 避免常见陷阱‌
      • 六、实战案例:爬虫数据存储‌
      • 七、总结与扩展方向‌
        • 7.1 核心总结‌
        • 7.2 CSV的局限性‌
        • Python爬虫相关文章(推荐)

一、背景与核心价值‌

在数据驱动开发中,‌结构化存储‌是数据处理流程的关键环节。CSV(Comma-Separated Values)作为一种轻量级、跨平台的文件格式,广泛用于数据交换、日志记录及中小规模数据存储。相比于数据库或JSON,CSV具有以下优势:

  • ‌无需依赖‌:直接通过Python标准库csv模块操作。
  • ‌人类可读‌:文本格式可直接用Excel或文本编辑器查看。
  • ‌高效灵活‌:适合快速导出、导入表格型数据。

‌本文目标‌:结合Python csv模块,详解CSV文件的‌读写技巧‌、‌复杂数据处理‌(如嵌套字段、特殊字符)及‌性能优化方案‌,并提供可直接复用的代码模板

二、CSV基础与核心应用场景‌

‌2.1 CSV文件结构解析‌
  • 基本规则‌:

    • 每行表示一条记录,字段以特定分隔符(默认为逗号)分隔。
    • 支持文本引用(如双引号)包裹含特殊字符的字段。
    • 首行可定义列名(表头)。
  • 示例文件data.csv‌:

id,name,email,score
1,张三,zhangsan@example.com,95
2,李四,"li.si@test.com",88
3,王五,wangwu@demo.org,"92"
2.2 适用场景
场景说明
数据导出/备份从数据库或API批量导出结构化数据
数据分析预处理配合Pandas进行统计与可视化
跨系统数据交换兼容Excel/R/MATLAB等工具

三、Python csv模块核心操作‌

3.1 安装与基础读写‌

Python内置csv模块,无需额外安装。

  • ‌写入CSV文件‌:
import csvheaders = ["id", "name", "email"]
data = [[1, "张三", "zhangsan@example.com"],[2, "李四", "lisi@test.org"],[3, "王五", "wangwu@demo.net"]
]with open("output.csv", "w", newline="", encoding="utf-8") as f:writer = csv.writer(f)writer.writerow(headers)  # 写入表头writer.writerows(data)    # 批量写入数据
  • ‌读取CSV文件‌:
with open("data.csv", "r", encoding="utf-8") as f:reader = csv.reader(f)for row in reader:print(row)
# 输出:
# ['id', 'name', 'email', 'score']
# ['1', '张三', 'zhangsan@example.com', '95']
# ['2', '李四', 'li.si@test.com', '88']
3.2 高级功能:字典读写与自定义格式‌
  • 使用DictWriter和DictReader‌:
# 写入字典数据
with open("dict_output.csv", "w", newline="", encoding="utf-8") as f:writer = csv.DictWriter(f, fieldnames=["id", "name", "email"])writer.writeheader()writer.writerow({"id": 101, "name": "赵六", "email": "zhao@test.com"})# 读取为字典
with open("dict_output.csv", "r", encoding="utf-8") as f:reader = csv.DictReader(f)for row in reader:print(row["name"], row["email"])
  • 自定义分隔符与引号规则‌:
# 使用分号分隔,双引号包裹所有字段
with open("custom.csv", "w", newline="", encoding="utf-8") as f:writer = csv.writer(f, delimiter=";", quoting=csv.QUOTE_ALL)writer.writerow(["id", "name"])writer.writerow([1, "张三"])

四、处理复杂数据场景‌

4.1 含特殊字符的字段‌
  • ‌问题‌:字段包含逗号、换行符等破坏CSV结构的字符。
  • ‌方案‌:使用引号包裹字段,并配置csv.QUOTE_MINIMAL或csv.QUOTE_NONNUMERIC。
data = [[4, "Alice, Smith", "alice@example.com"],[5, "Bob\nJohnson", "bob@test.org"]
]with open("special_chars.csv", "w", newline="", encoding="utf-8") as f:writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC)writer.writerows(data)
4.2 嵌套数据(如JSON字段)‌
  • 场景‌:将JSON字符串作为CSV的一个字段存储。
  • ‌代码示例‌:
import jsondata = [{"id": 1, "info": '{"age": 30, "city": "北京"}'},{"id": 2, "info": '{"age": 25, "city": "上海"}'}
]# 写入嵌套JSON
with open("nested_data.csv", "w", newline="", encoding="utf-8") as f:writer = csv.DictWriter(f, fieldnames=["id", "info"])writer.writeheader()writer.writerows(data)# 读取并解析JSON
with open("nested_data.csv", "r", encoding="utf-8") as f:reader = csv.DictReader(f)for row in reader:info = json.loads(row["info"])print(f"ID: {row['id']}, 城市: {info['city']}")

五、性能优化与最佳实践‌

5.1 大文件处理方案‌
  • ‌问题‌:单次读取大文件可能导致内存溢出。
  • ‌方案‌:逐行读取或分块处理。
# 逐行读取大文件
with open("large_data.csv", "r", encoding="utf-8") as f:reader = csv.reader(f)for row in reader:process(row)  # 自定义处理函数
5.2 与Pandas结合提升效率‌

对于复杂操作(如数据清洗、聚合),可借助Pandas处理后再导出为CSV。

import pandas as pd# 读取CSV
df = pd.read_csv("data.csv")
# 过滤分数大于90的记录
filtered = df[df["score"] > 90]
# 导出为CSV
filtered.to_csv("high_score.csv", index=False)
5.3 避免常见陷阱‌
  1. ‌文件未关闭‌:务必使用with语句确保资源释放。
  2. ‌编码问题‌:统一使用utf-8避免乱码。
  3. ‌表头不一致‌:写入数据时确保列名与数据对齐。

六、实战案例:爬虫数据存储‌

‌目标‌:将爬取的图书信息存储为CSV文件。

import csv
import requests
from bs4 import BeautifulSoupurl = "https://book.douban.com/top250"
headers = {"User-Agent": "Mozilla/5.0"}response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, "html.parser")books = []
for item in soup.select("tr.item"):title = item.select_one(".pl2 a")["title"]score = item.select_one(".rating_nums").textbooks.append({"title": title, "score": score})# 写入CSV
with open("douban_books.csv", "w", newline="", encoding="utf-8") as f:writer = csv.DictWriter(f, fieldnames=["title", "score"])writer.writeheader()writer.writerows(books)print("数据已存储至 douban_books.csv")

七、总结与扩展方向‌

7.1 核心总结‌
  • ‌基础能力‌:csv模块提供了灵活的方法处理CSV读写。
  • ‌复杂场景‌:通过引号规则、结合JSON或Pandas处理嵌套数据。
  • ‌性能优化‌:逐行处理大文件,避免内存瓶颈。
7.2 CSV的局限性‌
  • 不支持数据类型‌:所有字段均为字符串,需手动转换。
  • ‌无索引查询‌:复杂查询需加载至内存处理。
Python爬虫相关文章(推荐)
Python爬虫介绍Python爬虫(1)Python爬虫:从原理到实战,一文掌握数据采集核心技术
HTTP协议解析Python爬虫(2)Python爬虫入门:从HTTP协议解析到豆瓣电影数据抓取实战
HTML核心技巧Python爬虫(3)HTML核心技巧:从零掌握class与id选择器,精准定位网页元素
CSS核心机制Python爬虫(4)CSS核心机制:全面解析选择器分类、用法与实战应用
静态页面抓取实战Python爬虫(5)静态页面抓取实战:requests库请求头配置与反反爬策略详解
静态页面解析实战Python爬虫(6)静态页面解析实战:BeautifulSoup与lxml(XPath)高效提取数据指南

相关文章:

  • 写读后感的时候,可以适当地引用书中的内容吗?
  • dma_buf学习记录之二核心接口
  • 基于STM32、HAL库的ADS1255IDBR模数转换器ADC驱动程序设计
  • AI赋能智慧医疗新范式:小天互连即时通讯打造高效、安全的医疗通讯平台
  • makefile总结
  • 【C语言干货】回调函数
  • 优先队列、堆笔记(算法第四版)
  • Android完整开发环境搭建/Studio安装/NDK/本地Gradle下载配置/创建AVD/运行一个Android项目/常用插件
  • APP、游戏、网站被黑客攻击了怎么解决?
  • 机器学习之三:归纳学习
  • 通俗易懂一文讲透什么是 MCP?
  • EMQX​​ 默认安装后常用端口及其功能
  • Opnelayers:向某个方向平移指定的距离
  • C++初阶-模板初阶
  • 业务中台与数据中台:企业数字化转型的核心引擎
  • 【源码】【Java并发】【ConcurrentHashMap】适合中学体质的ConcurrentHashMap
  • 全球城市范围30米分辨率土地覆盖数据(1985-2020)
  • MCP协议:AI生态的统一标准
  • ppt章节页怎么做好看?ppt章节页模板
  • 京东商品详情数据爬取难度分析与解决方案
  • 十四届全国人大常委会举行第四十三次委员长会议 ,听取有关草案和议案审议情况汇报
  • 网警侦破特大“刷量引流”网络水军案:涉案金额达2亿余元
  • 巴防长称中俄可参与克什米尔恐袭事件国际调查,外交部回应
  • 恒瑞医药赴港上市获证监会备案,拟发行不超8.15亿股
  • 中日友好医院通报“医师肖某被举报”:基本属实,开除党籍并解聘
  • 伊朗港口爆炸已造成25人死亡,灭火行动已近尾声