Python打开文件、读取文件、写入文件+Python创建与删除目录
“ 文章通过18个实例,介绍理论并实例演示了Python中打开文件、读取文件、按字符读取文件、按行读取文件、覆盖写入文件、拼接写入文件的相关操作,并介绍Python中文件乱码的机理及解决办法,介绍了目录的建立、目录的删除、目录的列表遍历、目录的递归遍历系列操作,一文解决Python文件目录处理问题。”
PS:“ 深入了解文件目录操作顺序阅读,应用型选手请跳转文末总结。”
- 博主每篇文章的注释都是干货!每个代码段都有详细注释,一定要认真看注释!!!
- 重要的事情说三遍:一定要看注释!!!一定要看注释!!!一定要看注释!!!
辅助知识
-
解决Python文件中文乱码的原因:
-
pycharm默认存储编码方式是utf-8
-
open()函数默认使用GBK编码打开,写入中文,open加参数:encoding='utf-8'
-
中文乱码解决见下文演示实例8
-
r不会新建不存在的文件,w和a会新建(如果文件不存在)
-
rb、wb等带b,以二进制文件形式打开/读取,针对:二进制文件,图像、声音等
文件读取
-
文件打开方式一:open('文件名', '方式选择'):
-
文件关闭:close()
-
以上两个函数要配合使用,使用open打开配合close关闭,否则会占用系统资源
-
文件打开方式二:with open('文件名','方式选择') as 别名: (推荐)
-
推荐第二种方式,因为第二种方式会自动关闭,不需要close语句辅助
-
文件常见方式选择:
-
'r':只读
-
'w':只写
-
'a+':读写
-
-
在当前目录下新建文本文件,命名为:file.txt,文件内容如下:
hello thank youfilesOK
- 实例1:读写性验证
f = open('file.txt', 'r') # 以只读方式打开文件data.txt,标识为fprint(f.readable()) # readable()判断文件可读性print(f.writable()) # writable()判断文件可写性# 输出结果见下图
按字符读取
- 实例2:按字符读取,read('读取的字符个数'),空则默认全部读取
# 按字符读取# read('读取的字符个数'),空则默认全部读取f = open('file.txt', 'r') # 以只读方式打开文件data.txt,标识为fa = f.read()print(a)f.close()# 输出结果见下图
f = open('file.txt', 'r') b = f.read(5) # 读的前5个字符print(b)f.close()# 输出结果见下图
- 实例3:从指定位置开始读取,seek('指定数字')
f = open('file.txt', 'r')f.seek(6) # 从第六位开始读文件,前5位为hello和空格c = f.read(5) # 读的字符数是英文print(c)f.close()# 输出结果见下图
按行读取
- 实例4:每次读一行readline(),非特殊情况不推荐,新手学习可跳过
# 按行读取readline()# 每次读一行f = open('file.txt', 'r')data = f.readline() # 读第一行存到d中while data: # 当data不为空时程序执行,因为上句读了一行,所以此时不为空 print(data, end='') # 打印文件内容,令end为空是因为print函数结尾默认会换行,会出现空行 data = f.readline() # 继续读下一行存到d中 # 上述两行顺序不能错,否则会漏掉文件第一行,注意原因# 输出结果见下图
- 实例5:readlines(),读取文件全部内容,按行读取读到结束
- 每行以列表元素形式存储(推荐)
# 读取多行readlines(),读取全部内容# 数据以列表形式存储,每行都是一个列表元素f = open('file.txt', 'r')datas = f.readlines() # 将读取的文件存在d中for i in datas: print(i, end='')f.close()# 输出结果见下图
- 推荐方式
- 实例6:with open('文件名',读取方式) as 别名:
- 不用写close()函数,自动关闭
# 系统自动关闭文件with open('file.txt', 'r') as f: # 读取文件,标识为f datas = f.readlines() # 读取全部内容,保存在列表datas里 for i in datas: # 遍历列表元素(每行),并打印 print(i, end='')# 输出结果见下图
- 进阶实例7:Python读取配置文件并输出,新手可跳过
- 当前目录下新建一个配置文件,命名为config.txt,文件内容如下:
# this is a config fileurl=www.baidu.comuser=adminpassword=123456
- 读取配置文件
# 读取配置文件with open('config.txt', 'r') as f: datas = f.readlines() for i in datas: if i.startswith('#'): # 如果遇到#开头的行则忽略,因为是注释 continue print(i)# 输出结果见下图
- 调用配置文件参数,方法:保存为字典,调用字典元素
# 调用配置文件参数实例config_dict = {} # 建立配置文件字典with open('config.txt', 'r') as f: datas = f.readlines() for i in datas: if i.startswith('#'): continue key = i.split('=')[0] # value = i.split('=')[1].strip('\n') # 删除换行符 value = i.split('=')[1].replace('\n', '') # 将换行符替换为空,效果和上句相同 config_dict[key] = value # 每次循环添加字典元素 # print(config_dict) print('读取的url:', config_dict['url']) # 调用字典元素 print('读取的user:', config_dict['user']) print('读取的password:', config_dict['password']) # 注意如果配置文件里=前后有空格 # 则相应config_dict['url ']也要加空格,或者设置操作删除空格 # 输出结果见下图
文件写入
-
with open('文件名','w') as 别名:
-
w:清空文件并写入
-
with open('文件名','a') as 别名:
-
a:不清空文件拼接写入
-
文件的写入write('写入内容'),可以连续写入
-
默认写入、读取的编码方式为GBK
-
解决方法1:提前设置写入编码方式,写中文需要设置编码方式为utf-8写入,否则乱码
-
解决方法2:指定编码方式打开文件即可
清空+一次单行写入
-
实例8:write()清空并连续写入
# w:清空文件并写入# 文件的写入write('写入内容'),可以连续写入with open('new_file.txt', 'w', encoding='utf-8') as f: # 原本如果没有new_file.txt,则会自动创建 data1 = '你好' # 默认写入、读取的编码方式为GBK,解决方法1:提前设置写入编码方式,写中文需要设置编码方式为utf-8写入,否则乱码 # 解决方法2:指定编码方式打开文件即可 f.write(data1 + '\n') # 连续写入 data2 = 'hi' f.write(data2)# 新建文件内容见下图
清空+一次多行写入
- 实例9:write()一次性写入多行,列表存储每行元素+循环写入,ps:文末多一行空行(可删除)
# 文件一次性多行写入,列表存储每行元素+循环写入with open('new_file.txt', 'w') as f: datas = ['happy', 'honey'] for data in datas: f.write(data + '\n')# 写入结果见下图
- 实例10:write()一次性写入多行,列表存储元素+('连接符').join('列表元素')
# write()一次性写入多行,列表存储元素+('连接符').join('列表元素')with open('new_file.txt', 'w') as f: datas = ['nice', 'ball'] # 实例10 # write()解决,使用join连接元素 f.write('\n'.join(datas)) # 使用\n连接中间元素# 写入结果见下图
- 实例11:writeline()一次性写入多行,列表存储元素,自动连接
# writelines()解决,自动连接元素with open('new_file.txt', 'w') as f: datas = ['nice', 'ball'] f.writelines(data+'\n' for data in datas)# 写入结果见下图
拼接写入(不清空)
-
a:拼接写入
-
实例12:建立在实例11的基础上,完成拼接写入
with open('new_file.txt', 'a') as f: datas = ['good', 'luck'] f.writelines(data+'\n' for data in datas)# 写入结果见下图
文件删除
- 需要使用os.path库,os.remove()
- 建议先阅读实例13
- 注意配合使用
# 删除文件import os.pathif os.path.exists('demo'): # 判断文件路径是否存在 os.remove('demo') # 删除# 配合使用,否则文件不存在会报错
目录基础
- import os.path库
- 判断文件/目录是否存在os.path.exists('文件名/目录名')
- 实例13:
import os.pathprint(os.path.exists('file.txt'))# 输出结果见下图
目录创建(单级与多级)与删除(空与非空目录)
-
os.getcwd() # 获取当前目录
-
os.mkdir('demo') # 创建单级目录demo,实例14
-
os.makedirs() # 连续创建多级目录
-
-
os.rmdir('demo') # 删除空目录demo,实例14
-
import shutil
-
shutil.rmtree('demo') # 删除非空目录demo,谨慎使用此函数
-
-
实例14:创建单级目录+删除空目录
if not os.path.exists('demo'): os.mkdir('demo')else: os.rmdir('demo')# 运行第一次在当前路径下创建目录:demo# 运行第二次删除当前路径下目录:demo
- 实例15:创建多级目录,os.makedirs() # 连续创建多级目录
- 使用变量保存目录便于修改
# 连续创建多级目录dirpath = r'./dirs/dir'if not os.path.exists(dirpath): os.makedirs(dirpath)
目录的遍历
列表遍历
- 遍历指定路径下内容,不区分文件和目录
- os.listdir('要遍历的目录')
- 实例16:
# os.listdir('要遍历的目录')# 遍历指定目录下内容,此处以当前目录为例lis = os.listdir(os.getcwd()) # 设置目标为当前目录,os.getcwd()print(lis)# 输出结果见下图
递归遍历
- os.walk('指定路径')
-
对指定目录进行递归,遍历子目录和文件夹
-
会输出指定路径下所有文件夹下所有文件位置
-
区分文件和文件夹
-
实例17:
-
当前路径:
# os.walk('指定路径')# 对指定目录进行递归# 遍历子目录和文件夹# 会输出指定路径下所有文件夹下所有文件位置# 区分文件和文件夹for i in os.walk(os.getcwd()): print(i)# 输出结果为元组,三个元素依次为:# 路径、文件夹、文件# 实例结果见下图
- 实例18:使用序列解包+os.walk(),分类指定路径下的所有文件和文件夹
- 当前路径:
# 序列解包,依次接收元组元素:路径、文件夹、文件for dirpath, subdirpath, files in os.walk(os.getcwd()): for i in subdirpath: # 如果是文件夹,输出目录 print('目录', os.path.join(dirpath, i)) for i in files: # 如果是文件,输出文件 print('文件', os.path.join(dirpath, i))# 输出结果见下图
总结
-
文件读取
f = open('文件名', '打开方式') # 打开文件f.close()# 关闭文件# 打开文件with open('文件名', '打开方式', encoding='编码方式') as f: # 打开文件# 可读可写性判断f.readable()f.writable()f.read() # 读取全部内容f.read(10) # 读取前10个字符# 读取5-10个字符f.seek(5)f.read(10)# 读取第一行f.readline()# 按行读取全部行,每行为列表元素f.readlines()# 读取文件实例with open('file.txt', 'r') as f: # 读取文件,标识为f datas = f.readlines() # 读取全部内容,保存在列表datas里 for i in datas: # 遍历列表元素(每行),并打印 print(i, end='')
-
文件写入与删除
with open('file.txt', 'w') as f: # 拼接写入w改为a:f.write('写入内容') # 清空写入单行f.writelines('写入列表') # 清空写入多行# 实例# write()一次性写入多行,列表存储元素+('连接符').join('列表元素')with open('new_file.txt', 'w') as f: datas = ['nice', 'ball'] # 实例10 # write()解决,使用join连接元素 f.write('\n'.join(datas)) # 使用\n连接中间元素# writelines()解决,自动连接元素with open('new_file.txt', 'w') as f: datas = ['nice', 'ball'] f.writelines(data+'\n' for data in datas)# 文件删除if os.path.exists('demo'): # 判断文件路径是否存在 os.remove('demo') # 删除
-
目录操作
# 目录操作os.path.exists('文件名/目录名') # 存在性判断os.getcwd() # 获取当前目录os.mkdir('demo') # 创建单级目录demoos.makedirs('./reports/report') # 连续创建多级目录os.rmdir('demo') # 删除空目录demoimport shutilshutil.rmtree('demo') # 删除非空目录demo,谨慎使用此函数os.listdir('路径') # 列表遍历目录os.walk('路径') # 递归遍历目录# 实例:dic = 'demo'if not os.path.exists(dic): os.mkdir(dic)
“以上为本文全部内容,如若遇到不明白的地方或者发现错误的地方欢迎私信博主交流、改正。”
💗 “分享欲本身就是热情和爱,对于某些个体而言,分享欲亦是迸发的力量和刻进骨子里的浪漫。”
——Created By 是羽十八ya
创作打卡挑战赛 赢取流量/现金/CSDN周边激励大奖