首页 > 代码库 > python文件操作

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)