python操作csv格式文件之csv.DictReader()方法
作者:booze-J 发布时间:2021-03-04 18:10:04
简单使用csv.DictReader()方法
示例代码1:
import csv
f = open('sample','r',encoding='utf8')
reader = csv.DictReader(f)
print(reader) # <csv.DictReader object at 0x000002241D730FD0>
for line in reader: # reader为了方便理解我们可以把它看成是一个列表嵌套OrderedDict(一种长相类似于列表的数据类型)
print(line) # OrderedDict([('id', '1'), ('name', 'jason'), ('age', '18')])
sample为一个txt文件,文件内容如下:
id,name,age
1,jason,18
2,jian,20
3,xiaoming,30
4,dog,40
代码运行在终端输出的结果为:
<csv.DictReader object at 0x000001FCF6FA0FD0> # 来自于示例代码1中的print(reader)
OrderedDict([('id', '1'), ('name', 'jason'), ('age', '18')]) # 来自于示例代码1中的print(line)
1 jason 18 # 来自于示例代码1中的print(line['id'],line['name'],line['age'])
OrderedDict([('id', '2'), ('name', 'jian'), ('age', '20')])
2 jian 20
OrderedDict([('id', '3'), ('name', 'xiaoming'), ('age', '30')])
3 xiaoming 30
OrderedDict([('id', '4'), ('name', 'dog'), ('age', '40')])
4 dog 40
OrderedDict是一种长相类似于列表的数据类型,该列表中嵌套着元组例:line = OrderedDict([('id', '1'), ('name', 'jason'), ('age', '18')]),每个元组中的第一个元素为键,第二个元素为值(类似于字典),每个元组中的键是哪里来的呢?==默认情况下(可以自己设置的)==csv.DictReader()读到的第一行数据就是键。并且可以通过索引的方法来取出OrderedDict数据中的值print(line['id'],line['name'],line['age']) # 可以通过键进行索引取值(类似于字典)。
使用csv.DictReader()之fieldnames参数
在reader = csv.DictReader(f,fieldnames=['new_id','new_name','new_age'])中添加参数fieldnames=['new_id','new_name','new_age']用来指定键。
示例代码2:
import csv
f = open('sample','r',encoding='utf8')
# 通过fieldnames参数指定字段
reader = csv.DictReader(f,fieldnames=['new_id','new_name','new_age'])
head_row = next(reader) # next()方法用于移动指针
print(reader) # <csv.DictReader object at 0x000002241D730FD0>
for line in reader: # reader为了方便理解我们可以把它看成是一个列表嵌套OrderedDict(一种长相类似于列表的数据类型)
print(line) # OrderedDict([('new_id', '2'), ('new_name', 'jian'), ('new_age', '20')])
# 通过指定的字段进行索引取值并打印输出
print(line['new_id'],line['new_name'],line['new_age']) # 可以通过键进行索引取值(类似于字典)
next()方法用于移动指针,示例代码2中的head_row = next(reader)获取的是第一行数据存储在head_row中,执行一次next()指针移动一行,此时指针已经移动到了第二行开头,再次读数据的时候,就从第二行开始读取。如果不执行head_row = next(reader)则输出中还会多出这样的结果OrderedDict([('new_id', 'id'), ('new_name', 'name'), ('new_age', 'age')])第一行数据也被算在了其中。
代码运行在终端输出的结果为:
<csv.DictReader object at 0x000001D329CF2080> # 来自于示例代码2的print(reader)
OrderedDict([('new_id', '1'), ('new_name', 'jason'), ('new_age', '18')]) # 来自于示例代码2的print(line)
1 jason 18 # 来自于示例代码2的print(line['new_id'],line['new_name'],line['new_age'])
OrderedDict([('new_id', '2'), ('new_name', 'jian'), ('new_age', '20')])
2 jian 20
OrderedDict([('new_id', '3'), ('new_name', 'xiaoming'), ('new_age', '30')])
3 xiaoming 30
OrderedDict([('new_id', '4'), ('new_name', 'dog'), ('new_age', '40')])
4 dog 40
使用csv.DictReader()之restkey参数
如果读取的行具有比键名序列更多的值,此时则会将剩余的数据作为值添加到restkey中的键下面。此时我们修改sample文件多添加一列数据。
在reader = csv.DictReader(f,fieldnames=['new_id','new_name','new_age'],restkey='hobby')中添加restkey='hobby'用来指定接收多余值的键,并且要注意restkey只能传入一个值,不能传入列表,元组数据类型。
sample为一个txt文件,文件内容如下:
id,name,age
1,jason,18,dbj
2,jian,20,lol
3,xiaoming,30,game
4,dog,40,noting
示例代码3:
import csv
f = open('sample','r',encoding='utf8')
# 通过fieldnames参数指定字段,超出fieldnames中键数量的值,用restkey中的键来接收
reader = csv.DictReader(f,fieldnames=['new_id','new_name','new_age'],restkey='hobby')
head_row = next(reader) # next用于移动指针
print(reader) # <csv.DictReader object at 0x000002241D730FD0>
for line in reader: # reader为了方便理解我们可以把它看成是一个列表嵌套OrderedDict(一种长相类似于列表的数据类型)
print(line) # OrderedDict([('new_id', '2'), ('new_name', 'jian'), ('new_age', '20')])
# 通过指定的字段进行索引取值并打印输出
print(line['new_id'],line['new_name'],line['new_age'],line['hobby']) # 可以通过键进行索引取值(类似于字典)
代码运行在终端输出的结果为:
<csv.DictReader object at 0x000001CB6B6030F0> # 来自于示例代码3的print(reader)
OrderedDict([('new_id', '1'), ('new_name', 'jason'), ('new_age', '18'), ('hobby', ['dbj'])]) # 来自于示例代码3的print(line)
1 jason 18 # 来自于示例代码3的print(line['new_id'],line['new_name'],line['new_age'])
OrderedDict([('new_id', '2'), ('new_name', 'jian'), ('new_age', '20'), ('hobby', ['lol'])])
2 jian 20
OrderedDict([('new_id', '3'), ('new_name', 'xiaoming'), ('new_age', '30'), ('hobby', ['game'])])
3 xiaoming 30
OrderedDict([('new_id', '4'), ('new_name', 'dog'), ('new_age', '40'), ('hobby', ['noting'])])
4 dog 40
从代码运行结果中我们会发现多出来的值,确实使用restkey指定的键restkey='hobby'来接收了OrderedDict([('new_id', '1'), ('new_name', 'jason'), ('new_age', '18'), ('hobby', ['dbj'])])
注意虽然多余的键可以用restkey指定的键接收,但是却无法通过索引打印出来,也就是执行print(line["hobby"])的话就会报错KeyError: 'hobby'。
使用csv.DictReader()之restval参数
如果读取的行具有比键名序列更少的值,此时剩余的键则会使用可选参数restval中的值。此时我们修改sample文件多添加一列数据。
在reader = csv.DictReader(f,fieldnames=['new_id','new_name','new_age','hobby'],restval='others')中添加restval='others'用来指定键对应值为空时的默认值,并且要注意restval也只能传入一个值,不能传入列表,元组数据类型。
sample为一个txt文件,文件内容如下:
id,name,age
1,jason,18
2,jian,20,lol
3,xiaoming,30
4,dog,40,noting
示例代码4:
import csv
f = open('sample','r',encoding='utf8')
# 通过fieldnames参数指定字段,超出fieldnames中键数量的值,用restkey中的键来接收
reader = csv.DictReader(f,fieldnames=['new_id','new_name','new_age','hobby'],restval='others')
head_row = next(reader) # next用于移动指针
# print(reader) # <csv.DictReader object at 0x000002241D730FD0>
for line in reader: # reader为了方便理解我们可以把它看成是一个列表嵌套OrderedDict(一种长相类似于列表的数据类型)
print(line) # OrderedDict([('new_id', '1'), ('new_name', 'jason'), ('new_age', '18'), ('hobby', 'others')])
# 通过指定的字段进行索引取值并打印输出
print(line['new_id'],line['new_name'],line['new_age'],line['hobby']) # 可以通过键进行索引取值(类似于字典)
代码运行在终端输出的结果为:
OrderedDict([('new_id', '1'), ('new_name', 'jason'), ('new_age', '18'), ('hobby', 'others')]) # 来自于示例代码4的print(line)
1 jason 18 others # 来自于示例代码4的print(line['new_id'],line['new_name'],line['new_age'],line['hobby'])
OrderedDict([('new_id', '2'), ('new_name', 'jian'), ('new_age', '20'), ('hobby', 'lol')])
2 jian 20 lol
OrderedDict([('new_id', '3'), ('new_name', 'xiaoming'), ('new_age', '30'), ('hobby', 'others')])3 xiaoming 30 others
OrderedDict([('new_id', '4'), ('new_name', 'dog'), ('new_age', '40'), ('hobby', 'noting')])
4 dog 40 noting
来源:https://blog.csdn.net/booze_/article/details/121525660


猜你喜欢
- 以发布目录为例:<OBJECT ID="agobjOraSession" RUNAT=&quo
- 一、前言 英语单词之间是通过空格分隔的,但是中文却不存在空格的概念,因此需要
- 安装包网盘下载链接:链接: https://pan.baidu.com/s/1TLLeCnNkHtuTiAxHBl39hg 提取码: 9yg
- 连接 Redisimport redisc连接方式:redis提供了2个方法1:StrictRedis:实现大部分官方的命令2:Redis:
- 配置如下TEMPLATES = [下面'context_processors': [中添加'django.core.
- 本文研究的主要问题时Python读取word文本操作,分享了相关概念和实现代码,具体如下。一,docx模块Python可以利用python-
- 如下所示:# -*- coding=utf-8 -*- import urllib2import socketimport timeurls
- 已知有一个XML文件(bookstore.xml)如下:<?xml version="1.0" encoding=
- # 写在前面,这篇文章的原创作者是Charles我只是在他这个程序的基础上边进行加工,另外有一些自己的改造# 并都附上了注释和我自己的理解,
- 1、按位取反bitwise_not()按位取反就是将数值根据每个bit位1变0,0变1,比如0xf0按位取反就变成了0x0f,如果是uint
- 本文实例为大家分享了python多线程http压力测试的具体代码,供大家参考,具体内容如下#coding=utf-8import sysim
- 360搜索引擎自动收录功能,官方提供了代码,带式,十分坑爹,没有提供批量提交入口,只是提供了一段js代码,关键是 一个js去下载另外一个js
- 前言最近发现一个问题,在一次爬虫实战中,需要将字典加入列表中,意外的情况出现了!!!下面简单分析一下出现的状况:list = []dic =
- 普通爬虫正常流程:数据来源分析发送请求获取数据解析数据保存数据环境介绍python 3.8pycharm 2021专业版【付费VIP完整版】
- PyQt5中QInputDialog的使用,Qt的QInputDialog类提供了一种简单方面的对话框来获得用户的单个输入信息,它提供了4种
- 这里是WMP的版本ClassID,从WMP7后ID就成了clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6
- 在现实的图像操作软件中,经常碰到的不是给出放大多少倍,而是由用户在软件的界面上选择多大的区域,或者选择几个点,那么这样情况下,怎么样来计算出
- 本文实例讲述了Python3.5实现的 * 菜单功能。分享给大家供大家参考,具体如下:程序: * 菜单要求:
- 系列目录:1. 服务器XMLHTTP(Server XMLHTTP in ASP)基础2. 
- 为什么使用Python 假设我们有这么一项任务:简单测试局域网中的电脑是否连通.这些电脑的ip范围从19