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数据,抓包是最直接也是最常见的手段,常用的抓包 ...
随机推荐
- 为应用创建多个独立python运行环境
在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.4.所有第三方的包都会被pip安装到Python3的site-packages目录下. 如果我们要同时开发多个应用程序,那这 ...
- CentOS 上面 恢复 Oracle 数据库实例的简单操作流程
1. 当获取了数据库的备份可以进行 oracle数据库的备份恢复操作 linux上面要复杂一些. 这里面简单描述一下. 2. 远程连接 linux 主要工具可以选择 xshell 如图示: 3. 建议 ...
- python 传址 与传值(暂时保存,后续做分类)
# python 传址 与 传值 # 定义一个函数 用于将 list 下标为2的数据加100 并进行打印 该list def test1(list): list[2]+=100 print(list) ...
- NameNode格式化后HBase创建新表提示旧表已存在:table already exists
1.问题出现: 在格式化NameNode后,集群上安装的OpenTSDB的表(存在hbase中)都没有了,重新运行OpenTSDB预创建表步骤报错显示table already exists 2.原因 ...
- HDU 1159 Common Subsequence 最长公共子序列
HDU 1159 Common Subsequence 最长公共子序列 题意 给你两个字符串,求出这两个字符串的最长公共子序列,这里的子序列不一定是连续的,只要满足前后关系就可以. 解题思路 这个当然 ...
- luogu P1758 [NOI2009]管道取珠
luogu 这个题中的平方有点东西,考虑他的组合意义,也就是做这个过程两次,如果两次得到的结果一样就给答案+1,所以可以考虑dp,设\(f_{i,j,k,l}\)表示第一个过程中上面取到的第\(i\) ...
- uoj #242【UR #16】破坏蛋糕
uoj 考虑把那最后一条直线拎出来,并且旋转到和\(y\)轴平行(其他直线同时一起旋转),然后它和其他直线相交形成\(n+1\)个区间,现在要知道这些区间是否处在一个面积有限的区域 可以发现一段在有限 ...
- Windows 下apache https配置(phpstudy)
1.首先获取证书,https://www.pianyissl.com/ 免费三个月的 或者 自己生成私钥.证书,然后应用到apache中. http://blog.sina.com.cn/s/blo ...
- VMware® Workstation 设置虚拟机目录和共享目录不要相同!
在设置VMware的首选项是,工作区中的虚拟机的默认地址和共享虚拟机的位置目录不要设置成一样的. 否则创建的虚拟机打不开.
- 清北学堂北京大学文宏宇神仙讲课day7
今天是最后一天 今天讲noip真题: ‘’ ‘’‘’ 课程终于还是上完了,收获比上一次多!