一. CSV的简介
csv文件格式是一种通用的电子表格和数据库导入导出格式。最近我调用RPC处理服务器数据时,经常需要将数据做个存档便使用了这一方便的格式。
python中有一个读写csv文件的包,直接import csv即可。利用这个python包可以很方便对csv文件进行操作,一些简单的用法如下。
1. 写入文件
import csv
ll = [[1, 2, 3, 4],
[1, 2, 3, 4],
[5, 6, 7, 8],
[5, 6, 7, 8]]
# newline='' 指定数据新行是一个空字符串, 不然会有数据空行
with open('example1.csv', 'w', newline='') as csvfile:
"""
delimiter: 分割符
"""
spamwriter = csv.writer(csvfile, delimiter=',')
for l in ll:
spamwriter.writerow([1, 2, 3, 4])
可能遇到的问题:直接使用这种写法会导致文件每一行后面会多一个空行。使用 newline='' 解决
2. 读取文件
import csv
with open('example.csv', encoding='utf-8') as f:
csv_reader = csv.reader(f)
for row in csv_reader:
print(row)
默认的情况下, 读和写使用逗号做分隔符(delimiter),当遇到特殊情况是,可以根据需要手动指定字符, 例如:
with open('example.csv', encoding='utf-8') as f:
reader = csv.reader(f, delimiter=',')
for row in reader:
print(row)
有点需要注意的是,当用writer写数据时, None 会被写成空字符串,浮点类型会被调用 repr() 方法转化成字符串。所以非字符串类型的数据会被 str() 成字符串存储。所以当涉及到 unicode 字符串时,可以自己手动编码后存储或者使用csv提供的 UnicodeWriter 。
3. 写入与读取字典
csv 还提供了一种类似于字典方式的读写
class csv.DictReader(csvfile, fieldnames=None, restkey=None, restval=None,
dialect='excel', *args, **kwds)
class csv.DictWriter(csvfile, fieldnames, restval='', extrasaction='raise',
dialect='excel', *args, **kwds)
其中 fieldnames 指定字典的 key 值,如果 reader 里没有指定那么默认第一行的元素,在 writer 里一定要指定这个。
写
# %% 写
import csv
with open('names.csv', 'w') as csvfile:
fieldnames = ['first_name', 'last_name']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({
'first_name': 'Baked', 'last_name': 'Beans'})
writer.writerow({
'first_name': 'Lovely'})
writer.writerow({
'first_name': 'Wonderful', 'last_name': 'Spam'})
读
# %% 读
import csv
with open('names.csv', newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
print(row['first_name'], row['last_name'])
二. 列表和字典的写入
1. 列表
# 不是完整的代码,只有保存的部分
with open('猫眼-列表.csv', mode='a', encoding='utf-8', newline='') as f:
csv_write = csv.writer(f)
# csv_write.writerow(['电影名字', '主演', '上映时间', '评分']) # 用csv模块写入
f.write("电影名字,主演,上映时间,评分\n") # 用普通文本写表头
for div in divs:
title = div.css('.title::text').get()
actors = div.css('.actors::text').get()
date = div.css('.date::text').get()
number = div.css('.number::text').get()
print(title, actors, date, number)
csv_write.writerow([title, actors, date, number])
2. 字典
import csv # 内置
list_dict = [{
'first_name': 'Baked', 'last_name': 'Beans'},
{
'first_name': 'Lovely'},
{
'first_name': 'Wonderful', 'last_name': 'Spam'}]
with open('data.csv', mode='a', encoding='utf-8', newline='') as f:
# 创建一个字典数据写入对象, 第一个参数是文件对象, 第二个参数是字典中的键
# fieldnames 指定字典的键, 不能多不能少不能错
csv_write = csv.DictWriter(f, fieldnames=['first_name', 'last_name'])
# 字典数据会有专门写表头的方法
csv_write.writeheader()
for i in list_dict:
csv_write.writerow(i)