目录
记述python中关于文件和目录的基本操作。
一、基本文件操作
1.文件的创建和打开
file = open(filename[,mode[,buffering]])
- file:文件对象
- filename:文件路径,字符串类型,若要打开的文件与程序文件在同一文件夹,可直接写名即可
- mode:可选参数,用来指定文件打开模式,默认为只读模式(r)
- buffering:可选参数,用于只当独写文件的缓存模式,0-不缓存,1-缓存;>1-表示缓存去的大小,默认为缓存模式。
值 | 说明 | 备注 |
---|---|---|
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
属性或方法 | 说明 | 备注 |
---|---|---|
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三个元素 |
方法 | 说明 | 备注 |
---|---|---|
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
>>>
三、高级文档操作
函数 | 说明 |
---|---|
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:绝对路径或者相对路径
属性 | 说明 |
---|---|
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
>>>