一步一步学爬虫(4)数据存储之CSV文件存储

news2024/9/24 15:18:53

一步一步学爬虫(4)数据存储之CSV文件存储

  • 4.3 CSV文件存储
    • 4.3.1 写入
    • 4.3.2 读取
    • 4.3.3 总结

4.3 CSV文件存储

  • CSV,全称Comma-Separated Values,中文叫做逗号分隔值或字符分隔值,其文件以纯文本形式存储表格数据。CSV文件是一个字符序列,可以由任意数目的记录组成,各条记录以某种换行符分隔开。每条记录都由若干字段组成,字段间的分隔是其他字符或字符串,最常见的是逗号或制表符。不过所有记录都有完全相同的字段序列,相当于一个结构化表的纯文本形式。它比Excel文件更加简洁,XLS文本是电子表格,包含文本、数值、公式和格式等内容,CSV中则不包含这些,就是以特定字符作为分隔符的纯文本,结构简单清晰。所以,有时候使用CSV来存储数据是比较方便的。本节我们就来讲解Python读取数据和将数据写入CSV文件的过程。

4.3.1 写入

  • 这里先看一个简单例子:

    import csv
    with open('data.csv','w') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(['id','name','age'])
        writer.writerow(['1001','Mike',20])
        writer.writerow(['1002','Bob',22])
        writer.writerow(['1003','Jordan',21])
    
  • 这里首先打开 data.csv文件,然后指定打开的模式为w(即写人),获得文件句柄,随后调用csv库的 writer 方法初始化写人对象,传人该句柄,然后调用 writerow 方法传入每行的数据,这样便完成了写入。

  • 运行结束后,会生成一个名为 data.csv 的文件,此时数据就成功写入了。直接以文本形式打开,会显示如下内容:

    id,name,age
    10001,Mike,20
    10002,Bob,22
    10003,lordan,21
    
  • 可以看到,写人 CSV文件的文本默认以逗号分隔每条记录,每调用一次 writerow 方法即可写入一行数据。用Excel 打开 data.csv文件的结果如图所示:
    在这里插入图片描述

  • 如果想修改列与列之间的分隔符,可以传入delimiter 参数,其代码如下:

    import csv
    with open('data.csv','w') as csvfile:
        writer = csv.writer(csvfile, delimiter='')
        writer.writerow(['id','name','age'])
        writer.writerow(['1001','Mike',20])
        writer.writerow(['1002','Bob',22])
        writer.writerow(['1003','Jordan',21])
    
  • 这里在初始化写入对象时,将空格传入了 delimiter参数。此时输出结果中的列与列之间就是空格分隔了,内容如下:

    id name age
    10001 Mike 20
    10002 Bob 22
    10003 Jordan 21
    
  • 另外,我们也可以调用 writerows 方法同时写入多行,此时参数需要传入二维列表,例如:

    import csv
    with open('data.csv', 'w') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(['id','name','age'])
        writer.writerows([['1001','Mike',20],['1002','Bob',22],['1003','Jordan',21]])
    
  • 注意,这里除了用到writerows方法,后面加的内容,还要用中括号[]括起来。

  • 输出结果是相同的,内容如下:

    id,name,age
    10001,Mike,20
    10002,Bob,22
    10003,lordan,21
    
  • 但是一般情况下,爬虫爬取的都是结构化数据。我们一般会用字典表示这种数据。csv库也提供了字典的写人方式,实例如下:

import csv
with open('data.csv', 'w') as csvfile:
    filenames = ['id','name','age']
    writer = csv.DictWriter(csvfile, fieldnames=filenames)
    writer.writeheader()
    writer.writerow({'id':'10001','name':'Mike','age': 20}) 
    writer.writerow({'id':'10002','name':'Bob','age': 22})   
    writer.writerow({'id':'10003','name':'Jordan','age': 21})  
  • 这里先定义了3个字段,用fieldnames表示,然后将其传给DictWriter方法以初始化一个字典写入对象、并将对象赋给writer变量。接着调用写入了对象的writeheader方法先写入头信息,再调用writerow方法传入了相应字典。最终写入的结果和之前是完全相同的。内容如下:

    id,name,age
    10001,Mike,20
    10002,Bob,22
    10003,lordan,21
    
  • 这样就把字典写人了 CSV 文件中

  • 另外,如果想追加写人,可以修改文件的打开模式,即把 open 函数的第二个参数改成a,代码如下:

    import csv
    with open('data.csv', 'w') as csvfile:
        filenames = ['id','name','age']
        writer = csv.DictWriter(csvfile, fieldnames=filenames)	    writer.writerow({'id':'10004','name':'Durant','age': 22}) 
    
  • 这样再次执行这段代码,文件内容便会变

    id,name,age
    10001,Mike,20
    10002,Bob,22
    10003,lordan,21
    10004,Durant,22
    
  • 由结果可见,数据被追加写人到了文件中。

  • 如果要写人中文内容,我们知道可能会遇到字符编码的问题,此时需要给 open 参数指定编码格式。例如,这里再写入一行包含中文的数据,代码改写如下:

    import csv
    with open('data.csv', 'w') as csvfile:
        filenames = ['id','name','age']
        writer = csv.DictWriter(csvfile, fieldnames=filenames)
        writer.writeheader()
        writer.writerow({'id':'10004','name':'王伟','age': 22})  
    
  • 这里要是没有给 open 函数指定编码,可能会发生编码错误。

  • 另外,如果接触过 pandas 等库,可以调用 DataFrame 对象的 to_csv 方法将数据写人CSV文件中。

  • 这种方法需要安装pandas库,安装命令为:
    pip3 install pandas

  • 安装完成之后,我们便可以使用 pandas 库将数据保存为 CSV 文件,实例代码如下:

    import pandas as pd
    data = [
        {'id':'10001','name':'Mike','age': 20}, 
        {'id':'10002','name':'Bob','age':22}, 
        {'id':'10003','name':'Jordan','age':21},
    ]
    df = pd.DataFrame(data)
    df.to_csv('data.csv', index=False)
    
  • 这里我们先定义了几条数据,每条数据都是一个字典,然后将其组合成一个列表,赋值为 data。紧接着我们使用 pandas 的DataFrame 类新建了一个 DataFrame 对象,参数传人 data,并把该对象赋值为df。最后我们调用 df 的 to_csv 方法也可以将数据保存为 CSV 文件。

4.3.2 读取

  • 我们同样可以使用 csv 库来读取 CSV 文件。例如,将刚才写入的文件内容读取出来,相关代码如下:

    import csv
    with open('data.csv', 'r', encoding='utf-8') as csvfile:
        reader = csv.reader(csvfile) 
        for row in reader:
            print(row)
    
  • 运行结果如下:

    ['id', 'name', 'age']
    ['10001', 'Mike', '20']
    ['10002', 'Bob', '22']
    ['10003', 'Jordan', '21']
    
  • 这里我们构造的是 Reader 对象,通过遍历输出了文件中每行的内容,每一行都是一个列表。注意,如果 CSV 文件中包含中文,还需要指定文件编码。

  • 另外,我们也可以使用 pandas 的 read_csv 方法将数据从 CSV 文件中读取出来,例如:

    import pandas as pd
    df = pd.read_csv('data.csv') 
    print(df)
    
  • 运行结果如下:

    id name age 
    0 10001 Mike  20 
    1 10002 Bob   22 
    2 10003 ordan 21
    
  • 这里的 df 实际上是一个 DataFrame 对象,如果你对此比较熟悉,则可以直接使用它完成一些数据的分析处理。如果只想读取文件里面的数据,可以把 df 再进一步转化为列表或者元组,实例代码如下:

    import pandas as pd
    df = pd.read_csv('data.csv') 
    data = df.values.tolist() 
    print(data)
    
  • 这里我们调用了df的values属性,再调用tolist方法,即可将数据转化为列表形式,运行结果如下:

    [[10001, 'Mike', 20], [10002, 'Bob', 22], [10003, 'Jordan', 21]]
    
  • 另外,直接对df进行逐行遍历,同样能得到列表类型的结果,代码如下:

    import pandas as pd
    df = pd.read_csv('data.csv') 
    for index, row in df.iterrows():
        print(row.tolist())
    
  • 运行结果如下:

    [10001, 'Mike', 20]
    [10002, 'Bob', 22]
    [10003, 'Jordan', 21]
    
  • 可以看到,我们同样获取了列表类型的结果。

4.3.3 总结

  • 本节中,我们了解了CSV文件的写入和读取方式。这也是一种常用的数据存储方式,需要熟练掌握。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/131842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java.lang.OutOfMemoryError: GC overhead limit exceeded问题分析及解决

一、错误重现 2022-12-29 10:12:07.210 ERROR 73511 --- [nio-8001-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.…

SQL刷题宝典-MySQL速通力扣困难题

📢作者: 小小明-代码实体 📢博客主页:https://blog.csdn.net/as604049322 📢欢迎点赞 👍 收藏 ⭐留言 📝 欢迎讨论! 本手册目录: 文章目录前言Markdown导入数据库python脚…

奇安信 工业互联网安全发展与实践 报告 学习笔记一 欢迎扶正

声明 本文是学习2021工业互联网安全发展与实践分析报告. 下载地址而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 主要观点 工业系统安全漏洞数量增长显著放缓,但超高危漏洞数量却大幅增加。统计显示,2021年,国内外…

Linux 软件包管理器 yum

1.什么是软件包 在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序。但是这样太麻烦了,于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上&…

再见2022

大家好,我是bigsai,好久不见。看了上一篇更新时间,大概已经停更近10个月(呜呜后面还会坚持的),在2022的最后一天,这一篇也算是对这一年做个总结。期间也收到一些朋友的问候和鼓励,确实自己在读研期间的前两…

山东大学2022-2023非关系型数据库(Nosql)期末考试

写在前面的话: 今年线上开卷考试,Nosql考试软工(限选课)和大数据(必修课)是一套试题,因此大数据所学的许多内容考试并无涉及。考察点主要以学过的四类Nosql数据库的相关知识为主。 试题如下&…

引用量超1400的经典语义分割方法BiSeNet解读

今天给大家分享语义分割领域非常经典的一篇论文:BiSeNet,该论文发表在了ECCV2018上,引用量超过1400。 开源代码地址:https://github.com/ycszen/TorchSeg 1.动机 语义分割任务,即为图片的每个像素分配一个标签&#…

嵌入式 程序调试之gdb+gdbserver+vscode可视化调试

嵌入式 程序调试之gdbgdbservervscode可视化调试 一、简述 记--使用过visual studio的都知道,它的单步调试真的好用,可以直接在源码下断点,实时查看内存变量、寄存器等相关信息。嵌入式linux开发多用的是gdb, 都是命令行执行的,毕…

python特殊数据类型应用(1)字典类型

目录python中特殊数据类型应用(1)字典类型字典类型定义字典类型注意事项字典类型的访问python中特殊数据类型应用(1)字典类型 python作为最流行的几种开发语言之一,在数据类型上和传统的c、c和java等有很大的不同&…

Typora使用方法

自用,有错误请谅解 tpora破解版使用学习使用: 链接:https://pan.baidu.com/s/1Wj46k3iVIzr-7kwQstp9nQ 提取码:2sa8 来源教程网址:Typora一款 Markdown 编辑器和阅读器 记得更改图片位置,以后就是相对路径…

babel及其使用

什么是Babel? Babel 是一个工具链,由大量的工具包组成,接下来我们逐步了解。主要用于将 ECMAScript 2015 版本的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中。 核心库 babel/core B…

‘this’不能用于常量表达式错误(C++)【问题解决】

目录 一、报错问题 1、代码 test.h test.cpp 2、问题描述 二、网上解决思路 三、解决方案 【元旦快乐🌹,新年快乐🎉】 最近在编译程序时出现了“ ‘this’不能用于常量表达式错误(C )”的报错问题,查阅多位博主写的文章后&…

mysql 性能优化

mysql 调优可以从这个四个方面来看 1.性能监控 1.1 show profile for query n 查看具体的sql语句各阶段执行时间 show profiles; show profile for query n; 1.2 performance schema 监控mysql 整个服务器中发生的各种事件。 performance schema 表中的数据不会持久化的磁…

一文搞定垃圾回收的三色标记法

我们之前介绍了各种常见垃圾回收器的基本原理,本小节我们讨论一个更深入的问题——垃圾回收器的底层是如何做的。 在并发标记的过程中,因为标记期间应用线程还在继续跑,对象间的引用可能发生变化,多标和漏标的情况就有可能发生。…

计算机视觉(CV)领域Transformer最新论文及资源整理分享

Transformer由论文《Attention is All You Need》提出,现在是谷歌云TPU推荐的参考模型。Transformer模型最早是用于机器翻译任务,当时达到了SOTA效果。Transformer改进了RNN最被人诟病的训练慢的缺点,利用self-attention机制实现快速并行。并…

梯度,GD梯度下降,SGD随机梯度下降

前言 羊了,但是依旧生龙活虎。补补之前落下的SGD算法,这个在深度学习中应用广泛。 梯度(Gradient) 方向导数 在梯度之前,非常重要一个概念:方向导数,这里uuu是nnn维向量,代表一个…

EMNLP 22:Bi-Directional Iterative Prompt-Tuning for Event Argument Extraction

总结 文中的前向和后向的思想可以借鉴下。 但总的来看,似乎是通过前向和后向来做的ensemble操作,虽然是在一个模型下,但同时前向和后向概率保证,可能能够使得预测更准确。 任务形式:event argument extraction (EAE)…

Java 读取resources下的文件+读取resource文件/路径

Java 读取resources下的文件 文档来源 三种实现方式 pom.xml <!-- commons-io io的工具包 --> <dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency>…

SSM之Spring(二)

目录 2.3 基于注解管理bean 2.3.1 标记与扫描 2.3.2 基于注解的自动装配 三&#xff1a;AOP 3.1 场景模拟 3.1.1 声明接口 3.1.2 创建实现类 3.1.3 创建带日志功能的实现类 3.1.4 提出问题 3.2 代理模式 3.2.1 概念 3.2.2 静态代理 3.2.3 动态代理 3.2.4 测试 3.3 AO…

ElasticSearch笔记

ELASTICSEARCH笔记 1、安装elastic search dokcer中安装elastic search &#xff08;1&#xff09;下载ealastic search和kibana docker pull elasticsearch:7.6.2 docker pull kibana:7.6.2&#xff08;2&#xff09;配置 mkdir -p /mydata/elasticsearch/config 创建目…