• 爬虫—文件存储—CSV存储


    一,简介  

        CSV,全称Comma—Separated Values,可以称为逗号分隔或者字符分隔值,其文件以纯文本形式存储表格数据。该文件是一个字符序列,可以有任意的数目记录组成,记录间已某种换行符分隔。每条记录由字段组成,字段间的分隔符是其他字符或字符串,最常见的是逗号或制表符。相比EXcel更加简洁,就是特定字符分隔的纯文本。

    二,写入CSV文件

      1.简单的例子:

    import csv
    
    with open('data.csv', 'w') as f:
        writer = csv.writer(f)
        writer.writerow(['id', 'name', 'age'])
        writer.writerow(['1', 'rain', '20'])
        writer.writerow(['2', 'godric', '22'])
        writer.writerow(['3', 'tony', '25'])

      运行结束后会生成一个data.csv的文件,此时数据就成功写入了。直接以文本形式打开,会显示如下内容:

    id,name,age
    
    1,rain,20
    
    2,godric,22
    
    3,tony,25

      可以看到写入的文本默认以逗号分隔,调用一次writer()方法就会写入一行数据。使用Excel打开:

      

      如果想要修改列与列之间的分隔符,使用delimiter参数:  

    # 修改分隔符
    with open('data.csv', 'w') as f:
        writer = csv.writer(f, delimiter="-")
        writer.writerow(['id', 'name', 'age'])
        writer.writerow(['1', 'rain', '20'])
        writer.writerow(['2', 'godric', '22'])
        writer.writerow(['3', 'tony', '25'])

      使用纯文本格式打开:

    id-name-age
    
    1-rain-20
    
    2-godric-22
    
    3-tony-25

      另外,writer()方法也可以多行写入,其结果是一样的:

    writer.writerow(['1', 'rain', '20'],['2', 'rain', '20'],['3', 'rain', '20'])

      2.写入字典

        但是一般情况下,爬虫爬取的都是结构化数据,我们一般会用字典来表示。csv中的字典写入方式:

    # 字典写入
    with open('data.csv', 'w') as f:
        field_name = ['id', 'name', 'age']
        writer = csv.DictWriter(f, fieldnames=field_name)
        writer.writeheader()
        writer.writerow({'id': '1', 'name': 'rain', 'age': '20'})
        writer.writerow({'id': '2', 'name': 'godric', 'age': '22'})
        writer.writerow({'id': '3', 'name': 'tony', 'age': '25'})

      这里先定义3个字段,使用field_name来表示,然后将其传给DictWriter来初始化一个字典写入对象,再使用writeheader()方法写入头信息,最后调用writerow()方法写入字典即可。结果和上面的一样。

      3.追加内容

        如果想要在文件后面追加内容,将open()函数的第二个参数改为a即可:

    # 追加
    with open('data.csv', 'a') as f:
        field_name = ['id', 'name', 'age']
        writer = csv.DictWriter(f, fieldnames=field_name)
        writer.writeheader()
        writer.writerow({'id': '4', 'name': 'thor', 'age': '1000'})

        结果如下:

    id,name,age
    
    1,rain,20
    
    2,godric,22
    
    3,tony,25
    
    id,name,age
    
    4,thor,1000

      4.写入中文

        如果需要写入中文信息,此时要指定编码格式,否则可能会发生编码错误。

    # 中文需要指定编码
    with open('data.csv', 'a', encoding='utf-8') as f:
        field_name = ['id', 'name', 'age']
        writer = csv.DictWriter(f, fieldnames=field_name)
        writer.writeheader()
        writer.writerow({'id': '5', 'name': '王翔', 'age': '22'})

        结果如下:

    id,name,age
    
    1,rain,20
    
    2,godric,22
    
    3,tony,25
    
    id,name,age
    
    4,thor,1000
    
    id,name,age
    
    5,王翔,22

      5.去除空行

        在写入文件的时候会像上面出现多余的空行,这时候可以在open()函数内添加,一个参数来去掉多余的空行newline='',以字典写入为例:

    with open('data.csv', 'w', newline='') as f:
        field_name = ['id', 'name', 'age']
        writer = csv.DictWriter(f, fieldnames=field_name)
        writer.writeheader()
        writer.writerow({'id': '1', 'name': 'rain', 'age': '20'})
        writer.writerow({'id': '2', 'name': 'godric', 'age': '22'})
        writer.writerow({'id': '3', 'name': 'tony', 'age': '25'})

      结果:

    ['id', 'name', 'age']
    ['1', 'rain', '20']
    ['2', 'godric', '22']
    ['3', 'tony', '25']

    二,读取文件

      同样适用csv来读取文件。读取刚才写入的文件:

    # 文件读取
    with open('data.csv', 'r', encoding='utf-8') as f:
        reader = csv.reader(f)
        for row in reader:
            print(row)

      读取结果:

    ['id', 'name', 'age']
    ['1', 'rain', '20']
    ['2', 'godric', '22']
    ['3', 'tony', '25']

      这里我们构造了Reader对象,通过遍历输出了每一行内容,每一方都是一个列表形式。如果内容包含中文,需要指定编码。

      此外,还可以使用pandas读取文件:

    import pandas as pd
    
    data = pd.read_csv('data.csv')
    print(data)

      结果:

       id    name  age
    0   1    rain   20
    1   2  godric   22
    2   3    tony   25

      使用pandas可以快捷的读取csv文件内容,数据分析时使用此方法较多。

  • 相关阅读:
    多线程编程
    Phthon环境搭建
    网站开发语言方案的选择
    NSTimer的一个误区
    一个tableview的自带动画
    一个扇形的动画效果
    一点两个uiview动画切换的体会
    关于gcd一些自己的理解。
    使用到定时器,单例和协议的一个小应用(2 )
    使用到定时器,单例和协议的一个小应用(1)
  • 原文地址:https://www.cnblogs.com/zivli/p/10902574.html
Copyright © 2020-2023  润新知