文件基本操作

文件内容操作三部曲:打开、读写、关闭

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:\软件下载')