面向对象程序设计六(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 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

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是羽十八ya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值