【Python爬虫学习笔记7】CSV文件存储

CSV文件简介

CSV(Comma-Separated Values,逗号分隔值),是一种纯文本形式存储表格数据的文件。该文件由任意数目的记录组成,每条记录被分隔符分隔为字段(最常见的分隔符是逗号或制表符),且每条记录都有相同的字段序列,因此csv相当于一个结构化表的纯文本形式。从直观上看,它比Excel文件更加简洁,然而它不包含诸如XLS电子表格的数值、公式和格式等内容,它仅仅为一个结构化的纯文本。

如下图分别为csv文本打开方式和Excel打开方式的内容,其第0行为记录标题,而后的若干行为所记录的数据:

image_thumb1

image_thumb4

CSV文件读取和写入

在CSV文件读写操作中,常用两种读写方式是列表读写和字典读写,下面我们分别来对此进行介绍。

1.文件读取

csv文件读取主要是使用reader()和DictReader()方法,二者均接收一个csv文件参数,并返回一个用于文件读取迭代器。这两个方法的区别是:reader()方法获取的是一行行列表数据的迭代器,每行的数据可通过下标来获取,而DictReader()方法获取的是一行行字典数据的迭代器,每行的数据可通过键来获取。

##CSV文件读取的两种方式
import csv

# 列表读取
with open('data.csv', 'r') as fp:
    reader = csv.reader(fp)   #返回读取迭代器
    titles = next(reader)     #提取出文件记录标题
    print(type(titles))       #<class 'list'>
    print(titles)             #['id', 'name', 'city']
    for x in reader:          #遍历向下迭代
        print(x)              #['001', 'Mike', 'Beijing']...
        id = x[0]
        name = x[1]
        city = x[2]
        print({'id': id, 'name': name, 'city': city})    #{'id': '001', 'name': 'Mike', 'city': 'Beijing'}

# 字典读取
with open('data.csv', 'r') as fp:
    reader = csv.DictReader(fp)     #迭代器,但不包含标题数据(第0行)
    for x in reader:
        print(type(x))              #<class 'collections.OrderedDict'>
        print(x)                    #OrderedDict([('id', '001'), ('name', 'Mike'), ('city', 'Beijing')])...
        id = x['id']
        name = x['name']
        city = x['city']
        print({'id': id, 'name': name, 'city': city})    #{'id': '001', 'name': 'Mike', 'city': 'Beijing'}

2.文件写入

同文件读取一样,文件的写入也有两种方法——writer()和DictWriter(),其含义和reader()/DictReader()相类似,writer()用于列表数据写入,而DictWriter()用于字典数据写入。二者使用方法也比较简单,但需要注意的是由于是写入文件,需要指明文件的编码方式(特别是需要写入中文字符时),具体的用法如下所示。

##CSV文件写入的两种方式
import csv

# 列表写入
# 设置记录标题(列表)和记录值(一个嵌套元组集或列表集的列表)
headers = ['id','name','province']
values = [
    ('001','ShenZhen','GuangDong'),
    ('002', 'WuHan', 'HuBei'),
    ('003', 'ChengDu', 'SiChuan')
]
# 使用open函数时设置参数encoding以防止乱码
with open('citylist.csv','w',encoding='utf-8',newline='') as fp:
    writer = csv.writer(fp)    #获取文件“写笔”
    writer.writerow(headers)   #写入一行记录
    writer.writerows(values)   #写入多行记录,传入的参数为列表结构

# 字典写入
# 设置记录标题(列表)和记录值(一个嵌套字典集的列表)
headers = ['id', 'name', 'province']
values = [
    {'id': '001', 'name': 'ShenZhen', 'province': 'GuangDong'},
    {'id': '002', 'name': 'WuHan', 'province': 'HuBei'},
    {'id': '003', 'name': 'ChengDu', 'province': 'SiChuan'}
]
with open('citydict.csv', 'w', encoding='utf-8', newline='') as fp:
    writer = csv.DictWriter(fp,headers)    #获取文件“写笔”,注意参数还需传递记录标题以映射,注意此时并不会真正写入标题
    writer.writeheader()                   #写入记录标题
    writer.writerows(values)               #写入多行记录

在打开待写入CSV文件时,这里我们还传入了一个newline参数,并且其值为空字符串,这么做是为了防止在每次写完一行后其会自动再写入一个换行符,如下图为设置和不设置newline的文件写入对应结果:

设置了newline的文件写入结果:

“””

id,name,province

001,ShenZhen,GuangDong

002,WuHan,HuBei

003,ChengDu,SiChuan

“””

未设置newline的文件写入结果:

“””

id,name,province

 

001,ShenZhen,GuangDong

 

002,WuHan,HuBei

 

003,ChengDu,SiChuan

 

“””

 


以上便是关于CSV文件的简单介绍和基本的读写方法,在读写方法中又含有列表和字典两种类型的读写方式,而具体使用哪一种方式就需要我们根据实际拟存储的数据类型来进行选择了。

posted @ 2018-09-23 10:05  ChanKaion  阅读(3942)  评论(0编辑  收藏  举报