记述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 | |