python - csv

CSV,全称为Comma-Separated Values,中文可以叫作逗号分隔值或字符分隔值,其文件以纯文本形式存储表格数据。该文件是一个字符序列,可以由任意数目的记录组成,记录间以某种换行符分隔。每条记录由字段组成,字段间的分隔符是其他字符或字符串,最常见的是逗号或制表符。不过所有记录都有完全相同的字段序列,相当于一个结构化表的纯文本形式。它比Excel文件更加简介,XLS文本是电子表格,它包含了文本、数值、公式和格式等内容,而CSV中不包含这些内容,就是特定字符分隔的纯文本,结构简单清晰。所以,有时候用CSV来保存数据是比较方便的。【引自崔庆才的《python3网络爬虫开发实战》】
我在使用爬虫进行数据 存储的时候,若不使用数据库,则更多的会选择csv。

现有test.csv,内容如下:

学号 姓名 性别 年龄
1 小明 11
2 小花 12
3 小李 13

一.读

import csv
 
with open('test.csv', 'r', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        print(row)

运行结果:

['学号', '姓名', '性别', '年龄']
['1', '小明', '男', '11']
['2', '小花', '女', '12']
['3', '小李', '男', '13']
  • 这里的encoding视文件的具体编码格式决定,不一定是utf-8;
  • 上面的reader为可迭代对象,也是迭代器,故若不要第一行列索引,可直接在for前面进行next(reader),迭代一次,从而没有第一行数据;
  • 可用isinstance()判断一个对象是否为某种类型,如下:
from collections import Iterable, Iterator
isinstance(对象, Iterable) 
isinstance(对象, Iterator)

二.写

1.列表

将数据写入形成如上的test.csv

import csv

with open('test.csv', 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['学号', '姓名', '性别', '年龄'])
    writer.writerow(['1', '小明', '男', '11'])
    writer.writerow(['2', '小花', '女', '12'])
    writer.writerow(['3', '小李', '男', '13'])

或使用writerows ,很明显writerow为一行一行地写入,writerows为多行一起写入:

import csv

row1 = ['学号', '姓名', '性别', '年龄']
row2 = ['1', '小明', '男', '11']
row3 = ['2', '小花', '女', '12']
row4 = ['3', '小李', '男', '13']
with open('test.csv', 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerows([row1, row2, row3, row4])

若csv文件出现隔行的情况,则需要加入参数newline=''

2.字典

import csv

headers = ['学号', '姓名', '性别', '年龄']
rows = [
        {'学号':1,'姓名':'小明','性别':'男','年龄':11},
        {'学号':2,'姓名':'小花','性别':'女','年龄':12},
        {'学号':3,'姓名':'小李','性别':'男','年龄':13},
    ]
with open('test.csv','w',newline='') as csvfile:
    writer= csv.DictWriter(csvfile,headers)
    writer.writeheader()
    writer.writerows(rows)
  • 写入csv中的数据可以为字符串也可以为其他数据类型,但读的时候会都转为字符串;
  • 若写入方式为'a'追加,则可以把 writer.writeheader() 去掉,否则会再次写入列索引,但无论w还是a,列索引headers 还是要定义的...

二.特别注意

csv说白了就是文本文件,所以不存在多个sheet的问题

【持续更新中,错误请指出,谢谢!!!】

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。