第11章 1 文件及IO操作

文章目录

    • 文件的概述及基本操作步骤 p151
    • 文件的写入操作 p152
    • 文件的读取操作及文件复制 p153
      • 文件的读取操作
      • 文件复制
    • with语句的使用 p154
    • 一维数据和二维数据的存储与读取 p155
    • 高维数据的存储和读取 p156
    • os模块中的常用的函数 p157
    • os.path模块中常用的函数 p158

文件的概述及基本操作步骤 p151

什么是文件?
存储在计算机的存储设备中的一组数据序列就是文件
不同类型的文件通过后缀名进行区分

文本文件:编码格式不同,所占磁盘空间的字节数不同(比如北京你好,用gbk编码是8个字节,utf-8则需要编码为12个字节)
二进制文件:没有统一的编码,文件直接由0或1组成,需要指定的软件才能打开


Python操作文件的步骤:

1、打开文件

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

filename:要打开文件的完整路径
mode:文件的打开模式:读还是写...
encoding:文件的编码格式

若要打开的文件不存在,则会在磁盘上创建文件

2、操作文件

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

3、关闭文件

变量名.close()

代码实例:

def my_write():
    # 1
    file=open('a.txt','w',encoding='utf-8') # 若欲打开文件和当前代码文件在同一目录,直接写欲打开文件名就行;以utf-8的格式编码
    # 2
    file.write('伟大的中国梦')
    # 3
    file.close()

def my_read():
    # 1
    file=open('a.txt', 'r', encoding='utf-8')
    # 2
    s=file.read()
    # 3
    file.close()

    print(s)


# 主程序运行(似乎就是只有在当前文件中运行Python才会执行的分支)
if __name__=='__main__':
    my_write()
    my_read()
# 重复运行这个代码,新产生的文件内容里面也只有一个'伟大的中国梦'

文件的写入操作 p152

文件未被打开时:(磁盘)存储状态
文件被打开后:(内存)占用状态


文件的打开模式 模式说明
r 以只读模式打开,文件指针在文件的开头;若文件不存在,程序抛异常
rb 以只读模式打开二进制文件,如图片文件
w 覆盖写模式,文件不存在就创建,文件存在则内容覆盖
wb 覆盖写模式写入二进制数据,文件不存在就创建,文件存在就覆盖
a 追加写模式,文件不存在则创建;文件存在则在文件末尾追加内容
+ w/r/a 等一同使用,在原功能的基础上增加 同时读写功能

读写方法 描述说明
file.read(size) 从文件中读取size字节/字符,若没有给定参数,则读取文件全部内容
file.readline(size) 读取文件中的一行数据,若给定参数,则为读取这一行中的size字节/字符
file.readlines() 从文件中读取所有内容,结果为列表类型
file.write(s) 将字符串s写入文件
file.writelines(lst) 将内容全部为字符串的列表lst写入文件(若有整数、浮点数则写不进去)
file.seek(ooffset) 改变当前文件操作指针的位置,英文占一个字节,中文gbk编码占两个字节,utf-8编码占三个字节

代码实例:

def my_write(s):
    file=open('b.txt','a',encoding='utf-8')
    file.write(s)
    file.write('\n')
    file.close()

# 将列表中的内容写入文件
def my_write_lst(lst):
    file=open('b.txt','a',encoding='UTF-8')
    file.writelines(lst)
    file.close()

if __name__=='__main__':
    my_write('伟大的中国梦')
    my_write('北京欢迎您')
    lst=['姓名\t','年龄\t','成绩\n','张三\t','30\t','98\n']
    my_write_lst(lst)

文件的读取操作及文件复制 p153

文件的读取操作

def my_read(filename):
    file=open(filename,'w+',encoding='UTF-8')
    file.write('你好啊') # 写完成后,文件的指针在最后
    # seek修改文件指针的位置
    file.seek(0) # 文件指针偏移设置为0,最开始的地方

    # s=file.read() # read()不指定参数就是读取文件全部内容;
    # s=file.read(2) # 读取两个字符(不是字节),你好
    # s=file.readline() # 读取一行的数据
    # s=file.readline(2) # 读取一行中的两个字符
    s=file.readlines() # 读取所有,一行为列表中的一个元素,s是列表类型
    print(type(s))
    print(s)

if __name__=='__main__':
    my_read('d.txt')

文件复制

def copy(src,dst):
    # 文件的复制就是边读边写操作
    file_src=open(src,'rb')
    file_dst=open(dst,'wb')

    s=file_src.read() # 源文件读取所有
    file_dst.write(s) # 目的文件写入所有

    # 先打开的后关,后打开的先关
    file_dst.close()
    file_src.close()


if __name__=='__main__':
    src='./图片.png' # . 代表当前目录
    dst='../test.png'
    copy(src,dst)
    print('文件复制完成')

with语句的使用 p154

with语句又称为上下文管理器,在处理文件时,无论是否产生异常,都能保证with语句执行完毕后关闭已经打开的文件,这个过程是自动的,无需手动操作

语法结构:

with open(...) as file:
	pass

代码实例:

def write_fun():
    with open('aa.txt','w',encoding='UTF-8') as file:
        file.write('2022年北京冬奥会欢迎您')

def read_fun():
    with open('aa.txt','r',encoding='UTF-8') as file:
        print(file.read())

def copy_fun(src_file,dst_file):
    with open(src_file,'r',encoding='UTF-8') as file_src:
        with open(dst_file,'w',encoding='UTF-8') as file_dst:
            file_dst.write(file_src.read())

if __name__=='__main__':
    write_fun()
    read_fun()
    copy_fun('./aa.txt','./bb.txt')

一维数据和二维数据的存储与读取 p155

数据的组织维度:
也称为(数据的组织方式或存储方式),在Pytho中常用的数据组织方式可以分为一维数据、二维数据和高维数据

一维数据:通常采用线性方式组织数据,一般使用Python中的列表、元组或集合进行存储数据(不能使用字典)

二维数据:二维数据也称为表格数据,由行和列组成,类似于Excel表格,在Python中使用二维列表进行存储

高维数据:高维数据则是使用key-value方式进行组织数据,在Python中使用字典进行存储数据。在Python中内置的json模块专门用于处理JSON(JavaScript Object Notation)格式的数据


代码实例:

# 存储和读取一维数组
def my_write():
    # 一维数据,可以使用列表,元组,或集合
    lst=['张三','李四','王五','陈六','麻七']
    with open('student.csv','w',encoding='UTF-8') as file: # 没写编码格式,采用默认 GBK编码 会是乱码
        file.write(','.join(lst)) # 列表转成字符串的操作

def my_read():
    with open('student.csv','r',encoding='UTF-8') as file:
        s=file.read()
        lst=s.split(',') # 劈分
        print(lst)


# 存储和读取二维数据(表格数据)
def my_write_table():
    lst=[
        ['商品名称','单价','采购数量'],
        ['水杯','98.5','20'],
        ['鼠标', '89', '100'],
    ]
    with open('table.csv','w',encoding='UTF-8') as file: # 虽然此处用了w但不是覆盖写,怀疑和with open打开方式有关,但是多次运行也不会往table.csv中重复写
        for item in lst:
            file.write(','.join(item))
            file.write('\n')

def my_read_table():
    data=[]
    with open('table.csv','r',encoding='UTF-8') as file:
        lst=file.readlines() # 每一行就是列表中的一个元素
        for item in lst:
            new_lst=item[:len(item)-1].split(',')
            data.append(new_lst)
    print(data)
    
if __name__=='__main__':
    my_write()
    my_read()
    my_write_table()
    my_read_table()

高维数据的存储和读取 p156

json模块的常用函数

函数名称 描述说明
json.dumps(obj) 将Python数据类型转成JSON格式过程,编码过程
json.loads(s) 将JSON格式字符串转成Python数据类型,解码过程
json.dump(obj,file) 与dumps()功能相同,将转换结果存储到文件file中
json.load(file) 与loads()功能相同,从文件file中读入数据

代码实例:

import json

# 准备高维数据
lst= [
    {'name':'tom','age':18,'score':100},
    {'name':'jack','age':19,'score':90},
    {'name':'lucy','age':17,'score':80}
] # 若最外层变为元组边界,loads解码后依然变成列表边界

# dumps  编码:list-->str
s=json.dumps(lst,ensure_ascii=False,indent=4) # ensure_ascii=False为了正常显示中文,indent=4增加数据的缩进美观。使json格式的字符串更具有可读性
print(type(s)) # 编码:list-->str
print(s)

print('-'*66)

# loads  解码:str-->list
lst2=json.loads(s)
print(type(lst2))
print(lst2)

print('-'*66)

# 编码到文件中
with open('studeng.txt','w',encoding='UTF-8') as file:
    json.dump(lst,file,ensure_ascii=False,indent=4) # ensure_ascii=False,indent=4 也要加上确保可读性

print('-'*66)

# 解码到程序中
with open('studeng.txt','r',encoding='UTF-8') as file:
    lst3=json.load(file)
print(lst3)

os模块中的常用的函数 p157

os使Python内置的与操作系统文件相关的模块,该模块中语句的执行结果通常和操作系统有关,即有些函数的运行效果在Windows操作系统和Macos操作系统中不一样


目录与文件的相关操作

函数名称 描述说明
getcwd() 获取当前的工作路径
listdir(path) 获取path路径下的文件和目录信息 ,若没有指定path,则获取当前路径下的文件和目录信息
mkdir(path) 在指定路径下创建目录(文件夹)
makedirs(path) 创建多级目录
rmdir(path) 删除path下的空目录(目录下面有内容的删不了)
removedirs(path) 删除多级目录
chdir(path) 把path设置为当前目录
walk(path) 遍历目录树,结果为元组,包含所有路径名,所有目录列表和文件列表
remove(path) 删除path指定的文件
rename(old,new) 将old重命名为new
stat(path) 获取path指定的文件信息
startfile(path) 启动path指定的文件

代码实例:

import os

print('当前的工作路径:',os.getcwd())

print('-'*66)

lst=os.listdir()
print('当面路径下的所有目录和文件:',lst)

print('指定路径下的所有目录和文件:',os.listdir('../'))

print('-'*66)

# 创建单极目录
# os.mkdir('好好学习') # 若此目录已经存在,则无法创建并且程序报错
# os.mkdir('mm')
# 创建单极目录
# os.makedirs('./好好学习/aa/bb/cc')  # 若最下级目录cc已经存在,则无法创建并且程序报错

print('-'*66)

# 删除目录(只能是空目录)
# os.rmdir('./mm')  # 若目录非空或者不存在,那么此处会报错
# 删除多级目录
# os.removedirs('./好好学习/aa/bb/cc') # 同样要求目录是空的,和目录存在

print('-'*66)

# 改变当前的工作路径
print('当前的工作路径:',os.getcwd())
os.chdir('D:\pycharm_projects')
print('修改工作目录后当前的工作路径:',os.getcwd()) # 修改了程序运行的路径,程序的路径没变
os.chdir(r'D:\pycharm_projects\pythonProject\venv\chap_10')   # 注意此处 `\v`成了转义字符,所以搞成\\v  ;  也可以在整个字串外面加个 ‘r' 或者 ’R'
print('恢复,当前的工作路径:',os.getcwd())

print('-'*66)

# 遍历目录树 打印太多注释掉
'''
for dirs,dirlist,filelist in os.walk('D:\pycharm_projects\pythonProject\\venv'):
    print(dirs) # 当前遍历到的目录 X
    print(dirlist) # X下的目录
    print(filelist) # X下的文件
    print('*****')
'''

print('-'*66)

# 删除文件
# os.remove('./a.txt') # 若文件不存在会报错 FileNotFoundError
# 重命名操作(操作对象可以是文件也可以使目录)
# os.rename('aa.txt','aa_new.txt') # 重命名文件
# os.rename('112','113') # 重命名目录

print('-'*66)

# 转换时间格式
import time

def date_foramt(longtime): # 入参是时间戳
    s=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(longtime))
    return s

# 获取文件信息
info=os.stat('./aa_new.txt')
print(type(info))  # 
print(info)

print('最近一次访问时间:',date_foramt(info.st_atime))
print('在windows操作系统中显示的文件创建时间:',date_foramt(info.st_ctime))
print('最后一次修改时间:',date_foramt(info.st_mtime))
print('文件的大小(单位是字节):',info.st_size)

print('-'*66)

# 启动路径下的文件
os.startfile('calc.exe') # 打开计算器
os.startfile(r'C:\Users\j30022395\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Python 3.8\Python 3.8 (64-bit)') # 打开Python解释器

os.path模块中常用的函数 p158

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

函数名称 描述说明
abspath(path) 获取目录或文件的绝对路径(从盘符开始)
exists(path) 判断目录或文件在磁盘上是否存在,结果为bool类型,若目录或文件在磁盘上存在,结果为True,否则为False
join(path,name) 将目录与目录名或文件名进行拼接,相当于字符串的+ 操作
splitext() 分别获取文件名和后缀名
basename(path) path中提取文件名
dirname(path) path 中提取路径(不包含文件名)
isdir(path) 判断path是否是有效路径
isfile(path) 判断path 是否是有效文件
import os.path

print('获取目录或者文件的绝对路径:',os.path.abspath('./note.txt')) # 实际不存在
print('判断目录或文件在磁盘上是否存在:',os.path.exists('note.txt')) # False 当前路径下不存在这个文件
print('判断目录或文件在磁盘上是否存在:',os.path.exists('1.txt')) #  True 当前路径下存在这个文件
print('拼接路径:',os.path.join(r'E:\1_python\PyCharmProjects\chap3','note.txt'))
print('分割/分别获取 文件名和文件后缀名:',os.path.splitext('b.txt')) # 要切除的文件不一定要在当前目录下存在
print('提取文件名:',os.path.basename(r'E:\1_python\PyCharmProjects\chap3\note.txt'))
print('提取文件名:',os.path.basename(r'E:\1_python\PyCharmProjects\chap3\note_1.txt')) # 文件实际不存在也能提取文件名
print('提取路径:',os.path.dirname(r'E:\1_python\PyCharmProjects\chap3\note.txt'))
print('提取路径:',os.path.dirname(r'E:\1_python\PyCharmProjects\chap3_1\note.txt')) # 路径实际不存在也能提取
print('判断一个路径是否是有效路径:',os.path.isdir(r'E:\1_python\PyCharmProjects\chap3\note_1.txt')) # 文件不存在False
print('判断一个路径是否是有效路径:',os.path.isdir(r'E:\1_python\PyCharmProjects\chap3\note.txt')) # 文件存在也是False
print('判断一个路径是否是有效路径:',os.path.isdir(r'E:\1_python\PyCharmProjects\chap3'))

print('判断一个路径是否是有效文件:',os.path.isfile(r'E:\1_python\PyCharmProjects\chap3\1.txt'))

你可能感兴趣的:(python,python)