python爬虫系列之数据的存储(二):csv库的使用
上一篇我们讲了怎么用 json格式保存数据,这一篇我们来看看如何用 csv模块进行数据读写。
一、csv简介
CSV (Comma Separated Values),即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号),是一种常用的文本格式,用来存储表格数据,包括数字或者字符。
csv的使用很广泛,很多程序都会涉及到 csv的使用,但是 csv却没有通用的标准,所以在处理csv格式时常常会碰到麻烦。
因此在使用 csv时一定要遵循某一个标准,这不是固定的,但每个人都应该有一套自己的标准,这样在使用 csv时才不会犯低级错误。
二、csv库的使用
关于 csv库的使用,我们从写和读两个方面来讲。
csv库有四个主要的类 writer,DictWriter,reader,DictReader
reader和 DictReader都接受一个可以逐行迭代的对象作为参数,一般是一个包含 csv格式数据的文件对象。
writer和 DictWriter则接受一个 csv文件对象,csv格式的数据将会写入到这个文件中。
他们都会返回一个对应的对象,我们通过这个对象来进行数据的读和写。
这四者中 reader和 writer对应,DictReader和 DictWriter对应,也就是说通过 writer类写的 csv文件只能通过 reader类来读取,DictReader同理。
1、csv将数据写入文件
#-*- coding: utf-8 -*
import csv
#通过 writer类写入数据
#待写入的数据 注意到两个列表的元素个数不一样
test_writer_data_1 = ['Tom', 'Cody', 'Zack']
test_writer_data_2 = ['Mike', 'Bill']
#创建并打开文件
with open('test_writer.csv', 'w', newline='', encoding='utf-8') as csvfile:
#获得 writer对象 delimiter是分隔符 默认为 ","
writer = csv.writer(csvfile, delimiter=' ')
#调用 writer的 writerow方法将 test_writer_data写入 test_writer.csv文件
writer.writerow(test_writer_data_1)
writer.writerow(test_writer_data_2)
#通过 DictWriter类写入数据
#待写入的数据 注意到待写入的数据类型为 dict 且第二个字典没有 lastname
test_dict_writer_data_1 = {'firstname': 'Tom', 'lastname': 'Loya'}
test_dict_writer_data_2 = {'firstname': 'Tom', 'lastname': 'Loya'}
#创建并打开文件
with open('test_dict_writer.csv', 'w', newline='', encoding='utf-8') as csvfile:
#设置表头
fieldnames=['firstname', 'lastname']
# 获得 DictWriter对象 delimiter是分隔符 默认为 "," 表头为 'firstname' 'lastname'
dict_writer = csv.DictWriter(csvfile, delimiter=' ', fieldnames=fieldnames)
#第一次写入数据先写入表头
dict_writer.writeheader()
#调用 DictWriter的 writerow方法将 test_dict_writer_data写入 test_dict_writer.csv文件
dict_writer.writerow(test_dict_writer_data_1)
dict_writer.writerow(test_dict_writer_data_2)
前面讲到,csv没有统一的标准,通过上面的例子我们可以发现,csv对写入的数据不做任何检查,也就是说几乎没有任何标准可言。
我们发现 writerow方法不会对数据进行检查,即使前后两句 writerow语句写入的数据的格式不同也不会报错。
所以在用 csv写入数据时要特别注意数据的格式问题!!!
也可以用 writerows(list) 一次写入多行,例如:
with open('test_writer.csv', 'w', newline='', encoding='utf-8') as csvfile:
#获得 writer对象 delimiter是分隔符 默认为 ","
writer = csv.writer(csvfile, delimiter=' ')
#调用 writer的 writerows方法将 test_writer_data写入 test_writer.csv文件
writer.writerows([test_writer_data_1, test_writer_data_2])
with open('test_dict_writer.csv', 'w', newline='', encoding='utf-8') as csvfile:
#设置表头
fieldnames=['firstname', 'lastname']
# 获得 DictWriter对象 delimiter是分隔符 默认为 "," 表头为 'firstname' 'lastname'
dict_writer = csv.DictWriter(csvfile, delimiter=' ', fieldnames=fieldnames)
#第一次写入数据先写入表头
dict_writer.writeheader()
#调用 DictWriter的 writerows方法将 test_dict_writer_data写入 test_dict_writer.csv文件
dict_writer.writerows([test_dict_writer_data_1, test_dict_writer_data_2])
2、csv从文件读取数据
#-*- coding: utf-8 -*
import csv
#通过 reader读取文件内容 注意到之前我们设置了 delimiter为空格,这里也要继续设置为空格
with open('test_writer.csv', 'r', newline='', encoding='utf-8') as csvfile:
reader = csv.reader(csvfile, delimiter=' ')
for row in reader:
print(row)
with open('test_dict_writer.csv', 'r', newline='', encoding='utf-8') as csvfile:
dict_reader = csv.DictReader(csvfile, delimiter=' ')
for row in dict_reader:
print(row)
打印结果:
观察打印出的结果我们发现,reader读取的内容打印出来后还是列表格式,而 DictReader读取的内容却变为了列表加元组的格式,显然和我们刚开时传入的字典格式很不同。
而我们总是希望输入和输出能够一致,但是 csv模块并没有提供这样的方法,所以我们需要自己将 csv模块再进行一次封装,封装后的包应该满足下面的标准:
- 统一的分隔符 delimiter
- 统一的编码
- 统一的打开文件的方式
- 能够自己判断文件是否存在并且选择合适的方式打开文件
- 输入格式和输出格式保持一致
- 强制检查格式,格式错误禁止插入并报错
封装后的包的源码会在完成后贴出( ̄▽ ̄)"
最后让我们来总结一下使用 csv库的注意事项:
- 打开文件时要 注意模式 读用 r,写用 w
- 打开文件时要设置 newline=''(空字符)
- 打开文件时要指定编码打开,写入时也一样
- 如果设置过分隔符就要一直保持,读写时的分隔符必须一致
- csv不会检查格式(虽然有个 strict模式,但 strict模式下也不会对格式进行检查),写入文件时一定要注意格式
作者:渔父歌
链接:https://www.jianshu.com/p/51211fcdf4b8
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
python爬虫系列之数据的存储(二):csv库的使用的更多相关文章
- $python爬虫系列(2)—— requests和BeautifulSoup库的基本用法
本文主要介绍python爬虫的两大利器:requests和BeautifulSoup库的基本用法. 1. 安装requests和BeautifulSoup库 可以通过3种方式安装: easy_inst ...
- python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(1)
一.数据类型及解析方式 一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值.内容一般分为两部分,非结构化的数据 和 结构化的数据. 非结构化数据:先有数据,再有结构, 结构化数 ...
- python爬虫26 | 把数据爬取下来之后就存储到你的MySQL数据库。
小帅b说过 在这几篇中会着重说说将爬取下来的数据进行存储 上次我们说了一种 csv 的存储方式 这次主要来说说怎么将爬取下来的数据保存到 MySQL 数据库 接下来就是 学习python的正确姿势 真 ...
- Python "爬虫"出发前的装备之二数据先行( Requests 模块)
1. 概念 爬虫不是动物,而是一种计算机程序. 这种程序有自己特定的功能,能按照使用者给定的一系列规则自行浏览万维网并获取需要的信息.此类程序被称为 网络爬虫(web crawler) 或 网络蜘蛛( ...
- python爬虫系列之爬京东手机数据
python抓京东手机数据 作者:vpoet mail:vpoet_sir@163.com #coding=utf-8 import urllib2 from lxml import etree im ...
- Python爬虫之三种数据解析方式
一.引入 二.回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需 ...
- python爬虫解析页面数据的三种方式
re模块 re.S表示匹配单行 re.M表示匹配多行 使用re模块提取图片url,下载所有糗事百科中的图片 普通版 import requests import re import os if not ...
- python爬虫系列:Scrapy安装与使用
这篇博文主要写Scrapy框架的安装与使用 Scrapy框架安装 命令行进入C:\Anaconda2\Scripts目录,运行:conda install Scrapy 创建Scrapy项目 1)进入 ...
- python爬虫——抖音数据
最近挺火的抖音短视频,不仅带火了一众主播,连不少做电商的也进驻其中,于是今天我来扒一扒这火的不要不要的抖音数据: 一.抓包工具获取用户ID 对于手机app数据,抓包是最直接也是最常见的手段,常用的抓包 ...
随机推荐
- PTA 7-20 表达式转换
转自:https://www.cnblogs.com/yuxiaoba/p/8399934.html 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元 ...
- Oozie 3.3.1安装
软件安装路径 软件名称 版本 安装路径 jdk 1.6.0_12 /usr/java/jdk1.6.0_12 maven 3.1.0 /usr/local//apache-maven-3.1.0 Oo ...
- [转帖]小米手环采用RISC-V 指令集芯片
小米手环4或用“黄山一号”芯片,雷军再回前线,未来走向如何 静心科技 06-1111:19 忘记来源地址了 不过国内的很多东西都是有中国特色的 比如飞腾 比如麒麟(银河麒麟 还有华为的麒麟 980) ...
- Luogu P4147 玉蟾宫
题目 就是全0子矩阵. 先预处理每个点上面有多少个连续的0(包括自己). 然后我们枚举下边界(1-n). 我们开一个单调栈,记录一个上界递增的矩形集合. 如果我们扫到了一个比当前栈顶要矮的矩形,那么我 ...
- Nginx + Tomcat动静分离 (转)
什么是动静分离 为了提高网站的响应速度,减轻程序服务器(Tomcat,Jboss等)的负载,对于静态资源比如图片,js,css等文件,我们可以在反向代理服务器中进行缓存,这样浏览器在请求一个静态资源时 ...
- Fire Net HDU - 1045 (二分图匹配)
题意: 给出一张图,图中'X'表示wall,'.'表示空地,可以放置blockhouse同一条直线上只能有一个blockhouse,除非有wall 隔开,问在给出的图中最多能放置多少个blockhou ...
- 掌握 analyze API,一举搞定 Elasticsearch 分词难题
初次接触 Elasticsearch 的同学经常会遇到分词相关的难题,比如如下这些场景: 为什么明明有包含搜索关键词的文档,但结果里面就没有相关文档呢? 我存进去的文档到底被分成哪些词(term)了? ...
- 2-Elasticsearch原理
参考知乎大佬:https://zhuanlan.zhihu.com/p/62892586 一.倒排索引 倒排索引也叫反向索引,举个例子,理解一下.叫你背一首<静夜思>,立马可以背出,但是叫 ...
- 关于strcpy的安全函数的选择
1)如果整个程序,在进行字符拷贝时,这个拷贝字符串的完整性,不影响整个程 序的运行,可以让其截取一部分字符串,程序继续执行.那么我们就可以选择安全 函数:strncpy_s 2)如果在进行字符串拷贝时 ...
- Flask开发系列之模板
Flask开发系列之模板 本文对<FlaskWeb开发:基于python的Web应用开发实战>模板一节做的总结. Jinja2模板引擎 模板 模板是一个包含响应文本的文件,其中包含用占位变 ...