Python爬虫3.2 — csv用法教程

综述

本系列文档用于对Python爬虫技术的学习进行简单的教程讲解,巩固自己技术知识的同时,万一一不小心又正好对你有用那就更好了。
Python 版本是3.7.4

上一篇文章讲了怎么用json格式保存数据,这一篇我们来看看如何用csv模块进行数据读写。

csv 介绍

什么是csv

CSV(Comma Separated Values),即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号),是一种常用的文本格式,用来存储表格数据,包括数字或者字符。

csv的使用很广泛,很多程序都会涉及到csv的使用,但是 csv却没有通用的标准,所以在处理csv格式时常常会碰到麻烦。因此在使用csv时一定要遵循某一个标准,这不是固定的,但每个人都应该有一套自己的标准,这样在使用csv时才不会犯低级错误。

csv库的使用

csv库和json库一样也是Python的一个标准库,不需要安装就能使用。关于csv库的使用,也是从写和读两个方面来讲,csv库有四个主要的方法分别是:

  • csv.reader()读取csv文件中数据
  • csv.DictReader()创建一个像常规阅读器一样操作的对象,但将读取的信息映射到一个dict
  • csv.writer()将数据写入csv文件
  • csv.DictWriter()创建一个像常规编写器一样操作的对象,但将字典映射到输出行

reader()读操作

reader(iterable, dialect='excel', *args, **kwargs)

返回一个reader对象,它将迭代给定csvfile中的行。

iterable可以是任何支持迭代器协议的对象,并在每次next()调用其方法时返回一个字符串-文件对象和列表对象都是合适的。如果csvfile是一个文件对象,那么它必须在平台上以“r”标志打开。可以给出可选的dialect参数,该参数用于定义特定于CSV方言的一组参数。如果想修改列与列之间的分隔符,可以传入delimiter参数。其他可选的args可以给出关键字参数来覆盖当前方言中的各个格式参数。使用示例代码如下:

    # 引入csv库
    import csv
    
    # 以读的方式打开order.csv文件
    with open('order.csv', 'r') as csv_reader:
        reader = csv.reader(csv_reader)
        # 如果不想获取标题,则使用next()函数从下一行开始获取数据
        next(reader)
        for row in reader:
            print(row)
            # 可以根据下标进行获取指定列数据
            # print(row[2])

DictReader()读操作

class csv.DictReader(f,fieldnames = None,restkey = None,restval = None,dialect ='excel'* args,** kwds)

这是另一种读操作,创建一个像常规阅读器一样操作的对象,但将读取的信息映射到一个dict,其键由可选的fieldnames参数给出。字段名的参数是一个序列,其元素与输入数据的顺序中的字段相关联。这些元素成为结果字典的关键。如果省略fieldnames参数,则文件f的第一行中的值将用作字段名。如果读取的行包含的字段多于字段名序列,则将剩余数据添加为由restkey值键入的序列。如果读取的行的字段数少于字段名序列,则其余的键将采用可选的restval参数的值。任何其他可选或关键字参数都将传递给基础reader实例。使用示例代码如下:

    # 引入csv库
    import csv
    
    # 以读的方式打开order.csv文件
    with open('order.csv', 'r') as csv_reader:
        reader = csv.DictReader(csv_reader, fieldnames=['order_no', 'user_name'])
        for row in reader:
            print(row)
            # print(row['order_no'])

writer()写操作

writer(fileobj, dialect='excel', *args, **kwargs)

返回一个编写器对象,负责将用户的数据转换为给定的类文件对象上的分隔字符串。fileobj可以是带有write()方法的任何对象。如果fileobj是一个文件对象,那么它必须在平台上以“b”标志打开,这会产生影响。可以给出可选的dialect参数,该参数用于定义特定于CSV方言的一组参数。使用示例代码如下:

    # 引入csv库
    import csv
    
    # 声明定义头
    header = ['username', 'age', 'height']
    # 声明定义一个列表
    lt = [
        ('张三', 25, 180),
        ('李四', 26, 172),
        ('王五', 27, 183)
    ]
    
    # 设置编码方式为utf8,新行为空字符串,否则默认为\n
    with open('user.csv', 'w', encoding='utf-8', newline='') as fp:
        writer = csv.writer(fp)
        # 写入单行
        writer.writerow(header)
        # 写入多行
        writer.writerows(lt)

DictWriter()写操作

class csv.DictWriter(f,fieldnames,restval ='',extrasaction ='raise',dialect ='excel'* args,** kwds)

创建一个像常规编写器一样操作的对象,但将字典映射到输出行。fieldnames字段名的参数是一个序列识别在哪些值在传递给字典中的顺序按键的writerow()方法被写入到文件f。如果字典缺少字段名中的键,则可选的restval参数指定要写入的值。如果传递给方法的字典包含在字段名中找不到的键,则可选的extrasaction参数指示要采取的操作。使用示例代码如下:

    # 引入csv库
    import csv
    
    with open('user.csv', 'w', encoding='utf-8', newline='') as fp:
        # 声明定义头
        header = ['username', 'age', 'height']
        # 声明定义一个列表,里面是对象
        lt = [
            {'username': '张三', 'age': 26, 'height': 183},
            {'username': '李四', 'age': 24, 'height': 180},
            {'username': '王五', 'age': 23, 'height': 189},
        ]
        writer = csv.DictWriter(fp, header)
        # 写入表头数据的时候,需要掉用writeheader方法
        writer.writeheader()
        writer.writerows(lt)

总结

使用csv库的注意事项:

  1. 打开文件时要注意模式,读用r,写用w
  2. 打开文件时要设置newline=''(空字符);
  3. 打开文件时要指定编码打开,写入时也一样;
  4. 如果设置过分隔符就要一直保持,读写时的分隔符必须一致;
  5. csv不会检查格式(虽然有个strict模式,但strict模式下也不会对格式进行检查),写入文件时一定要注意格式。

以上就是 csv库的使用方法和注意事项。

其他博文链接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章