程序中的数据默认是保存在运行内存中的,保存在运行内存中的数据,在程序运行结束后,会被自动销毁。保存在硬盘、磁盘中的数据在程序结束后不会销毁。
数据持久化就是将数据以文件为单位保存在硬盘中。
- 常见数据持久化的工具
- 数据库文件(.db .sqlite .plist .json .txt)
- Excel文件;
-
打开文件:
open(文件路径, 打开方式, encoding=文件编码方式)
with open(文件路径, 打开方式)
-
文件路径:字符串,确定需要打开的是哪个文件
- 绝对路径:从系统根目录开始,写文件在计算机中的全路径。
- 相对路径:用 . 表示当前目录,用 … 表示当前目录的上层目录。
-
打开方式:字符串;给打开方式赋值的时候需要再两组值中每一组选一个组合。
-
决定打开文件读写权限;‘r’ 只读,‘w’ 只写,并清空原文件,‘a’ 只写,并在文件结尾追加
-
决定读写的数据类型是字符串还是二进制(默认是’t’);‘b’ 二进制 ,‘t’ 字符串
如果以只读方式打开不存在的文件程序会报错,如果以只写方式打开不存在的文件程序自动创建不存在的文件
-
-
encoding 文本文件的编码方式
如果是带b方式打开的文件,都不能给encoding赋值。
如果打开文件的时候设置的编码方式和文件本身的编码方式不同,就会报编码错误。常用的编码方式是 ‘utf-8’ 。
-
-
操作文件:
-
读:文件对象.read()
文件对象.seek(0)
文件对象.readline()
-
写:文件对象.write(内容)
-
-
关闭文件:文件对象.close()
-
数据持久化的方法
- 确定需要持久化的数据
- 创建文件保存数据(确定需要持久化的数据的初始值)
- 程序中需要数据的时候从文件中读数据
- 数据如果发生改变,要将最新的数据写入到文件中
-
print的特别用法:创建文件将数据写入指定文件中。
with open('文件名.文件类型', 'wt/b') as file: print(数据, file=file)注:
- 根据数据类型的不同选择不同的文件类型;
- 根据数据类型选择 ‘t’ 或 ‘b’;
- 当数据不是字符串或者二进制时需要进行转化。
# 将100以内的素数输出到一个文件中 def is_prime(num: int) -> bool: ''' 判断一个正整数是不是一个质数 :param num: 正整数 :return: 质数返回Ture,否则返回False ''' for i in range(2, int(num ** 0.5) + 1): if num % i == 0: return False return True with open('prime.txt', 'w') as file: for n in range(2, 100): if is_prime(n): print(str(n), file=file)
-
序列化:把一个对象(字典、列表等)变成字符串(string)或字节串(bytes)
-
json模块:Javascript Objective Notation ,Javascript语言创建对象的字面量语法
因为是纯文本,所以这种数据格式非常适合在两个系统(尤其是异构系统)之间传输数据,所以现在更多的时候是把它当做一种数据交换格式。
语法:
# 写法1 json.dumps(变量) # 写法2 json.dump(变量, fp=文件名)
import json person = { 'name': '骆昊', 'age': 41, 'sex': True, 'friends': ['赵云', '马超', '辛弃疾'], 'car': { 'brand': 'QQ', 'max_speed': 120 } } with open('person.txt', 'w') as file: file.write(json.dumps(person)) # ----> 写法1 print(json.dumps(person), file=file) # ----> 写法2 json.dump(person, fp=file) # ---> 写法3注:dumps只能将数据转换成字符串,dump在转换的同时能够写入文件
-
pickle模块:序列化时将对象转化成字节串(二进制),只有Python能读出
import pickle with open('person.bat', 'wb') as file: pickle.dump(person, file=file) -
反序列化:从字符串或字节串中还原出一个对象(字典、列表等)
-
json反序列化
import json with open('person.txt', 'r') as file: # 写法一: content = file.read() obj = json.loads(content) # 写法二: obj = json.load(fp=file) print(obj) -
pickle反序列化
import pickle with open('person.bat', 'rb') as file: obj = pickle.load(file=file) print(obj)
-
URL:统一资源定位符,能够唯一标识一个(网络)资源的符号
写法:协议://用户名:口令@域名或IP地址:端口/路径1/路径2/资源名称
-
URI:统一资源标识符
-
pip:包管理工具
Python中三方库操作:
- 查找三方库:pip search 库名
- 安装三方库:pip install 库名
- 卸载三方库:pip uninstall 库名
- 更新三方库:pip install -u 库名
-
网络协议:通过网络进行通信的双方要遵守的规范和标准
-
HTTP(S):超文本传输协议
-
联网获取数据语法
import requests 变量 = requests.get(url=域名, params={需要的参数})# 通过聚合数据api接口获取数据 # 输入星座、日期,获得星座运势 consName = input('请输入星座:') day = input('输入日期:') fortune = requests.get(url='http://web.juhe.cn/constellation/getAll', params={'consName': consName, 'type': day, 'key': '30084c5a4a5099bc270e3c1e7008d948' } ) print(fortune.text) with open('fortune.text', 'wb') as file: file.write(fortune.content)
-
openpyxl三方库可以创建一个Excel工作簿,并通过相应函数将数据写入工作簿中。
语法:
import openpyxl # 创建一个Excel工作簿 workbook = openpyxl.Workbook() # 获取默认的工作表 sheet = workbook.active # 添加表头 sheet.append(('数据名1', '数据名2', '数据名3', '数据名4'. ...)) # 添加列信息 sheet.append((数据1, 数据2, 数据3, 数据4, ...)) # 在指定行、列添加数据 sheet.cell(行数, 列数, 数据) # 保存工作簿 workbook.save('工作簿名.xlsx')# 通过天行数据获取今日头条新闻数据100条,保存到文件中 import requests # 调用requests模块 import openpyxl # 调用openpyxl模块 from datetime import datetime # 调用datetime模块 # 创建工作表,并添加表头 news = openpyxl.Workbook() sheet = news.active sheet.append(('title', 'url', 'source')) # 通过api接口获取今日头条新闻数据100条 for page in range(1, 6): resp = requests.get(url='https://api.tianapi.com/topnews/index', params={ 'key': 'e8c5524dd2a365f20908ced735f8e480', 'page': 1, 'num': 20 } ) # 将获取的数据持久化 print(resp.text) with open('resp.text', 'wb') as file: file.write(resp.content) result = resp.json() # 将数据保存到工作表 for new_dict in result['newslist']: title, url, source = new_dict['title'], new_dict['url'], new_dict['source'] sheet.append((title, url, source))



