python文件操作
1. 文件的基本操作
1.1 文件的打开或创建
文件的打开或创建可以使用内置函数file(别名open)。函数声明如下:
file(name[,mode[,buffering]]) -> file object
或
open(name[,mode[,buffering]]) -> file object
其中,name表示被打开的文件名称;mode表示文件的打开模式;buffering设置缓存模式,0表示不缓存,1
表示行缓存,如果大于1表示缓冲区的大小,以字节为单位。函数返回一个file对象
文件的打开模式(mode)如下:
‘r‘ 只读方式打开(缺省,如果文件不存在,则抛出异常)
‘r+‘ 读写方式打开(如果文件不存在,则抛出异常)
‘w‘ 写入方式打开(覆盖重写全部内容,如果文件不存在,则自动创建文件)
‘w+‘ 读写方式打开(覆盖重写全部内容,如果文件不存在,则自动创建文件)
‘a‘ 写入方式打开(在文件末尾追加内容,如果文件不存在,则自动创建文件)
‘a+‘ 读写方式打开(在文件末尾追加内容,如果文件不存在,则自动创建文件)
‘b‘ 二进制模式打开。可与r、w、a、+结合使用。如:‘rb‘,‘wb‘,‘ab‘,‘rb ‘
‘U‘ 支持所有的换行符合。“\r”“\n”“\r\n”都表示换行。
注意:对于图片、视频等文件必须使用“b”模式读写。
file对象的常用属性和方法:
属性:
Closed
判断文件是否关闭,如果文件被关闭返回True
Encoding
显示文件的编码类型
Mode
显示文件的打开模式
Name
显示文件的名称
Newlines
文件使用的换行模式
方法:
flush()
把缓存区的内容写入磁盘
close()
关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成手动关闭的
习惯。如果在文件关闭后对其进行操作会抛出ValueError异常
read([size])
从文件中读取全部内容作为字符串返回。如果指定size,则从文件中读取size长度作为字符串返回,size
以byte为单位
readline([size])
从文件中读取一行作为字符串返回。如果指定size,则返回读取行的一部分
readlines([size])
从文件中读取每一行作为一个list返回。如果提供size参数,表示每次读取的字节数
seek(offset[,whence])
将文件指针移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供
了whence参数就不一定了,whence为0表示从头开始计算,1表示以当前位置开始计算,2表示以文件末尾进
行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末
尾。
tell()
返回文件指针当前位置,以文件的开头为原点
next()
返回下一行的内容,并将文件指针移到下一行。for line in file这样的语句,就是调用next()函数来实
现遍历的。
truncate([size])
删除size个字节的内容。
write(str)
把str写到文件中,write()并不会在str后加上一个换行符
writelines(seq)
把字符串序列seq的内容全部写到文件中(多行一次性写入)。这个函数也不会在str后加上一个换行符
1.2. 文件的读取
1.2.1 按行读取方式readline()
readline()每次读取文件中的一行。需要使用永真表达式循环读取文件。当文件指针移到到文件末尾,依
然使用readline()读取文件将出现错误。因此程序中需求添加一个判断语句,判断文件指针是否移到到文
件末尾,并且通过语句中断循环。
例如:
FILE=open(‘example.txt‘)
while True:
line=FILE.readline()
if line:
print(line)
else:
break
FILE.close()
1.2.2 多行读取方式readlines()
使用readlines()读取文件,需要通过循环访问readlines()返回列表[line1,line2,...lineN]里的元素。
readlines()一次可读多行数据,为避免将文件所有内容加载到内存中,常使用这种方法以提供效率。
例如:
FILE=open(‘example.txt‘)
lines=FILE.readlines()
for line in lines:
print(line)
FILE.close()
1.2.2 一次性读取方式read()
read()将从文件中读取所有内容,并赋值给一个字符串变量。
例如:
FILE=open(‘example.txt‘)
context=FILE.read()
print(context)
FILE.close()
注意:file对象内部将记录文件指针的位置,以便下次操作。只要file对象没有执行close()方法,文件指
针就不会释放。
1.3 文件的写入
单行写入方式write()
write(string)
将一个字符串写入文件,再close()关闭文件。
多行写入方式writelines()
writelines([string1,string2,…])
一次写入多行,将列表中的元素一次写入文件
注意:write()和writelines()写入前都会清楚文件中的原有内容,在重新写入新的内容,相当于“覆盖”
的方式。如果需要保留文件中的原有内容,可以使用“a+”模式打开文件。
用writelines()写文件的速度更快。如果写入文件的字符串比较多,可以使用writelines()以提高效率。
1.4 文件的删除
文件的删除要用到os模块和os.path模块。os模块提供了对系统环境、文件、目录等操作系统级的接口函数
。os模块常用的文件处理函数:
chdir(dirname)
把当前工作目录切换到dirname下
getcwd()
返回当前的工作目录路径
mkdir(path,[mode])
创建目录。mode的意义参见os.chmod(),默认是0777
makedirs(path,[mode])
和os.mkdir()类似,不过会先创建不存在的父目录。
readlink(path)
返回path这个符号链接所指向的路径
remove(path)
删除文件,不能用于删除目录
rmdir(path)
删除文件夹,不能用于删除文件
shutil.rmtree(path[,ignore_errors[,onerror]])
删除文件夹
rename(old,new)
重命名文件
stat(path)
返回path指定文件所有属性
fstat(path)
返回打开文件所有属性
statfile(filepath[,opration])
启动关联程序打开文件
tmpfile()
创建并打开(‘w+b‘)一个新的临时文件
walk()
生成一个目录树下的所有文件名
os.path模块用于处理文件和目录的路径。os.path模块常用的文件处理函数:
abspath(path)
把path转成绝对路径
dirname(p)
返回目录的路径
exists(path)
判断文件或者目录是否存在
getatime(path)
返回path所指向的文件或者目录的最后访问时间。
getmtime(path)
返回path所指向的文件或者目录的最后修改时间
getctime(path)
返回path所指向的文件的创建时间
getsize(path)
返回path所指向的文件的大小
isabs(s)
判断路径是否为绝对地址
isfile(path)
判断path所指向的是否是一个普通文件,而不是目录
isdir(path)
判断path所指向的是否是一个目录,而不是普通文件
split(path) -> (dirname,basename)
这个函数会把一个路径分离为两部分,比如:os.path.split(”/foo/bar.dat”)会返回
(”/foo”,”bar.dat”)
splitext(path)
把path分离成基本名和扩展名。比如:os.path.splitext(”/foo/bar.tar.bz2″)返回(’/foo/bar.tar’
, ‘.bz2′)。要注意它和os.path.split()的区别
splitdrive(path)
把path分离成基本名和驱动器。
walk(top,func,arg)
遍历目录数,与os.walk()功能相同
join(dirname,basename)
这个函数会把目录名和文件名组合成一个完整的路径名,比如:os.path.join(”/foo”,”bar.dat”)会
返回”/foo/bar.dat”。这个函数和os.path.split()刚好相反。
expanduser(path)
把path中包含的”~”和”~user”转换成用户目录
expandvars(path)
根据环境变量的值替换path中包含的”$name”和”${name}”,比如环境变量FISH=nothing,那
os.path.expandvars(”$FISH/abc”)会返回”nothing/abc”
normpath(path)
去掉path中包含的”.”和”..”
islink(path)
判断path所指向的是否是一个符号链接
ismount(path)
判断path所指向的是否是一个挂接点(mount point)
1.5 文件的复制和移动
复制文件可以使用shutil模块的copyfile()函数:
copyfile(src,dst)
其中,src表示源文件路径,dst表示目标文件路径
移动文件可以使用shutil模块的move()函数:
move(src,dst)
其中,src表示源文件路径,dst表示目标文件路径
1.6 文件的重命名
文件的重命名需要用到os.rename()
#修改文件名
import os
list=os.listdir(‘.‘)
if ‘example.txt‘ in list:
os.rename(‘example.txt‘,‘somename.txt‘)
1.7 文件内容的查找和替换
1.7.1 文件内容的查找
文件内容的查找需要使用re模块
re.findall(‘some pattern‘,str)
1.7.2 文件内容的替换
string.replace(‘strold‘,‘strnew‘)[.replace(‘strold‘,‘strnew‘)[…]]
1.8 配置文件的访问
配置文件ini由多个块组成,每个块由多个配置项组成。python有configparser模块用于解析配置文件
1.8.1 创建及更新配置文件
import configparser
def SaveSetting(self,section,key,values):
config = configparser.ConfigParser()
try:
INI = open(‘Setting.ini‘, ‘r+‘)
config.read(‘Setting.ini‘)
config[str(section)][str(key)]=str(values)
config.write(INI)
INI.close()
except IOError:
INI = open(‘Setting.ini‘, ‘w‘)
config[str(section)]={}
config[str(section)][str(key)]=str(values)
config.write(INI)
INI.close()
except KeyError:
INI = open(‘Setting.ini‘, ‘r+‘)
config[str(section)]={}
config[str(section)][str(key)]=str(values)
config.write(INI)
INI.close()
del config
1.8.1 读取配置文件
import configparser
def GetSetting(self,section,key):
config = configparser.ConfigParser()
try:
config.read(‘Setting.ini‘)
values = config[str(section)][str(key)]
except KeyError:
values = None
return values
2. 目录的基本操作
2.1 目录的创建和删除
os模块提供了针对目录进行操作的函数。常见目录处理函数:
mkdir(path[,mode=0777])
创建path指定的一个目录
makedirs(name,mode=511)
创建多级目录,name表示“path1/path2/…”
rmdir(path)
删除path指定的目录
removedirs(path)
删除path指定的多级目录
listdir(path)
返回path指定目录下所有的文件名
getcwd()
返回当前的工作目录
chdir(path)
将当前目录改为path指定目录
walk(top,topdown=True,onerror=None)
遍历目录树
2.2 目录的遍历
2.2.1 递归函数
import os
def VisitDir(path):
list=os.listdir(path)
for p in list:
pathname=os.path.join(path,p)
if not os.path.isfile(pathname):
VisitDir(pathname)
else:
print(pathname)
2.2.2 os.path.walk()
os.path.walk()函数声明如下:
walk(top,func,arg)
其中,top表示需要遍历的目录树的路径;func表示回调函数;arg是传输给回调函数的func的元组。例如:
import os,os.path
def VisitDir(arg,dirname,names):
for filename in names:
print(os.path,join(dirname,filepath))
path=‘D:\path‘
os.path.walk(path,VisitDir,())
2.2.3 os.walk()
os.walk()可用于目录的遍历。os.walk()比os.path.walk()效率高,而且不需要回调函数,更容易使用。os.path()声明如下:
walk(top,topdown=True,onerror=None)
其中,top表示需要遍历的目录树的路径;topdown默认值为True,表示首先返回目录树下的文件,然后再遍历目录树下的子目录,False表示顺序相反;onerror默认值为None,表示忽略目录遍历产生的错误。该函数返回一个元组,包含每次遍历的路径名、目录列表和文件列表三个元素。例如:
import os
def VisitDir(path):
for root,dirs,files in os.walk(path):
for filepath in files:
print(os.path,join(root,filepath))
path=‘D:\path‘
os.path.walk(path)