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数据,抓包是最直接也是最常见的手段,常用的抓包 ...
随机推荐
- zabbix监控大数据
参考: https://github.com/Staroon/zabbix-hadoop-template 支持监控HDFS.NameNode, YARN ResourceManager, Hive, ...
- springboot - 应用实践(N)使用springboot内置的@Scheduled
1.springboot开箱即用,内置调度任务的使用. 建一个简单的springboot工程,pom.xml: <?xml version="1.0" encoding=&q ...
- 洛谷 P3834 卢卡斯定理 题解
题面 首先你需要知道这条定理: C(n,m)=C(n%p,m%p)*C(n/p,m/p); 这样可以递归实现: 注意坑点:是C(n+m,m),并不是C(n,m); #include <bits/ ...
- P1216数字三角形
这是USACO的一道记忆化搜索题,还记得原来学搜索就是被此所困. 给定n深的数,第i层有i个节点,存储有一个数字,询问从第一层走到最后一层所经过节点上数字和的最大值.我们很容易想到枚举所有路径来计算最 ...
- noip2013day1-货车运输
题目描述 \(A\)国有\(n\)座城市,编号从 \(1\)到\(n\),城市之间有 \(m\) 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 \(q\) 辆货车在运输货物, 司机们想知 ...
- [LeetCode] 227. 基本计算器 II
题目链接: https://leetcode-cn.com/problems/basic-calculator-ii 难度:中等 通过率:33.2% 题目描述: 实现一个基本的计算器来计算一个简单的字 ...
- 模板 - 强连通分量 - Kosaraju
Kosaraju算法 O(n+m) vector<int> s; void dfs1(int u) { vis[u] = true; for (int v : g[u]) if (!vis ...
- JavaEE--EL表达式
EL(Expression Language)是为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,使得用户对 ...
- vim学习(二)之模式
vim模式 基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode). 命令模式: 用户刚刚启 ...
- 《一头扎进》系列之Python+Selenium自动化测试框架实战篇6 - 价值好几K的框架,呦!这个框架还真牛叉哦!!!
1. 简介 本文开始介绍如何通过unittest来管理和执行测试用例,这一篇主要是介绍unittest下addTest()方法来加载测试用例到测试套件中去.用addTest()方法来加载我们测试用例到 ...