文件基本操作
文件内容操作三部曲:打开、读写、关闭
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
- 文件名指定了被打开的文件名称。
- 打开模式指定了打开文件后的处理方式。
- 缓冲区指定了读写文件的缓存模式。0表示不缓存,1表示缓存,如大于1则表示缓冲区的大小。默认值是缓存模式。
- 参数encoding指定对文本进行编码和解码的方式,只适用于文本模式,如GBK、utf8、CP936等等。
- open( )函数返回1个文件对象,该对象可以对文件进行各种操作。
如果执行正常,open()函数返回1个可迭代的文件对象,通过该文件对象可以对文件进行读写操作,如果指定文件不存在、访问权限不够、磁盘空间不够或其他原因导致创建文件对象失败则抛出异常。下面的代码分别以读、写方式打开了两个文件并创建了与之对应的文件对象。
f1 = open( 'file1.txt', 'r' )
f2 = open( 'file2.txt', 'w')
当对文件内容操作完以后,一定要关闭文件对象,这样才能保证所做的任何修改都确实被保存到文件中。
f1.close()
注意:即使写了关闭文件的代码,也无法保证文件一定能够正常关闭。例如,如果在打开文件之后和关闭文件之前发生了错误导致程序崩溃,这时文件就无法正常关闭。在管理文件对象时推荐with关键字,可以有效地避免这个问题。
用于文件内容读写时,with语句的用法如下:
with open(filename, mode, encoding) as fp:
#这里写通过文件对象fp读写文件内容的语句
另外,上下文管理语句with还支持下面的用法,进一步简化了代码的编写。
with open('test.txt', 'r') as src, open('test_new.txt', 'w') as dst:
dst.write(src.read())
文件打开方式
模式 | 说明 |
r | 读模式(默认模式,可省略),如果文件不存在则抛出异常 |
w | 写模式,如果文件已存在,先清空原有内容 |
x | 写模式,创建新文件,如果文件已存在则抛出异常 |
a | 追加模式,不覆盖文件中原有内容 |
b | 二进制模式(可与其他模式组合使用) |
t | 文本模式(默认模式,可省略) |
+ | 读、写模式(可与其他模式组合使用) |
文件级操作
- 如果需要处理文件路径,可以使用os.path模块中的对象和方法;
- 如果需要使用命令行读取文件内容可以使用fileinput模块;
- 创建临时文件和文件夹可以使用tempfile模块;
- 另外,Python 3.4之后版本的pathlib模块提供了大量用于表示和处理文件系统路径的类。
os与os.path模块
os模块常用的文件操作函数
方法 | 功能说明 |
access(path,mode) | 测试是否可以按照mode指定的权限访问文件 |
chdir(path) | 把path设为当前工作目录 |
chmod(path,mode,* ,dir_fd=None,follow_symlinks=True) | 改变文件的访问权限 |
curdir | 当前文件夹 |
environ | 包含系统环境变量和值的字典 |
extsep | 当前操作系统所使用的文件扩展名分隔符 |
get_exec_path() | 返回可执行文件的搜索路径 |
getcwd() | 返回当前工作目录 |
listdir(path) | 返回path目录下的文件和目录列表 |
mkdir(path,[mode=0777]) | 创建目录,要求上级目录必须存在 |
makedirs(path1/path2....,mode=511) | 创建多级目录,会根据需要自动创建中间缺失的目录 |
方法 | 功能说明 |
open(path, flags, mode=0o777, * , dir_fd=None) | 按照mode指定的权限打开文件,默认权限为可读、可写、可执行 |
popen(cmd, mode='r', buffering=-1) | 创建进程,启动外部程序 |
rmdir(path) | 删除目录,目录中不能有文件或子文件夹 |
remove(path) | 删除指定的文件,要求用户拥有删除文件的权限,并且文件没有只读或其他特殊属性 |
removedirs(path1/path2....) | 删除多级目录,目录中不能有文件 |
rename(src,dst) | 重命名文件或者目录,可以实现文件的移动,若目标文件已存在则抛出异常,不能跨越磁盘或分区 |
replace(old,new) | 重命名文件或目录,若目标文件已存在则直接覆盖,不能跨越磁盘或分区 |
sep | 当前操作系统所使用的路径分隔符 |
scandir(path='.') | 返回包含指定文件夹中所有DirEntry对象的迭代对象,遍历文件夹比listdir()更加高效 |
startfile(filepath [,operation]) | 使用关联的应用程序打开指定文件或启动指定应用程序 |
stat(path) | 返回文件的所有属性 |
system() | 启动外部程序 |
truncate(path,length) | 将文件截断,只保留指定长度的内容 |
walk(top,topdown=True,onerror=None) | 遍历目录树,该方法返回一个元组,包括3个元素:所有路径名、所有目录列表与文件列表 |
write(fd,data) | 将bytes对象data写入文件fd |
方法 | 功能说明 |
abspath(path) | 返回给定路径的绝对路径 |
basename(path) | 返回指定路径的最后一个组成部分 |
commonpath(paths) | 返回给定的多个路径的最长公共路径 |
commonprefix(paths) | 返回给定的多个路径的最长公共前缀 |
dirname(p) | 返回给定路径的文件夹部分 |
exists(path) | 判断文件是否存在 |
getatime(filename) | 返回文件的最后访问时间 |
getctime(filename) | 返回文件的创建时间 |
getmtime(filename) | 返回文件的最后修改时间 |
getsize(filename) | 返回文件的大小 |
isabs(path) | 判断path是否为绝对路径 |
isdir(path) | 判断path是否为文件夹 |
isfile(path) | 判断path是否为文件 |
join(path,* paths) | 连接两个或多个path |
realpath(path) | 返回给定路径的绝对路径 |
relpath(path) | 返回给定路径的相对路径,不能跨越磁盘驱动器或分区 |
samefile(f1,f2) | 测试f1和f2折两个路劲是否引用的同一个文件 |
split(path) | 以路径中的最后一个斜线为分隔符把路径分隔成两部分,以列表形式返回 |
splitext(path) | 从路径中分隔文件的扩展名 |
splitdrive(path) | 从路径中分隔驱动器的名称 |
目录操作部分示例
>>> import os
>>> os.getcwd() #返回当前工作目录
'C:\\Python35'
>>> os.mkdir(os.getcwd()+'\\temp') #创建目录
>>> os.chdir(os.getcwd()+'\\temp') #改变当前工作目录
>>> os.getcwd()
'C:\\Python35\\temp'
>>> os.mkdir(os.getcwd()+'\\test')
>>> os.listdir('.')
['test']
>>> os.rmdir('test') #删除目录
>>> os.listdir('.')
[]
思考:
Q:自定义声明一个函数,要求传入一个参数,该参数为指定路径,然后执行结果可得到指定路径的下的所有目录和文件信息
R:参考答案:
import os
def visitDir2(path):
if not os.path.isdir(path):
print('Error:"',path,'" is not a directory or does not exist.')
return list_dirs = os.walk(path) #os.walk返回一个元组,包括3个元素:所有路径名、所有目录列表与文件列表
for root, dirs, files in list_dirs: #遍历该元组的目录和文件信息
for d in dirs:
print(os.path.join(root, d)) #获取完整路径
for f in files:
print(os.path.join(root, f)) #获取文件绝对路径
visitDir2('f:\\html')
shutil模块使用
高级的文件,文件夹,压缩包的处理模块,也主要用于文件的拷贝
拷贝文件
import shutil
shutil.copyfile('f1.log','f2.log')
拷贝文件和权限
import shutil
shutil.copy('f1.log', 'f2.log')
拷贝状态的信息,包括:mode bits,atime,mtime,flags
import shutil
shutil.copystat('f1.log', 'f2.log')
递归的去拷贝文件
import shutil
shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
递归的去删除文件
import shutil
shutil.rmtree('folder1')
递归的去移动文件(重命名)
import shutil
shutil.move('folder1', 'folder3')
创建压缩包并返回文件路径,例如:zip、tar
import shutil
z = shutil.make_archive('presly', 'gztar', root_dir='D:\软件下载')