3.文件和目录
一、字符编码
常见编码格式和区别:Unicode:4个字节,utf-8:8位一个字节表示英语,24位(3个字节表示中文和其他语言),gbk:英文一个字节,中文两个字节
数据在内存中都是以Unicode编码的,但是网络传输或存储到硬盘中时必须非Unicode
二、文件的打开或创建
文件变量名=open(文件名[,打开方式[,缓冲区]])
mode | 说明 | 注意 |
---|---|---|
r | 只读方式打开 | 文件必须存在 |
w | 只写方打开 | 文件不存在则创建新文件,文件存在会清空内容后再写入 |
a | 追加方式打开 | 文件不存在则创建 |
r+/w+ | 读写方式打开 | 可读可写。文必须存在,不会自动创建,写为追加再文件内容末尾。 |
a+ | 追加和读写方式打开 | 一般不能直接读取,因为此光标再文件末尾,必须有移动到初始位置或非末尾的位置。 |
rb,wb,ab,wb+,ab+ | 二进制文件打开方式,同上 |
以a或r开头是安全模式,不会删除原来的内容,以w开头的是危险模式,会删除原来内容
三、文件的读
f = open('f.txt', encoding='utf-8', mode='r')
content = f.read(5) # 按照字符读
content = f.readline() # 读一行
l1 =f.readlines() # 读每一行,返回一个列表,列表中的每一个元素是源文件的每一行
print(l1)
# for读取
for line in f:
print(line)
# open方式打开需要手动关闭文件句柄
f.close()
四、文件的写
# 有文件在源文件的最后追加
f = open('文件',encoding='utf-8', mode='a')
# write()传入的必须是字符串
f.write('an')
f.write('bn')
f.close()
注意事项:文件的最小单位是字节,文件中存在一个文件指针(表现为文件中闪烁的光标)
五、常用方法
文件(对象)句柄
print(f.readline()) # 打印一行
print(f.readline(5)) # 打印前5个字符
print(f.tell()) # 打印当前指针位置
print(f.read()) # 读完文件后,指针在最尾处
f.seek(0) # 如要重头到尾再读,文件指针须先回到文件头(0-文件头,默认值; 1-当前位置; 2-文件尾)
print(f.read()) # 重读文件
print(f.encoding) # 打印当前使用的字符编码
print(f.name) # 打印文件名
print(f.flush()) # 刷新
f.truncate() # 清空文件
f.truncate(12) # 从头开始,第12个字符后截断并清除
f.close() # 关闭文件
文件操作方法
文件的基本操作需要os模块和os.path模块
path:路径,filename:文件的绝对路径,如:'D:\a.txt',当前目录下的文件直接指定文件名即可。
os.path中常用的文件处理函数。
函数名 | 说明 |
---|---|
abspath(path) | 返回path所在的绝对路径 |
dirname(path) | 返回目录的路径 |
exists(path) | 判断文件是否存在 |
getatime(filename) | 返回指定文件的的最近访问时间 |
getctime(path) | 返回指定文件的创建时间 |
getmtime(path) | 返回指定文件的最新的修改时间 |
getsize(filename) | 返回指定文件的大小,单位是字节 |
isdir(path) | 判断是否为文目录 |
isfile(path) | 判断是否为文件 |
split(path) | 分割文件名与路径并返回一个列表 |
splitext(path) | 从路径中分割文件的拓展名 |
walk(top,func,arg) | 遍历目录数 |
getatime()、getctime()、getmtime()返回的都是时间戳。可通过time.gmtime([sec])转换的得到一个对象,再通过该对象的tm_year,tm_mon,tm_mday等属性获取相应时间或日期
os模块下常用的文件操作函数
os.remove(filename) # 删除文件
os.listdir() # 列出当前目录的所有文件,返回一个列表,如['an.txt','bn.txt','cn.txt']
os.rename('要修改的文件、目录名', '修改后的文件、目录名') # 文件或目录的重命名
六、使用with操作文件
# 不指定mode,默认为rt模式。即只读文本,as表示取别名
with open('an.txt',encoding='utf-8')as f:
f.write('str')
print(f.read())
# 这种方式的好处在于不用手动关闭文件句柄,即不写f.close()
七、目录操作
目录操作需要os模块,若path只指定了目录名,则在该py文件同目录下创建。
目录创建
mkdir(path) # 创建一个指定目录,paht为该文件的绝对路径
mkdirs(path1,path2...) # 创建多个目录
目录删除
os.rmdir("dir") # 只能删除空目录
shutil.rmtree() # 空目录、非空目录都能删除,需导入shutil模块
os.removedirs(path1,path2...) # 删除多级目录
os.removedirs('./olddir/newdir')
目录遍历
1、listdir(path)
查看指定目录下的文件及目录信息。
import os
print(os.listdir(r'D:\Other')) # ['an.txt', 'bn.py', 'cn.md', 'newdir']
这只是返回了Other这个目录下的文件和目录,但是newdir目录下的文件和目录没有打印,如下利用递归函数即可实现。
# 获取该目录下的所有文件名
def get_file(path):
ret = os.listdir(path)
for name in ret: #name 文件名
abs_name = os.path.join(path,name) # 完整路径名
if os.path.isfile(abs_name):
print(name)
else:
get_file(abs_name)
2、os.walk()
返回该路径下的所有文件及子目录信息元组,将该信息分成文件、目录逐行显示。
import os
list_dir = os.walk(path)
# os.walk返回一个元组,包括三个元素,所有路径名、所有目录列表与文件列表
for root,dirs,files in list_dir:
# 遍历目录
for d in dirs:
print(os.path.join(root,d)) # 获取完整的路径
# 遍历文件
for f in files:
print(os.path.join(root,f))
#
# D:\Other\newdir
# D:\Other\an.txt
# D:\Other\bn.py
# D:\Other\cn.md
# D:\Other\newdir\太阳.jpg
八、shutil模块
import shutil
# 拷贝文件
# shutil.copy2('原文件', '现文件')
# shutil.copy2('file', 'temp')
# 拷贝目录
# shutil.copytree("原目录", "新目录", ignore=shutil.ignore_patterns("*.pyc"))
# shutil.copytree("/Users/jingliyang/PycharmProjects/面试题/常用模块/logging模块", "logging模块2", ignore=shutil.ignore_patterns("__init__.py"))
# 删除目录
# shutil.rmtree("temp", ignore_errors=True)
# shutil.rmtree("logging模块2", ignore_errors=True)
# 移动文件/目录
# shutil.move("logging模块", "logging2", copy_function=shutil.copy2)
# 获取磁盘使用空间
# total, used, free = shutil.disk_usage(".")
# print("当前磁盘共: %iGB, 已使用: %iGB, 剩余: %iGB"%(total / 1073741824, used / 1073741824, free / 1073741824))
#
# 压缩文件
# shutil.make_archive('压缩文件夹的名字', 'zip','待压缩的文件夹路径')
# shutil.make_archive('logging2', 'zip','/Users/jingliyang/PycharmProjects/面试题/常用模块/随机数')
# 解压文件
# shutil.unpack_archive('zip文件的路径.zip','解压到目的文件夹路径')
# shutil.unpack_archive('/Users/jingliyang/PycharmProjects/面试题/常用模块/shutil模块/logging2.zip','/Users/jingliyang/PycharmProjects/面试题/常用模块/shutil模块/tmp')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗