什么是文件?
存储在计算机的存储设备中的一组数据序列就是文件
不同类型的文件通过后缀名进行区分
文本文件:编码格式不同,所占磁盘空间的字节数不同(比如北京你好
,用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()
# 重复运行这个代码,新产生的文件内容里面也只有一个'伟大的中国梦'
文件未被打开时:(磁盘)存储状态
文件被打开后:(内存)占用状态
文件的打开模式 | 模式说明 |
---|---|
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)
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语句又称为上下文管理器,在处理文件时,无论是否产生异常,都能保证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')
数据的组织维度:
也称为(数据的组织方式或存储方式),在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()
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使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
模块是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'))