Python文件和目录操作

本文介绍了Python中处理文件和目录的各种操作,包括文件的读取(如按字符、按行读取,读取配置文件)、文件的写入(如追加写入,处理非英文字符串的编码)以及目录操作(如获取当前目录、创建删除目录、遍历目录文件)。重点讲解了使用with语句确保文件正确关闭以及处理文件编码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、常用的文件分类

配置文件
数据文件
日志文件
数据库文件
声音和图像文件

这节主要是为了讲用python来处理文件

2、文件的读取

文件读取的过程:

1、打开文件 2、读取文件 3、关闭文件

r : read
w : write
a+ : 读写

# 文件读取的过程 1、打开文件 2、读取文件 3、关闭文件
# r : read
# w : write
# a+ : 读写

file = open('data.txt', 'r')
print(file.readable())  # 判断这个文件能不能被读取
print(file.writable())  # 判断是否可写
file.close()  # 关闭文件

读取文件名为data的文件

file = open('data.txt', 'r')
data = file.read()
print(data)
file.close()  # 关闭文件

在这里插入图片描述
(只以w的方式打开时,文件内容会被清空)

若文件太大,则这种方式不可取,采用带参的调用方式

2.1 read后面加5,表示只读取5个字符

file = open('data.txt', 'r')
data = file.read(5)
print(data)
file.close()  # 关闭文件

在这里插入图片描述

2.2 file.seek(6) 表示跳过前6个字符

file = open('data.txt', 'r')
file.seek(6)
data = file.read(6)
print(data)
file.close()  # 关闭文件

跳过前6个字符,且只读6个字符
在这里插入图片描述

2.3 按行读取 file.readline()

(读取第一行)

file = open('data.txt', 'r')
data = file.readline()
print(data)
file.close()

想读取全部内容

(while循环,空字符串认为是false)

file = open('data.txt', 'r')
data = file.readline()
while data:
    print(data)
    data = file.readline()
file.close()

print里面跟end=’’ 可使其不会自动换行

 print(data, end='')

2.4 datas()一次读取全部行再处理,采用遍历列表

file = open('data.txt', 'r')
datas = file.readlines()
print(type(datas))
for line in datas:
    print(line, end='')

file.close()

相对路径是直接输入txt文件名,绝对路径需要输入磁盘路径
(与转义字符相配合,所以是2个右斜杠)
(绝对路径就是从盘符开始的路径,相对路径是软件或者网页编程的概念,是指程序与其他文件的相对路径)

# 相对路径  绝对路径
file = open('e:\\data.txt', 'r')
data = file.read()
print(data)
file.close()

也可以只用一个反斜杠/来表示

file = open('e:/data.txt', 'r')

也可以在前面加一个r,代表里面的 \ 已经不能代表转义字符来处理了

file = open(r'e:\data.txt', 'r')

2.5 一种更加安全的方式

若语句中出错,则最后一行关闭文件的命令就无法执行,为了避免这种情况,采用with语句,相当于它会执行finally语句,帮我们把文件关闭掉

(读和写都可)

with open('data.txt', 'r') as file:
    datas = file.readlines()
    print(type(datas))
    for line in datas:
        print(line, end='')

2.6 读取配置文件

文件读取一个常用的场景,读取配置文件
比如说,配置一个app.config文件
在这里插入图片描述
然后读取

configData = {}  # 定义一个字典
with open('app.config', 'r') as file:
    datas = file.readlines()
    for line in datas:
        if line.startswith("#"):
            continue              # 跳过注释语句
        key = line.split("=")[0]  # 按等号分割 0表示第一个元素
        value = line.split("=")[1]  # 按等号分割 1表示第二个元素
        configData[key] = value


if __name__ == '__main__':     #  最后两行是测试代码,只有在当前程序运行的时候才会打印configData
    print(configData)

读取结果有换行符
在这里插入图片描述

为了取消可以在value语句后面加replace()

value = line.split("=")[1].replace("\n", "") # 将换行符替换为空字符串

在这里插入图片描述

新建一个.py文件,调用所写的appConfig.py文件

from ch9.appConfig import configData

print('数据库地址:', configData['db_url'])
print('数据库端口:', configData['db_port'])
print('数据库用户:', configData['db_user'])
print('数据库密码:', configData['db_pass'])

3、文件的写入

w是先清空文件再写入

也要有打开文件、写入文件、关闭文件三个步骤
但是使用with语句就不用关闭文件语句‘

with open('data_write', 'w') as file:
    data = 'hello python'
    file.write(data)

但是使用这个写入文件时不会自动帮助你换行,需要在第一行后面加一个换行符

with open('data_write', 'w') as file:
    data = 'hello python'
    file.write(data+'\n')
    data = 'i am ccc'
    file.write(data)

3.1 写入多行

使用循环

with open('data_write', 'w') as file:
datas = ['hello python', 'i am ccc', 'like plmm']

    for data in datas:
        file.write(data+'\n')

使用writelines

(但是没有换行)

with open('data_write', 'w') as file:
    datas = ['hello python', 'i am ccc', 'like plmm']
    file.writelines(datas)

为了换行采用推导式生成新的列表

with open('data_write', 'w') as file:
    datas = ['hello python', 'i am ccc', 'like plmm']
    file.writelines([data+'\n' for data in datas])

但是这种办法会让结果多一行,可能会给你的程序带来麻烦,为了解决这个问题,用join字符串连接的方式生成一个新的字符串,这样就会解决多一行的问题

with open('data_write', 'w') as file:
    datas = ['hello python', 'i am ccc', 'like plmm']
    file.writelines("\n".join(datas))

最后一行只用write参数也可以

file.write("\n".join(datas))

(这样看来writelines不光可以接受列表的参数,同样可以接受一个字符串作为参数,而一个字符串作为参数是write方法的本职工作)

已知w是先清空文件再写入,那么想从文件的末尾接着写入应该怎么办?

此时,我们可以把w改成a追加的方式,打开之后文件的指针会放在文件的末尾

with open('data_write', 'a') as file:

3.2 文件打开的方式

rb wb ab 这种带b的都是打开二进制文件的,比如说声音文件、图像文件、mp4

r r+ rb rb+ 这几个跟r有关的都需要文件事先存在,要不然就会报错

w w+ wb wb+
a a+ ab ab+

这8种文件不存在时会新建文件

3.3 解决非英文字符串的编码

比如手动创建一个.txt文件,里面带中文,那么读取它的时候就要加一个encoding参数,encoding=‘utf-8’ 要是不指定编码方式,那么它里面就不是utf-8
因为pycharm手工创建file的时候,编码方式都是utf-8

读取和生成的编码方式都是utf-8

encoding默认值是GBK,编码方式的不一样导致了文件的出错

# encoding的默认值 GBK
with open('data_cn_1.txt', 'r', encoding='utf-8') as file:
    print("cn_1:--------")  #  文件前加一个分隔符,以便区分  
    print(file.read())

读取和写入也一样

with open('data_cn.txt', 'w', encoding='utf-8') as file:
    file.write("今天也要好好学习,ccc")


with open('data_cn.txt', 'r', encoding='utf-8') as file:
    print(file.read())

# encoding的默认值 GBK
with open('data_cn_1.txt', 'r', encoding='utf-8') as file:
    print("cn_1:--------")
    print(file.read())

4、目录操作

os
os.path

打开IDLE,按F1键打开python文档,在索引页直接搜关键字,比如搜os

os.name
nt是windows操作系统
在这里插入图片描述

os.linesep
文件结尾的换行符
在这里插入图片描述
os.sep
文件的分隔符
在这里插入图片描述
os.path
当前工作的模块的一个目录
在这里插入图片描述

4.1 os.getcwd()

查看当前程序所在的当前目录
在这里插入图片描述

判断文件是否存在,返回值是True

import os

print(os.path.exists('data.txt'))

4.2 创建目录 os.mkdir()

删除目录 os.rmdir()

若目录里面有文件,则此方法不能删除

(运用相对路径

import os


print(os.getcwd())
if not os.path.exists('dirdemo'):  #  如果目录不存在就创建
    os.mkdir('dirdemo')
else:
    os.rmdir('dirdemo')      #  如果存在就删除

在这里插入图片描述
(项目的根目录\项目的名字\项目的目录名)

绝对路径:在d盘创建新的目录

import os


print(os.getcwd())
dirpath = r'd:\dirdemo'
if not os.path.exists(dirpath):
    os.mkdir(dirpath)
else:
    os.rmdir(dirpath)

4.3 os.listdir () 列出当前目录下所有的文件和子目录

import os
filenames = os.listdir(os.getcwd())
for fname in filenames:
    print(fname)

4.4 遍历目录文件 walk

比上一个更强大,可以区分目录和文件,同时还能进行递归,继续在子目录walk,将这两个子目录继续遍历到

import os
for files in os.walk(os.getcwd()):
    print(files)

打印结果是一个元组,里面有3个元素,第一个元素是当前目录的一个绝对路径,第二个是一个列表,里面是子目录,第三个元素是所有文件名字的列表
在这里插入图片描述
上一个方法返回值是一个元组,采用序列解包将其分为3个变量,递归

import os
for dirpath, subdirs, files in os.walk(os.getcwd()):
    for name in subdirs:
        print("目录", os.path.join(dirpath, name))  # 绝对路径
    for name in files:
        print("文件",os.path.join(dirpath, name))   #  绝对路径

4.5 删除非空文件夹 shutil.rmtree()

如果想要删除的目录里有文件,则rmdir()不能将其删除

还有一个模块shutil

import shutil
shutil.rmtree()

import os
import shutil

print(os.getcwd())
dirpath = r'd:\dirdemo'
if not os.path.exists(dirpath):
    os.mkdir(dirpath)
else:
    shutil.rmtree(dirpath)

4.6 创建多层目录

mkdir()只能创建一层目录

os.makedirs()

import os
import shutil

print(os.getcwd())
dirpath = r'd:\dirdemo\subbir'
if not os.path.exists(dirpath):
    os.makedirs(dirpath)
else:
    shutil.rmtree(dirpath)

os.makedirs() 更常用

4.7 删除文件

os.remove()

import os
import shutil

print(os.getcwd())

os.remove('data_write')

但是文件不存在的话依然会报错,所以要配合文件是否存在的判断条件来使用

import os
import shutil

print(os.getcwd())

if os.path.exists('data_write'):
    os.remove('data_write')     #  如果文件存在就删除它
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值