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

标签:python,操作,csv,格式,文件,csv.DictReader
0
投稿

猜你喜欢

  • Python创建二维数组实例(关于list的一个小坑)

    2021-04-29 19:28:13
  • Pandas中DataFrame对象转置(交换行列)

    2023-06-11 05:01:45
  • Go本地测试小技巧解耦任务拆解

    2023-08-29 14:09:26
  • sql server中千万数量级分页存储过程代码

    2024-01-18 04:36:20
  • python实现高斯投影正反算方式

    2022-11-17 08:58:19
  • Django程序的优化技巧

    2023-11-10 00:29:24
  • python爬取豆瓣电影排行榜(requests)的示例代码

    2022-10-16 02:18:46
  • 在 Python 中如何将天数添加到日期

    2023-02-09 03:34:30
  • Python判断文件和文件夹是否存在的方法(最新推荐)

    2022-06-08 02:53:32
  • SQL 实现某时间段的统计业务

    2024-01-24 11:41:03
  • 将mater库中的系统存储过程批量生成*.sql文件 通用且非常实用

    2012-06-06 20:03:43
  • Numpy中转置transpose、T和swapaxes的实例讲解

    2022-09-04 21:11:10
  • Python利用pywin32库实现将PPT导出为高清图片

    2023-10-01 22:59:45
  • Python自动化办公之图片转PDF的实现

    2023-07-24 21:29:07
  • Python __getattr__与__setattr__使用方法

    2021-10-17 09:17:53
  • jQuery 1.4新特性及其变化(上)

    2010-01-18 16:33:00
  • Pycharm安装第三方库时Non-zero exit code错误解决办法

    2023-03-15 12:15:01
  • Jupyter安装链接aconda实现过程图解

    2022-02-04 21:33:57
  • Tkinter组件实现Radiobutton的示例

    2022-08-01 00:23:24
  • 用Pygal绘制直方图代码示例

    2023-12-15 22:41:01
  • asp之家 网络编程 m.aspxhome.com