python基础语法 - 文件操作
1.数据持久化(数据本地化)
程序中的数据默认是保存在运行内存中的,保存在运行内存中的数据,在程序运行结束后,会被自动销毁。保存在硬盘、磁盘中的数据在程序结束后不会销毁。
数据持久化就是将数据以文件为单位保存在硬盘中。
- 常见数据持久化的工具
- 数据库文件(.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)
2.对象的序列化与反序列化
-
序列化:把一个对象(字典、列表等)变成字符串(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)
3.联网获取数据
-
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)
4.创建工作簿保存数据方法
-
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))
5.Excel读写操作
-
读取Excel文件
openpyxl不仅可以将数据写入Excel,同时还能读取Excel,同时还支持数据透视和插入图标。
- 加载工作簿:openpyxl.load_workbook(文件名)
- 获取工作表名字:变量.sheetnames
- 获取工作表:变量1 = 变量2.worksheet[0]
- 获得单元格的范围:变量.dimensions
- 获取行数:变量.max_row
- 获取列数:变量.max_column
- 获取指定单元格的值:
- 变量.cell(行数, 列数).value
- 变量[‘A1’].value
- 获取多个单元格(嵌套元组):变量[‘A1 : B2’]
-
调整样式和插入图表
-
调整样式:在Python中可以直接通过对单元格对象(cell对象)的属性进行操作,包括字体(font)、对齐(alignment)、边框(border)等
- 对齐方式:alignment = Alignment(horizontal = ‘对齐方式’, vertical = ‘对齐方式’)
- 边框线条:side = Side(color = ‘边框颜色’, style = ‘边框类型’)
-
插入图表
通过 openpyxl 库,可以直接向Excel中插⼊统计图表,具体的做法跟在Excel中插⼊图表⼤体⼀致。我们可以创建 指定类型的图表对象,然后通过该对象的属性对图表进⾏设置。当然,最为重要的是为图表绑定数据,即横轴代表 什么,纵轴代表什么,具体的数值是多少。最后,可以将图表对象添加到表单中
from openpyxl import Workbook from openpyxl.chart import BarChart, Reference wb = Workbook(write_only=True) sheet = wb.create_sheet() rows = [ ('类别', '销售A组', '销售B组'), ('⼿机', 40, 30), ('平板', 50, 60), ('笔记本', 80, 70), ('外围设备', 20, 10), ] # 向表单中添加⾏ for row in rows: sheet.append(row) # 创建图表对象 chart = BarChart() chart.type = 'col' chart.style = 10 # 设置图表的标题 chart.title = '销售统计图' # 设置图表纵轴的标题 chart.y_axis.title = '销量' # 设置图表横轴的标题 chart.x_axis.title = '商品类别' # 设置数据的范围 data = Reference(sheet, min_col=2, min_row=1, max_row=5, max_col=3) # 设置分类的范围 cats = Reference(sheet, min_col=1, min_row=2, max_row=5) # 给图表添加数据 chart.add_data(data, titles_from_data=True) # 给图表设置分类 chart.set_categories(cats) chart.shape = 4 # 将图表添加到表单指定的单元格中 sheet.add_chart(chart, 'A10') wb.save('demo.xlsx')
-
5. 读取CSV文件
在三方库openpyxl中,只需要调用csv就能够读取CSV文件
import csv
with open('resources/2018年北京积分落户数据.csv', 'r', encoding='UTF-8-sig') as file:
reader = csv.reader(file)
for line in reader:
print(type(line))
print(line)
# 读取CSV文件将读取内容写入Excel文件并保存
# 写导入的时候,标准库放上面,三方库放下面,按照首字母排序;自己写的模块放最后
from openpyxl.styles import Font, Alignment
workbook = openpyxl.Workbook() # 创建工作簿
sheet = workbook.active # 获取第一张工作表
sheet.title = '2018年数据' # 修改工作表名称
with open('resources/2018年北京积分落户数据.csv', 'r', encoding='UTF-8-sig') as file:
reader = csv.reader(file)
for line in reader:
sheet.append(line)
sheet.row_dimensions[1].height = 40
sheet.cell(1, 1).font = Font(name='微软雅黑', size=32, bold=True, color='0000ff') # 修改字体、字号、颜色
sheet.cell(1, 1).alignment = Alignment(horizontal='center', vertical='center') # 居中对齐
cols_width = {
'A': 30,
'B': 50,
'C': 60,
'D': 180,
'E': 20,
}
for key in cols_width:
sheet.column_dimensions[key].width = cols_width[key] # 设置列宽
workbook.save('2018年北京积分落户数据.xlsx')