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数据,抓包是最直接也是最常见的手段,常用的抓包 ...
随机推荐
- 插座-网络问题-ESP8266
//ATK-ESP8266模块测试主函数,检查WIFI模块是否在线 void atk_8266_test(void) { ))//检查WIFI模块是否在线 { atk_8266_quit_trans( ...
- python生成饼图解决中文乱码
解决乱码问题 乱码的原因 字体的不匹配 解决的方法 加上引用中文字体就好了 matplotlib.rcParams['font.sans-serif'] = ['SimHei'] 代码 def sta ...
- adb 打印kernel输出的log
一. linux 内核printk机制 1.1. Android内核是基于Linxu kernel的,因此其log机制也是通用的,在Android内核中使用printk函数进行Log输出.与 ...
- Druid + spring 配置数据库连接池
1. Druid的简介 Druid是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBo ...
- WebDriverWait类以及类常用的方法
WebDriverWait类提供了显式等待和隐式等待,显式等待的等待时间是固定的,固定了10s就必须等待10s,隐式等待的等待时间是个范围,例如最大10s,那么如果在3s的时候程序达到预期的结果,那么 ...
- 17.AutoMapper 之配置(Configuration)
https://www.jianshu.com/p/031ff68797dd 配置(Configuration) 通过构造函数创建并初始化MapperConfiguration实例: config = ...
- C语言面试相关知识点
1.关键字static的作用是什么? 有三个明显的作用: 1)在函数体内,一个被声明为静态的变量在这个函数被调用过程中维持其值不变 2)在模块内(但在函数体外),静态的变量可以被模块内所有函数访问,但 ...
- 企业级开发账号In House ipa发布流程
这两天需要发布一个ipa放到网上供其他人安装,需要用到企业级开发者账号.在网上查了一下资料,感觉没有一个比较完善的流程,于是决定把整个流程写下来,供大家参考. 首先详细说明一下我们的目标,我们需要发布 ...
- 【c#】ADO操作Access的mdb数据库只能读不能修改的解决方法
在使用ACCESS数据库时连接字符串如 string strcon=@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\Access操作\简易 ...
- iptable防火墙原理
iptable防火墙原理 简介 Linux 2.0 ipfs/firewalld Linux 2.2 ipchain/firewall Linux 2.4 iptables/netfilter (ip ...