数据存储和JSON,CSV

写在前面

文件储存的形式多种多样,最直接的就是已文本的形式保存在本地,如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 》

内容有所改动

原文地址:https://www.cnblogs.com/lc-snail/p/13279849.html