“ 文章通过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 you
files
OK
- 实例1:读写性验证
f = open('file.txt', 'r') # 以只读方式打开文件data.txt,标识为f
print(f.readable()) # readable()判断文件可读性
print(f.writable()) # writable()判断文件可写性
# 输出结果见下图
按字符读取
- 实例2:按字符读取,read('读取的字符个数'),空则默认全部读取
# 按字符读取
# read('读取的字符个数'),空则默认全部读取
f = open('file.txt', 'r') # 以只读方式打开文件data.txt,标识为f
a = 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 file
url=www.baidu.com
user=admin
password=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.path
if os.path.exists('demo'): # 判断文件路径是否存在
os.remove('demo') # 删除
# 配合使用,否则文件不存在会报错
目录基础
- import os.path库
- 判断文件/目录是否存在os.path.exists('文件名/目录名')
- 实例13:
import os.path
print(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') # 创建单级目录demo
os.makedirs('./reports/report') # 连续创建多级目录
os.rmdir('demo') # 删除空目录demo
import shutil
shutil.rmtree('demo') # 删除非空目录demo,谨慎使用此函数
os.listdir('路径') # 列表遍历目录
os.walk('路径') # 递归遍历目录
# 实例:
dic = 'demo'
if not os.path.exists(dic):
os.mkdir(dic)
“以上为本文全部内容,如若遇到不明白的地方或者发现错误的地方欢迎私信博主交流、改正。”
💗 “分享欲本身就是热情和爱,对于某些个体而言,分享欲亦是迸发的力量和刻进骨子里的浪漫。”
——Created By 是羽十八ya