写在前面
文件储存的形式多种多样,最直接的就是已文本的形式保存在本地,如TXT,JSON,CSV等,也可以保存在数据库中,比如,MySQL,MongoDB,Redis等。
一.json文件储存
1.概念
JSON,全称为JavaScript Object Notation,也就是JavaScript对象标记,它通过对象和数组的结合来表示数据,构造简介,但是结构化程度非常高,是一种轻量级的数据交换格式。
数组和对象
在JavaScript中一切切是对象,任何支持的数据类型都可以用JSON来表示,例如字符串,数字,对象,数组等,其中对象和数组比较常用。
数组
数组在形式上是以一对中括号包裹起来 “[ ]”,元素之间用逗号隔开,在内容上,数组可以包含任意类型。
["name",1233,{"name":"张三"},[1,2,3]]
对象
对象在形式上用 一对大括号 " { }"括起来,元素之间用逗号隔开,内容上是以键值对的方式存在。
{
"name":"Bob",
"gender":"male",
"dirthday":"1992-10-18"
}
JSON
JSON可以由对象和数组任意嵌套,结构清晰。
[{
"name":"Bob",
"gender":"male",
"dirthday":"1992-10-18"
},{
"name":"Selina",
"gerder":"female",
"birthday":"1995-10-18"
}]
2.读取JSON
我们可以用JSON库的loads()方法将JSON文本字符串转为JSON对象,可以通过dumps()方法将JSON对象转为文本字符串。
转换字符串
import json
str = '''
[{
"name":"zhangsan",
"gerder":"male",
"birthday":"1998-05-12"
},{
"name":"lisi",
"gerder":"femal",
"birthday":"1995-10-18"
}]
'''
print(type(str))
data = json.loads(str)
print(type(data))
print(data)
#获取第一对象的name属性
print(data[0].get('name'))
'''
输出
<class 'str'>
<class 'list'> #因为最为层是中括号,所以最终的类型为list
[{'name': 'zhangsan', 'gerder': 'male', 'birthday': '1998-05-12'}, {'name': 'lisi', 'gerder': 'femal', 'birthday': '1995-10-18'}]
zhangsan
'''
注
JSON的数据需要用双引号来包裹,不能用单引号,否则loads()方法会解析错误。
import json
str = '''
[{
'name':'zhangsan',
'gerder':'male,
'birthday':'1998-05-12'
}]
'''
print(type(str))
data = json.loads(str)
读取本地JSON文件
import json
import os
with open("./josn.json",'r') as file:
str = file.read()
data = json.loads(str)
print(data)
"""
[{'name': 'zhangsan', 'gerder': 'male', 'birthday': '1998-05-12'}, {'name': 'lisi', 'gerder': 'femal', 'birthday': '1995-10-18'}]
"""
3.写入JSON
将JSON对象转换为字符串对象写入本地文件
import json
data = [{
"name":"zhangsan",
"gerder":"male",
"birthday":"1998-05-12"
},{
"name":"lisi",
"gerder":"femal",
"birthday":"1995-10-18"
}]
with open("./josn.json",'w') as file:
file.write(json.dumps(data))
注释
write()方法只能写入str类型的字符串,所以需要进行转换。
这样写入的json文件结构不清晰,而且写入的JSON文件中如果包含了中文字符的话,会出错。
解决
在进行写入的时候,指encoding 为 'utf-8'
给dumps()方法添加 indent参数(缩进)和ensure_ascii参数
import json
data = [{
"name":"张三",
"gerder":"male",
"birthday":"1998-05-12"
},{
"name":"李四",
"gerder":"femal",
"birthday":"1995-10-18"
}]
with open("./josn.json",'w',encoding='utf-8') as file:
file.write(json.dumps(data,indent=2,ensure_ascii=False,))
二.SVG文件储存
1.概念
SVG全称为 Comma-Separated Values ,中文可以叫作逗号分隔值或字符分隔值,其文件以纯文本形式存储表格数据。 该文件是一个字符序列,可以由任意数目的记录组成,记录之间以某种换行符分隔。 每条记录由字段组成,字段间的分隔符是其他字符或字符串,最常见的是逗号或制表符。 它比 Excel 文件更加简介, XLS文本是电子表格,它包含了文本、数值、公式和格式等内容,而 csv 中不包含这些内容,就是特定字符分隔的纯文本,结构简单清晰。
2.写入
以列表的形式写入
import csv
with open('data.csv','w',encoding='utf-8') as csvfile:
#初始化一个写入对象
writer = csv.writer(csvfile)
#写入表头
writer.writerow(['id','name','age'])
#写入单行
writer.writerow(['1','张三','18'])
writer.writerow(['2','李四','王二'])
#写入多行
writer.writerows([['3','王二','18'],['4','麻子','18']])
注释:
默认文本是以逗号分隔的,如果要修改,在初始化写入对象的时候,加入delimiter参数
import csv
with open('data.csv','w',encoding='utf-8') as csvfile:
#初始化一个写入对象
writer = csv.writer(csvfile,delimiter=" ")
#写入表头
writer.writerow(['id','name','age'])
#写入单行
writer.writerow(['1','张三','18'])
writer.writerow(['2','李四','王二'])
#写入多行
writer.writerows([['3','王二','18'],['4','麻子','18']])
以字典的形式写入
import csv
with open('data.csv','w',encoding='utf-8') as csvfile:
#定义表头数据
fieldnames = ['id','name','age']
#初始化一个字典写入对象
writer = csv.DictWriter(csvfile,fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'id':'1001','name':'mike','age':20})
writer.writerow({'id':'1002','name':'Jordan','age':20})
writer.writerow({'id':'1003','name':'Bob','age':20})
3.读取
import csv
with open('data.csv','r',encoding='utf-8') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
print(row)
输出
['id name age']
[]
['1 张三 18']
[]
['2 李四 王二']
[]
['3 王二 18']
[]
['4 麻子 18']
[]
问题
在每行数据之间都会产生一个空白的列表,这是因为在写入的时候,就产生了空白行,解决方法是在打开的时候添加参数,newline=''
import csv
with open('data.csv','w',encoding='utf-8',newline='') as csvfile:
#初始化一个写入对象
writer = csv.writer(csvfile,delimiter=" ")
#写入表头
writer.writerow(['id','name','age'])
#写入单行
writer.writerow(['1','张三','18'])
writer.writerow(['2','李四','王二'])
#写入多行
writer.writerows([['3','王二','18'],['4','麻子','18']])
重新读取输出
['id name age']
['1 张三 18']
['2 李四 王二']
['3 王二 18']
['4 麻子 18']
摘自《Python 3网络爬虫开发实战 ,崔庆才著 ,2018.04 》
内容有所改动