文件与IO操作

92 阅读4分钟

文件的概述

  • 文件是存储在辅助存储设备的一组数据序列
  • 不同类型的文件通过后缀名进行区分

文件的分类

文本文件

  • 如 .txt文件,文件中的内容由于编码格式的不同,所占磁盘空间的字节数不同

二进制文件

  • 如 .png文件,文件直接由0或1组成,没有统一编码,需要使用指定的软件打开

文件的创建(打开)和关闭

文件的操作顺序

  • 打开 → 操作 → 关闭

创建(打开)文件

变量名=open(filename, mode, encoding)

image.png

操作文件(文件的读写)

变量名.read() 变量名.write(s)

image.png

image.png

关闭文件

变量名.close()

image.png

文件的状态和操作过程

image.png

文件的基本操作

文件的打开模式

image.png

文件的读写方法

image.png

image.png

文件的复制

image.png

with 语句

语法结构

with open(...) as file:

使用 with 语句的优点

  • 处理文件时,无论是否产生异常,都能保证 with 语句执行完毕后关闭已经打开的文件

image.png

image.png

数据的组织维度及存储

数据的组织维度

一维数据

  • 采用线性方式组织数据,可以使用列表、元组、集合进行存储

二维数据

  • 也称表格数据,由行和列组成,在 Python 中可使用二维列表进行存储

高维数据

  • 使用 key-value对方式组织数据,在 Python 中可使用字典进行存储

数据的存储

一维数据和二维数据

  • 可采用 CSV(逗号分隔值)格式进行存储
  • CSV 格式存储的文件拓展名为 .csv
  • 可以使用记事本或Excel打开
  • 每行表示一个一维数据,多行表示二维数据
lst = ['张三', '李四', '王五', '马六']


def my_write(lst):
    with open('student.csv', 'w') as file:
        file.write(','.join(lst))


my_write(lst)


def my_read():
    with open('student.csv', 'r') as file:
        s = file.read()
        lst = s.split(',')
        print(lst)


my_read()

goods = [
    ['商品名称', '单价', '采购数量'],
    ['水杯', '98.5', '20'],
    ['鼠标', '89', '100']
]


def my_write_table(lst):
    with open('table.csv', 'w', encoding='gbk') as file:
        for line in lst:
            file.writelines(','.join(line))
            file.write('\n')


my_write_table(goods)

data = []


def my_read_table():
    with open('table.csv', 'r', encoding='gbk') as file:
        for line in file:
            lst = line[:len(line) - 1].split(',')
            data.append(lst)
    print(data)


my_read_table()

高维数据

  • JSON格式可以对高维数据进行存储,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和理解
  • JSON格式的数据使用 key:value 形式存储
  • Python内置的json模块专门用于处理JSON格式数据
  • json模块的两个过程
    • 编码:将 Python 数据类型转成 JSON 格式的过程
    • 解码:将 JSON 格式解析对应到 Python 数据类型的过程

image.png

import json

lst = [
    {"name": "陈子川", "age": 18, "score": 90},
    {"name": "陆小凤", "age": 21, "score": 89},
    {"name": "张无忌", "age": 19, "score": 100}
]

# 编码,转成JSON格式,结果为一个字符串
# ensure_ascii=False 正常显示中文
# indent 增加数据的缩进,使生成的Json格式字符串更具有可读性
str = json.dumps(lst, ensure_ascii=False, indent=4)
print(type(str))
print(str)

# 解码,将JSON格式字符串转成Python中的数据类型
lst2 = json.loads(str)
print(type(lst2))
print(lst2)

# 编码到文件
with open("students.txt", 'w') as file:
    json.dump(lst2, file, ensure_ascii=False, indent=4)

# 解码到程序
with open("students.txt", 'r') as file:
    print(json.load(file))

目录与文件的相关操作

os模块

  • Python 内置的与操作系统和文件系统相关的模块,该模块中语句的执行结果通常与操作系统有关

image.png

import os

print("当前工作目录:" + os.getcwd())
lst = os.listdir()
print("当前路径下所有的目录及文件:", lst)
print('指定路径下的所有目录及文件:', os.listdir('E:/Developer'))  # 'F:\Developer'    r'E:\Developer'

# 创建目录
os.mkdir('ivan')    # 如果要创建的文件夹(目录)已存在,程序报错
os.makedirs(os.getcwd() + r'\aa\bb\cc')     # 创建多级目录

# 删除目录
os.rmdir('./ivan')    # 目录不存在,执行删除程序报错
os.removedirs('./aa/bb/cc')

# 把path设置成当前路径
os.chdir('E:/Developer')
print("获取当前路径:", os.getcwd())

# 遍历目录数
for dirs, dirlst, filelst in os.walk('E:/Developer/PycharmProjects'):
    print("------------------")
    print(dirs)
    print(dirlst)
    print(filelst)

os模块的高级操作

image.png

import os

# 删除文件
os.remove('./a.txt')    # 如果文件存在则删除,文件不存在删除报错

# 重命名文件
os.rename('./student.csv', './students.csv')

# 转换时间格式
import time  # 内置的time模块


def date_format(longtime):
    s = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(longtime))
    return s


# 获取文件的信息
info = os.stat('./students.csv')
print(type(info))
print(info)
print("文件的大小(单位为字节):", date_format(info.st_size))
print("最近一次访问时间:", date_format(info.st_atime))
print("在Windows操作系统中显示的文件创建时间:", date_format(info.st_ctime))
print("最后的一次修改时间:", date_format(info.st_mtime))

# 启动路径下的指定文件
os.startfile('calc.exe')

os.path模块

  • os.path是os模块的子模块,也提供了一些目录或文件的操作函数

image.png