前言:
当前我们对“python存储json文件”大致比较注重,朋友们都想要剖析一些“python存储json文件”的相关内容。那么小编也在网摘上汇集了一些关于“python存储json文件””的相关文章,希望大家能喜欢,朋友们一起来学习一下吧!我们从网络上抽取的数据信息,总不能一直在控制台上打印吧!那样就没有任何意义了,我们需要把数据持久化并将其充分利用起来。所以存在哪里就是本章的主题,存储方式也是多种多样,存储介质可以选择本地或远程服务器,存储方式也是有很多种,下列就是一些常见的存储数据的方式。
一、JSON 文件存储
JSON,全称为 JavaScript Object Notation, 也就是 JavaScript 对象标记,它通过对象和数组的组合来表示数据,构造简洁但是结构化程度非常高,是一种轻量级的数据交换格式。本节中,我们就来了解如何利用 Python 保存数据到 JSON 文件。
1. 对象和数组
在 JavaScript 语言中,一切都是对象。因此,任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等,但是对象和数组是比较特殊且常用的两种类型,下面简要介绍一下它们。
对象:
它在 JavaScript 中是使用花括号 {} 包裹起来的内容,数据结构为 {key1:value1, key2:value2, ...} 的键值对结构。在面向对象的语言中,key 为对象的属性,value 为对应的值。键名可以使用整数和字符串来表示。值的类型可以是任意类型。
数组:
数组在 JavaScript 中是方括号 [] 包裹起来的内容,数据结构为 ["java", "javascript", "vb", ...] 的索引结构。在 JavaScript 中,数组是一种比较特殊的数据类型,它也可以像对象那样使用键值对,但还是索引用得多。同样,值的类型可以是任意类型。
所以,一个 JSON 对象可以写为如下形式:
[{ "name": "张三", "gender": "female", "birthday": "1993/02/04"}, { "name": "莉丝", "gender": "male", "birthday": "1994/10/24"}]
由中括号包围的就相当于列表类型,列表中的每个元素可以是任意类型,这个示例中它是字典类型,由大括号包围。
JSON 可以由以上两种形式自由组合而成,可以无限次嵌套,结构清晰,是数据交换的极佳方式。
2. 数据写入规范
借助python内置模块json来实现对象与json字符串的相互转化:
json.dumps() 是将 python 对象转化为 json。
json.loads() 是将 json 转化为 python 对象。
通过json和with open实现数据的文件保存,为了输出中文,还需要指定参数 ensure_ascii 为 False,另外还要规定文件输出的编码:
import json data = [{ 'name': '小a', 'gender': '男', 'birthday': '1992/10/18' }]with open('data.json', 'w', encoding='utf-8') as file: file.write(json.dumps(data, indent=2, ensure_ascii=False))
二、CSV 文件存储
CSV,全称为 Comma-Separated Values,中文可以叫作逗号分隔值或字符分隔值,其文件以纯文本形式存储表格数据。该文件是一个字符序列,可以由任意数目的记录组成,记录间以某种换行符分隔。每条记录由字段组成,字段间的分隔符是其他字符或字符串,最常见的是逗号或制表符。不过所有记录都有完全相同的字段序列,相当于一个结构化表的纯文本形式。它比 Excel 文件更加简洁,XLS 文本是电子表格,它包含了文本、数值、公式和格式等内容,而 CSV 中不包含这些内容,就是特定字符分隔的纯文本,结构简单清晰。所以,有时候用 CSV 来保存数据是比较方便的。本节中,我们来讲解 Python 读取和写入 CSV 文件的过程。
1. 写入
这里先看一个最简单的例子:
import csvwith open('data.csv', 'w') as csvfile: writer = csv.writer(csvfile) writer.writerow(['id', 'name', 'age']) writer.writerow(['10001', 'Mike', 20]) writer.writerow(['10002', 'Bob', 22]) writer.writerow(['10003', 'Jordan', 21])
首先,打开 data.csv 文件,然后指定打开的模式为 w(即写入),获得文件句柄,随后调用 csv 库的 writer 方法初始化写入对象,传入该句柄,然后调用 writerow 方法传入每行的数据即可完成写入。
如果想修改列与列之间的分隔符,可以传入 delimiter 参数,其代码如下:
import csvwith open('data.csv', 'w') as csvfile: writer = csv.writer(csvfile, delimiter=' ') writer.writerow(['id', 'name', 'age']) writer.writerow(['10001', 'Mike', 20]) writer.writerow(['10002', 'Bob', 22]) writer.writerow(['10003', 'Jordan', 21])
2.多行写入
调用 writerows 方法同时写入多行,此时参数就需要为二维列表,例如:
import csvwith open('data.csv', 'w') as csvfile: writer = csv.writer(csvfile) writer.writerow(['id', 'name', 'age']) writer.writerows([['10001', 'Mike', 20], ['10002', 'Bob', 22], ['10003', 'Jordan', 21]])
3.字典写入
用字典来表示。在 csv 库中也提供了字典的写入方式,示例如下:
import csvwith open('data.csv', 'w') as csvfile: fieldnames = ['id', 'name', 'age'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() writer.writerow({'id': '10001', 'name': 'Mike', 'age': 20}) writer.writerow({'id': '10002', 'name': 'Bob', 'age': 22}) writer.writerow({'id': '10003', 'name': 'Jordan', 'age': 21})
4. 采集入库
import httpximport csvres = httpx.get(';cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=python&pageIndex=2&pageSize=10&language=zh-cn&area=cn')# 数据变字典格式items = res.json()item = items.get('Data')['Posts'] # 列表形式data = []for i in item: title = i.get('RecruitPostName'), times = i.get('LastUpdateTime'), data.append([title[0],times[0]])with open('data2.csv', 'w',encoding='utf-8') as csvfile: writer = csv.writer(csvfile) writer.writerow(['id', 'name']) writer.writerows(data)
三、关系型数据库存储
关系型数据库是基于关系模型的数据库,而关系模型是通过二维表来保存的,所以它的存储方式就是行列组成的表,每一列是一个字段,每一行是一条记录。表可以看作某个实体的集合,而实体之间存在联系,这就需要表与表之间的关联关系来体现,如主键外键的关联关系。多个表组成一个数据库,也就是关系型数据库。
关系型数据库有多种,如 SQLite、MySQL、Oracle、SQL Server、DB2 等。
1. 准备工作
在开始之前,请确保已经安装好了 MySQL 数据库并保证它能正常运行,而且需要安装好pymsql库。如果没有安装找班主任老师拿包
官方下载地址:
pip安装
pip install pymsql
2. 连接数据库
首先连接数据库。假设当前的 MySQL 运行在本地,用户名为 root,密码为 123456,运行端口为 3306。这里利用 PyMySQL 先连接 MySQL,然后创建一个新的数据库,名字叫作 demo,代码如下:
import pymysql db = pymysql.connect(host='localhost',user='root', password='123456', port=3306) cursor = db.cursor() # 游标cursor.execute('SELECT VERSION()') data = cursor.fetchone() print('Database version:', data) cursor.execute("CREATE DATABASE demo DEFAULT CHARACTER SET utf8") db.close()
3. 创建数据表
import pymysql db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='demo')cursor = db.cursor()sql = 'CREATE TABLE IF NOT EXISTS students (id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, age INT NOT NULL, PRIMARY KEY (id))'cursor.execute(sql)db.close()
4.插入数据
插入、更新和删除操作都是对数据库进行更改的操作,而更改操作都必须为一个事务,所以这些操作的标准写法就是:
import pymysqlid = '145664'user = '小安'age = 23db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='spiders')cursor = db.cursor()# %s 动态传参sql = 'INSERT INTO students(id, name, age) values(% s, % s, % s)'try: cursor.execute(sql, (id, user, age)) db.commit()except: db.rollback()db.close()
5. 字典数据插入
data = { 'id':'145664', 'name': '小安', 'age': 23}keys = ', '.join(data.keys())values = ', '.join(['% s'] * len(data))sql = 'INSERT INTO students({keys}) VALUES ({values})'.format( keys=keys, values=values)try: if cursor.execute(sql, tuple(data.values())): print('Successful') db.commit()except: print('Failed') db.rollback()db.close()
6. 数据采集入库
import requestsimport pymysqldef conn_myqsl(): db = pymysql.connect(host='localhost',user='root', password='', port=3306, db='demo') cursor = db.cursor() return db,cursordef get_data(): url = '; # 请求体的数据 for i in range(1,9): data = { "column": "szse_gem_latest", "pageNum": str(i), "pageSize": "30", "sortName": "", "sortType": "", "clusterFlag": "true" } # 可有不传 具体看网站 res = requests.post(url=url,data=data) if res.status_code == 200: items = res.json().get('classifiedAnnouncements') for ite in items: announcementTitle = ite[0].get('announcementTitle') secName = ite[0].get('secName') save_data([announcementTitle,secName])def save_data(data): print(data) # 列表 1个列表 一条数据 db,cursor = conn_myqsl() try: sql = 'insert into xx(title,secName) values (%s, %s)' cursor.execute(sql,(data[0],data[1])) db.commit() except Exception as e: print(e) db.rollback()
四、非关系型数据库存储
1. MongoDB简介
MongoDB 是由 C++ 语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似 JSON 对象,它的字段值可以包含其他文档、数组及文档数组,非常灵活。
mongo官方下载地址:
2. 连接 MongoDB
连接 MongoDB 时,我们需要使用 PyMongo 库里面的 MongoClient。一般来说,传入 MongoDB 的 IP 及端口即可,其中第一个参数为地址 host,第二个参数为端口 port(如果不给它传递参数,默认是 27017)
import pymongoclient = pymongo.MongoClient(host='localhost', port=27017)
3. 指定数据库和表
db = client.testcollection = db['students'] # 都可以
4. 插入数据
插入数据。对于 students 这个集合,新建一条学生数据,这条数据以字典形式表示:
student = { 'id': '2667544', 'name': 'mark', 'age': 20, 'gender': 'male'}result = collection.insert(student)插入多条数据
student1 = { 'id': '2667544', 'name': 'mark', 'age': 20, 'gender': 'male'}student2 = { 'id': '20170202', 'name': 'Mike', 'age': 21, 'gender': 'male'}result = collection.insert([student1, student2])print(result)
5. 数据采集入库
import pymongoclient = pymongo.MongoClient(host='localhost', port=27017)db = client.testcollection = db['students']import httpxdef get_data(): res = httpx.get(';cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=python&pageIndex=2&pageSize=10&language=zh-cn&area=cn') items = res.json() item = items.get('Data')['Posts'] for i in item: if isinstance(i,dict): collection.insert_one(i)get_data()
结语
最体贴的是你的鞋子,不要嫌它脏,那是因为你走的路不干净。
标签: #python存储json文件 #oracle字段去换行符 #oracle11gem启动 #python 存储列表 #python读取url中保存的文件