python基础语法 - 文件操作

python基础语法 - 文件操作

1.数据持久化(数据本地化)

程序中的数据默认是保存在运行内存中的,保存在运行内存中的数据,在程序运行结束后,会被自动销毁。保存在硬盘、磁盘中的数据在程序结束后不会销毁。

数据持久化就是将数据以文件为单位保存在硬盘中。

  • 常见数据持久化的工具
    1. 数据库文件(.db .sqlite .plist .json .txt)
    2. Excel文件;
  1. 打开文件:

    open(文件路径, 打开方式, encoding=文件编码方式)

    with open(文件路径, 打开方式)

    • 文件路径:字符串,确定需要打开的是哪个文件

      1. 绝对路径:从系统根目录开始,写文件在计算机中的全路径。
      2. 相对路径:用 . 表示当前目录,用 … 表示当前目录的上层目录。
    • 打开方式:字符串;给打开方式赋值的时候需要再两组值中每一组选一个组合。

      1. 决定打开文件读写权限;‘r’ 只读,‘w’ 只写,并清空原文件,‘a’ 只写,并在文件结尾追加

      2. 决定读写的数据类型是字符串还是二进制(默认是’t’);‘b’ 二进制 ,‘t’ 字符串

        如果以只读方式打开不存在的文件程序会报错,如果以只写方式打开不存在的文件程序自动创建不存在的文件

    • encoding 文本文件的编码方式

      如果是带b方式打开的文件,都不能给encoding赋值。

      如果打开文件的时候设置的编码方式和文件本身的编码方式不同,就会报编码错误。常用的编码方式是 ‘utf-8’ 。

  2. 操作文件:

    • 读:文件对象.read()

      ​ 文件对象.seek(0)

      ​ 文件对象.readline()

    • 写:文件对象.write(内容)

  3. 关闭文件:文件对象.close()

  4. 数据持久化的方法

    1. 确定需要持久化的数据
    2. 创建文件保存数据(确定需要持久化的数据的初始值)
    3. 程序中需要数据的时候从文件中读数据
    4. 数据如果发生改变,要将最新的数据写入到文件中
  5. print的特别用法:创建文件将数据写入指定文件中。

    with open('文件名.文件类型', 'wt/b') as file:
    	print(数据, file=file) 
    

    注:

    1. 根据数据类型的不同选择不同的文件类型;
    2. 根据数据类型选择 ‘t’ 或 ‘b’;
    3. 当数据不是字符串或者二进制时需要进行转化。
    # 将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中三方库操作:

    1. 查找三方库:pip search 库名
    2. 安装三方库:pip install 库名
    3. 卸载三方库:pip uninstall 库名
    4. 更新三方库: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读写操作

  1. 读取Excel文件

    openpyxl不仅可以将数据写入Excel,同时还能读取Excel,同时还支持数据透视和插入图标。

    • 加载工作簿:openpyxl.load_workbook(文件名)
    • 获取工作表名字:变量.sheetnames
    • 获取工作表:变量1 = 变量2.worksheet[0]
    • 获得单元格的范围:变量.dimensions
    • 获取行数:变量.max_row
    • 获取列数:变量.max_column
    • 获取指定单元格的值:
      1. 变量.cell(行数, 列数).value
      2. 变量[‘A1’].value
    • 获取多个单元格(嵌套元组):变量[‘A1 : B2’]
  2. 调整样式和插入图表

    • 调整样式:在Python中可以直接通过对单元格对象(cell对象)的属性进行操作,包括字体(font)、对齐(alignment)、边框(border)等

      1. 对齐方式:alignment = Alignment(horizontal = ‘对齐方式’, vertical = ‘对齐方式’)
      2. 边框线条: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')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值