Python学习笔记-文件及文件夹操作

目录

一、基本文件操作

1.文件的创建和打开

1.1 打开一个不存在的文件时先创建该文件

1.2 打开二进制文件

1.3 打开文件时指定编码格式

2.关闭文件

3.使用with语句

4.写入文件内容

5.读取文件

5.1 读取指定字符

5.2 读取一行

5.3读取全部行

二、文件夹操作

1. os和os.path模块

2.路径

2.1 相对路径

2.2 绝对路径

2.3 拼接路径

3 判断路径是否存在

4.创建目录

4.1 创建一级目录

4.2 创建多级目录

5.删除目录

6.遍历目录

三、高级文档操作

1.删除文件

2.重命名文件和目录

3.获取文件基本信息


记述python中关于文件和目录的基本操作。

一、基本文件操作

1.文件的创建和打开

file = open(filename[,mode[,buffering]])
  • file:文件对象
  • filename:文件路径,字符串类型,若要打开的文件与程序文件在同一文件夹,可直接写名即可
  • mode:可选参数,用来指定文件打开模式,默认为只读模式(r)
  • buffering:可选参数,用于只当独写文件的缓存模式,0-不缓存,1-缓存;>1-表示缓存去的大小,默认为缓存模式。
mode参数值
说明备注
r只读模式,文件指针放在文件开头文件不存在时会报错
rb只读模式读取二进制格式文件,文件指针指向开头

文件不存在时会报错

一般用来读取图片、声音等非文本文件

r+打开文件后读取文件内容,亦可从头开始覆盖原有内容,指针放在文件开头文件不存在时会报错
rb+读写模式、二进制格式打开文件,文件指针放在开头

文件不存在时会报错

一般用来读取图片、声音等非文本文件

w只写模式文件存在时覆盖,否则创建新文件。
wb只写模式、二进制格式打开文件
w+打开并清空原有文件,然后进行读写
wb+二进制格式打开文件,然后进行读写
a

添加模式打开文件。

文件存在时,指针放在文件末尾;

文件不存在时,创建文件用于写入;

ab

添加模式,以二进制格式打开文件;

文件存在时,指针放在文件末尾;

文件不存在时,创建文件用于写入;

a+

读写模式打开。

文件存在时,指针放在文件末尾;

文件不存在时,创建文件用于写入;

ab+

添加模式,以二进制格式打开文件;

文件存在时,指针放在文件末尾;

文件不存在时,创建文件用于写入;

1.1 打开一个不存在的文件时先创建该文件

使用open()打开文件。mode配置为w、w+、a、a+模式,文件不存在时直接创建。

示例1 文件不存在时直接报错

# _*_ coding:utf-8 _*_


file = open("new file.txt")
    
print(file)

结果:

========================== RESTART: D:\Desktop\Demo.py =========================
# 没有文件时
Traceback (most recent call last):
  File "D:\Desktop\Demo.py", line 4, in <module>
    file = open("new file.txt")
FileNotFoundError: [Errno 2] No such file or directory: 'new file.txt'
>>> 
========================== RESTART: D:\Desktop\Demo.py =========================
# 手动创建了文件

<_io.TextIOWrapper name='new file.txt' mode='r' encoding='cp936'>
>>> 

示例2 没有文件时,使用a模式打开

# _*_ coding:utf-8 _*_


file = open("new file.txt",'a')
    
print(file)

结果:

<_io.TextIOWrapper name='new file.txt' mode='a' encoding='cp936'>
>>> 

在目录中自动创建了一个文件夹。

1.2 打开二进制文件

使用二进制格式打开一个非文本文件。

示例:

# _*_ coding:utf-8 _*_


file = open("19.jpeg5",'ab')
    
print(file)

结果:

<_io.BufferedWriter name='19.jpeg5'>
>>> 

1.3 打开文件时指定编码格式

使用encoding指定文件编码格式。

file = open(filename,mode,encoding = "encoding")

未配置encoding时默认为打开“GBK”格式的文件,格式不对时报错(实测貌似都可以正常打开,不过文件内容没有检查,不知道会不会乱码,待确定)。

示例:

# _*_ coding:utf-8 _*_

file = open("utf-8.txt",'r')
print("Default:",file)
file = open("utf-8.txt",'r',encoding="GBK")
print("GBK:",file)
file = open("utf-8.txt",'r',encoding="utf-8")
print("UTF-8:",file)

结果:

Default: <_io.TextIOWrapper name='utf-8.txt' mode='r' encoding='cp936'>
GBK: <_io.TextIOWrapper name='utf-8.txt' mode='r' encoding='GBK'>
UTF-8: <_io.TextIOWrapper name='utf-8.txt' mode='r' encoding='utf-8'>
>>> 

实测默认编码格式为“cp936”(也就是GBK编码)

utf-8的文件格式,可以使用gbk,utf-8正常打开(可能因为系统时win10的所以没有报错,不过预计文件会乱码,带后续确认)

2.关闭文件

file.close()

先刷新缓冲区中还没有写入的信息,将未写入到文件的内容写入到文件,然后关闭文件。

3.使用with语句

使用with语句,可以保证打开文件后,执行完毕后无论是否抛出异常都释放文件资源,避免遇到非预期异常。

with expression as target:
    with-body
  • expression:表达式
  • target:变量,用来指定表达式结果
  • with-body:操作代码块

示例:

# _*_ coding:utf-8 _*_

with open("utf-8.txt",'r') as file:
    print("Default:",file)

结果:

Default: <_io.TextIOWrapper name='utf-8.txt' mode='r' encoding='cp936'>
>>> 

4.写入文件内容

file.write(string)
  • file:要写入的文件对象
  • file需要是以支持写入的模式(w,a)打开的文件,否则会报错;
  • 写入完毕后需要调用close()方法关闭文件,否则内容不会写入文件;
  • 可以使用flush()方法将缓存区内容写入文件,不用调用close()方法。

示例1,写入未调用close():

# _*_ coding:utf-8 _*_

file = open("utf-8.txt",'a')
print("Open default:",file)
file.write("我进来了")
file.write("我出来了")
file.write("我又进来了")
file.write("我又出来了")
file.write("我又进来了")
file.write("我又出来了")

结果:

 文件内容未保存,关闭后才会保存

示例2,使用flush()保存缓存:

# _*_ coding:utf-8 _*_

file = open("utf-8.txt",'a')
print("Open default:",file)
file.write("我进来了")
file.write("我出来了")
file.flush()
file.write("我又进来了")
file.write("我又出来了")
file.write("我又进来了")
file.write("我又出来了")

 结果:

示例3:使用close():

# _*_ coding:utf-8 _*_

file = open("utf-8.txt",'a')
print("Open default:",file)
file.write("我进来了")
file.write("我出来了")
file.write("我又进来了")
file.write("我又出来了")
file.close()
file.write("我又进来了")
file.write("我又出来了")

结果:

Open default: <_io.TextIOWrapper name='utf-8.txt' mode='a' encoding='cp936'>
Traceback (most recent call last):
  File "D:\Desktop\Demo.py", line 10, in <module>
    file.write("我又进来了")
ValueError: I/O operation on closed file.
>>> 

 close()之后将文件保存到文件中,之后再次写入文件会报错ValueError。

5.读取文件

5.1 读取指定字符

file.read([size])
  • file:已打开的文件对象
  • size:可选参数,用于指定读取的字符个数,如省略,则一次性读取所有内容
  • 文件打开模式必须是可读的,如r,r+模式
  • 打开文件后多次调用read()会自动往后读取

示例:

# _*_ coding:utf-8 _*_

file = open("utf-8.txt",'r')
print("Open default:",file)

print('file.read(5")',file.read(5))
print('file.read(20)',file.read(20))
print('file.read()',file.read())

结果:

========================== RESTART: D:\Desktop\Demo.py =========================
Open default: <_io.TextIOWrapper name='utf-8.txt' mode='r' encoding='cp936'>
file.read(5") 今天是星期
file.read(20) 一,苦难开始了
今天是星期二,放假还四天
file.read() 
今天是星期三,妖秀第三天
今天是星期四,还有两天了
今天是星期五,终于要放了
>>> 

可以使用seek()方法将指针指向指定的位置,然后在用read读取需要的内容。

file.seek(offset[,whence])
  • file:已打开的文件
  • offset:指定移动的字符个数,其具体位置与whence有关,注意中文编码gbk占2个,utf-8占三个
  • whence:用于指定开始计数的位置,0表示从头开始计算,1表示从当前位置开始,2表示从文件尾部开始计算,默认值为0
  • whence只支持b模式(即rb),若非b模式只能从头开始计算

5.2 读取一行

file.readline()

5.3读取全部行

file.readlines()
  • 返回字符串列表

二、文件夹操作

1. os和os.path模块

使用import导入os模块,即可使用os和os.path模块对文件夹进行操作。

import os
os模块常用属性和方法
属性或方法说明备注
name用于获取操作系统类型

nt:windows系统

posix:Linux、Unix、MacOs系统

linesep获取当前系统的换行符windows:‘\r\n’
sep获取当前系统的路径分隔符windwos:'\\'
getcwd()返回当前工作目录
listdir(path)返回指定路径下的文件和目录信息
mkdir(path[,mode])创建目录
makedirs(path1/path2...[,mode])创建多级目录
rmdir(path)删除目录
removedirs(path1/path2...)删除多级目录
chdir(path)把path设置为当前工作目录
walk(top[,topdown[,onerror]])遍历目录数,返回一个元组,包括所有路径名、所有目录列表、和文件列表3三个元素
os.path模块常用操作
方法说明备注
abspath(path)获取文件或目录的绝对路径
exists(path)用于判断目录或文件是否存在,存在返回True,否则返回False
join(path,name)将目录与目录或者文件名拼接起来
spiltext()分离文件名或扩展名

baesname(path)

从目录中提取文件名
dirname(path)从一个路径中提取文件路径,不包括文件名
isdir(path)判断路径是否有效

2.路径

2.1 相对路径

python中使用os.getcwd()获取当前工作目录。

os.getcwd()            # 获取当前工作目录

# 工作目录下的文件直接使用文件名
filename.filetype


# 工作目录下文件夹里的文件,"\"需要使用转义字符"\\"或使用"/"替代
folder/filename.filetype        
    

2.2 绝对路径

os.path.abspath(path)
  • path:为要获取绝对路径的相对路径,可以是文件也可以是目录

2.3 拼接路径

os.path.join(path1[,path2[,...]])
  • 不同路径用逗号分隔
  • 如果没有一个绝对路径,那拼接出来的就是相对路径
  • 拼接路径时不会检测路径是否存在
  • 多个绝对路径时,会保留最后一个绝对路径,该路径之前的参数都会忽略
  • 多路径拼接不建议使用字符串拼接,可以避免不同操作系统间隔符不一样的问题

3 判断路径是否存在

os.path.exists(path)
  • path:为目标路径,可以采用绝对路径或相对路径
  • 路径存在返回True,不存在返回False
  • 亦可以判定文件是否存在

4.创建目录

4.1 创建一级目录

os.mkdir(path,mode=0o777)
  • path:用于指定要创建的目录,可以是绝对路径或相对路径
  • mode:用于指定数值模式,默认值为0777,非UNIX系统上无效或被忽略
  • 只能创建一级目录,若上级目录不存在时报错FileNotFoundError异常
  • 若路径已存在时则报FileExistsError异常。

4.2 创建多级目录

os.makedirs(path,mode=0o777)
  • path:用于指定要创建的目录,可以是绝对路径或相对路径
  • mode:用于指定数值模式,默认值为0777,非UNIX系统上无效或被忽略

5.删除目录

os.rmdir(path)
  • path:用于指定要创建的目录,可以是绝对路径或相对路径
  • 只有当删除的目录为空时才起作用
  • 指挥删除目录下的空目录
  • 目录不存在时会抛出FileNotFoundError异常

删除非空目录可参考如下目录:

import shutil
shutil.rmtree(path)
  • path:用于指定要创建的目录,可以是绝对路径或相对路径
  • 删除最后一级目录的子目录及其内容

6.遍历目录

os.walk(top[,topdown][,onerror][,followlinks])
  • top:指定要遍历内容的根目录
  • topdown:可选参数,指定便利的顺序,True为自上而下,False为自下而上遍历,默认值为True
  • onerror:可选参数,设置错误处理方式,默认为忽略,也可以指定错误处理方式
  • followlinks:可选参数,默认为False,不向下转换撑解析到目录的符号链接;设置为True,表示在指定系统上访问由符号链接指向的目录。
  • 返回值:返回一个3元素元组生成器对象(dirpath,dirnames,filenames),存在多个目录时会返回元组列表。dirpath为当前遍历的路径,是一个字符串;dirnames表示当前路径下的子目录,是一个列表;filenames为当前路径下包含的文件,也是一个列表。
  • walk函数只在Unix系统和Windows系统中有效。
  • 返回值是生成器对象,不能直接使用len()计算长度,否则会报错“TypeError: object of type 'generator' has no len()”。

示例:

# _*_ coding:utf-8 _*_

import os

path = r"D:\Pictures"
print(f"根目录为:{path}")

walkresult = os.walk(path,topdown=True)

for index,(rootpath,dirpaths,filenames) in enumerate(walkresult):
    print(f"Index:{index}")
    print(f"Root path:{rootpath}")
    for dirpath in dirpaths:
        print(f" ○ Folde:{dirpath}")
    for filename in filenames:
        print(f" ● File :{filename}")

结果:

根目录为:D:\Pictures
Index:0
Root path:D:\Pictures
 ○ Folde:Camera Roll
 ○ Folde:Saved Pictures
 ○ Folde:各种图标
 ○ Folde:山水图片
 ● File :desktop.ini
 ● File :道.jpeg
Index:1
Root path:D:\Pictures\Camera Roll
 ● File :desktop.ini
Index:2
Root path:D:\Pictures\Saved Pictures
 ● File :desktop.ini
Index:3
Root path:D:\Pictures\各种图标
 ● File :CE.png
 ● File :IVD.jpg
 ● File :IVD.png
 ● File :LOT.png
 ● File :LOT白底.png
 ● File :PCR-Fluo Name.jpg
 ● File :RedOrange  Logo.png
 ● File :RedOrange logo icon.ico
 ● File :RedOrange Logo with Name.png
 ● File :Warning.png
 ● File :停止.png
 ● File :储藏温度.png
 ● File :储藏温度白底.png
 ● File :开始.png
 ● File :有效期.png
 ● File :有效期白底.png
 ● File :林民锋 签名.png
 ● File :沈义峰 签名.png
 ● File :注意高温.png
 ● File :测试数量.png
 ● File :设置.png
Index:4
Root path:D:\Pictures\山水图片
 ● File :19.jpeg
 ● File :山水10.jpeg
 ● File :山水11.jpeg
 ● File :山水12.jpeg
 ● File :山水13.jpeg
 ● File :山水14.jpeg
 ● File :山水15.jpeg
 ● File :山水16.jpeg
 ● File :山水17.jpeg
 ● File :山水18.jpeg
 ● File :山水2.jpeg
 ● File :山水3.jpeg
 ● File :山水4.jpeg
 ● File :山水5.jpeg
 ● File :山水6.jpeg
 ● File :山水7.jpeg
 ● File :山水8.jpeg
 ● File :山水9.jpeg
 ● File :绿色山水护眼.jpeg
>>> 

三、高级文档操作

os模块与文件相关的常用函数
函数说明
access(path,accessmode)

确认文件是否有指定的访问权限(读取、写入、执行权限)。

accessmode的值:R_OK(读取),W_OK(写入),X_OK(执行),F_OK(存在),有权限返回1,否则返回0.

chmod(path,mode)修改path文件的访问权限
remove(path)删除path指定的文件路径
rename(src,dst)重命名src为dsc
stat(path)返回指定文件的信息
startfile(path[,operation])

使用关联的应用程序打开path指定的文件

1.删除文件

os.remove(path)
  • 删除指定文件,可以使用相对路径也可以使用绝对路径
  • 若文件不存在时报错:FileNotFoundError

2.重命名文件和目录

os.rename(src,dst)
  • src:要重命名的目录或文件路径,相对路径或绝对路径
  • dst:重命名后的目录或文件路径,相对路径i或绝对路径
  • 若文件或目录不存在时报错:FileNotFoundError
  • 重命名目录时只能修改最后一级的目录,否则会报错

3.获取文件基本信息

os.stat(path)
  • 返回的是一个对象,可以通过属性访问具体信息
  • path:绝对路径或者相对路径
stat()返回对象的常用属性
属性说明
st_mode保护模式
st_ino索引号
st_nlink硬链接号(被连接数目)
st_size文件大小
st_mtime最后一次修改时间
st_dev设备名
st_uid用户id
st_gid组id
st_atime最后一次访问时间
st_ctime

最后一次状态变化的时间(不同系统,返回结果不一样)

windows下返回文件的创建时间

示例:

# _*_ coding:utf-8 _*_

import os

path = r"utf-8.txt"
print(f"目录为:{os.path.abspath(path)}")

fileinfo = os.stat(path)
print("fileinfo:\t{}".format(fileinfo))
print("fileinfo.st_mode:\t{}".format(fileinfo.st_mode))
print("fileinfo.st_ino:\t{}".format(fileinfo.st_ino))
print("fileinfo.st_nlink:\t{}".format(fileinfo.st_nlink))
print("fileinfo.st_size:\t{}".format(fileinfo.st_size))
print("fileinfo.st_mtime:\t{}".format(fileinfo.st_mtime))
print("fileinfo.st_dev:\t{}".format(fileinfo.st_dev))
print("fileinfo.st_uid:\t{}".format(fileinfo.st_uid))
print("fileinfo.st_gid:\t{}".format(fileinfo.st_gid))
print("fileinfo.st_atime:\t{}".format(fileinfo.st_atime))
print("fileinfo.st_ctime:\t{}".format(fileinfo.st_ctime))

结果:

========================== RESTART: D:\Desktop\Demo.py =========================
目录为:D:\Desktop\utf-8.txt
fileinfo:	os.stat_result(st_mode=33206, st_ino=19703248370470764, st_dev=2390029000, st_nlink=1, st_uid=0, st_gid=0, st_size=128, st_atime=1671090658, st_mtime=1671090658, st_ctime=1671086652)
fileinfo.st_mode:	33206
fileinfo.st_ino:	19703248370470764
fileinfo.st_nlink:	1
fileinfo.st_size:	128
fileinfo.st_mtime:	1671090658.075006
fileinfo.st_dev:	2390029000
fileinfo.st_uid:	0
fileinfo.st_gid:	0
fileinfo.st_atime:	1671090658.075006
fileinfo.st_ctime:	1671086652.1908576
>>> 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鱼听禅

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

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

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

打赏作者

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

抵扣说明:

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

余额充值