《2022年python文件操作 .pdf》由会员分享,可在线阅读,更多相关《2022年python文件操作 .pdf(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、一、 python 文件操作1.import glob 目录操作查看目录内容:filelist=glob.glob( *.* )filelist=glob.glob( c:* )查看指定类型的文件:filelist=glob.glob( c:*.sys)为了显示一个目录中的全部文件,可以使用如下所示的os.listdir 函数:files = os.listdir(r C:intro ) #适用于Windows files = os.listdir(/home/hpl/scripting/src/py/intro) # 适用于 Unix files = os.listdir(d:python2
2、6) files=os.listdir(c:) # 跨平台版本 : files = os.listdir(os.path .join(os.environscripting,src , py, intro)files = os.listdir(os.curdir) # 当前目录中的所有文件files = glob.glob(*) + glob.glob(.* )二、测试文件类型我们知道, 文件名、 目录名和链接名都是用一个字符串作为其标识符的,但是给我们一个标识符,我们该如何确定它所指的到底是常规文件文件名、目录名还是链接名呢?这时,我们可以使用os.path模块提供的isfile 函数、 i
3、sdir 函数和 islink 函数来达成我们的目标,如下所示:print myfile, 是一个 ,if os.path.isfile(myfile): print plain fileif os.path.isdir(myfile): print directoryif os.path.islink(myfile): print link 您还可以查找文件的日期及其大小:time_of_last_access = os.path.getatime(myfile) time_of_last_modification = os.path.getmtime(myfile) size = os.p
4、ath.getsize(myfile) 三 文件时间time_of_last_access = os.path.getatime(myfile) time_of_last_modification = os.path.getmtime(myfile) size = os.path.getsize(myfile) 这里的时间以秒为单位,并且从1970 年 1 月 1 日开始算起。为了获取以天为单位的最后访问日期,可以使用下列代码:import time # time.time() 返回当前时间age_in_days = (time.time()-time_of_last_access)/(60*
5、60*24) 四 文件详细信息为了获取文件的详细信息,可以使用os.stat 函数和 stat 模块中的其它实用程序来达到目的,如下:import stat 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 6 页 - - - - - - - - - myfile_stat = os.stat(myfile) size = myfile_statstat.ST_SIZE mode = myfile_statstat.ST_MODE if stat.S_ISREG(mode)
6、: print %(myfile)是一个常规文件,大小为%(size)d 字节 % vars() 有关 stat 模块的详细信息,请参见Python Library Reference 。若想测试一个文件的读、写以及执行权限,可以用os.access函数,具体如下所示:if os.access(myfile, os.W_OK): print myfile, 具有写权限 if os.access(myfile, os.R_OK | os.W_OK | os.X_OK): print myfile, 具有读、写以及执行权限像上面这样的测试代码,对CGI 脚本来说非常有用。五、文件和目录的删除若要删
7、除单个文件的话,可以使用os.remove 函数,例如:os.remove( mydata.dat )。Os.remove 的别名是 os.unlink,不过后者跟传统的UNIX 操作系统以及Perl 中清除文件的函数重名。 我们可以使用下列方式来删除一组文件,如所有以 .jpg 以及 *.gif 为扩展名的文件:for file in glob.gl ob(*.jpg ) + glob.glob(*.gif):os.remove(file) 大家知道,只有当目录中内容已经被清空的时候,我们才可以使用rmdir 命令来删除该目录。不过,我们经常想要删除一个含有许多文件的目录树,这时我们可以使用
8、shutil 模块提供的 rmtree 函数,如下所示:shutil.rmtree(mydir )它相当于UNIX 操作系统中的命令rm -rf mydir 。我们可以建立一个自定义函数,使其在进行删除操作的时候将文件和目录做同等对待,其典型用法如下所示:remove(my.dat) #删除当个文件my.dat remove(mytree) #删除单个目录树mytree # 通过字符串列表中的名称来删除多个文件/目录树:remove(glob.glob(*.tmp ) + glob.glob(*.temp )remove( my.dat , mydir , yourdir + glob.glo
9、b(*.data )# -*- coding: UTF-8 -*- 六、文件的复制与重命名当我们要复制文件的时候,可以使用shutil 模块:import shutil shutil.copy(myfile, tmpfile) #拷贝最后访问时间和最后修改时间:shutil.copy2(myfile, tmpfile) # 拷贝一个目录树:shutil.copytree(root_of_tree, destination_dir, True) Copytree 的第三个参数规定对符号链接的处理,其中True 表示保留符号链接;而 False则意味着使用文件的物理副本替代符号链接。Python
10、语言能够很好地支持路径名的跨平台组成:Os.path.join 能使用正确的分界符(在UNIX和 Mac OS X 操作系统中使用/,在Windows 上使用 )来联接目录和文件名,变量名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 6 页 - - - - - - - - - os.curdir 和 os.pardir 分别表示当前工作目录及其父目录。像下面的 UNIX 操作系统命令cp ././f1.c . 可以使用Python 语言提供一个跨平台的实现:shutil.
11、copy(os.path.join(os.pardi r,os.pardir,f1.c ), os.curdir)Os 模块中的 rename 函数通常被用于重命名一个文件:os.rename(myfile, tmp.1) # 将 myfile 重命名为 tmp.1这个函数也可用来在相同的文件系统之内移动文件。这里, 我们将 myfile 移动到目录d下面:os.rename(myfile, os.path.join(d, myfile) 在跨文件系统移动文件的时候,可以先使用shutil.copy2 来复制文件,然后再删除原来的副本即可,如下:shutil.copy2(myfile, os.
12、path.join(d, myfile) os.remove(myfile) 后面这种移动文件的方法是最安全的。copymode(sor,sten) 七 、分解路径名假设我们使用变量fname 来存放一个包含完整路径的文件名,例如:/usr/home/hpl/scripting/python/intro/hw.py 有 时 候 , 我 们 需 要 将 这 样 的 文 件 路 径 拆 分 为 基 本 名 称hw.py和 目 录 名/usr/home/hpl/scripting/python/intro 。在 Python 语言中,可以使用下列代码达到目的:basename = os.path.b
13、asename(fname) dirname = os.path.dirname(fname) # 或dirname, basename = os.path.split(fname) 扩展名是通过os.path.splitext 函数提取出来的,root, extension = os.path.splitext(fname) 这样, fname 中的扩展名部分即.py 被赋给变量extension, 而其余部分则赋给了变量root。如果想得到不带点号的扩展名的话,只需使用os.path.splitext(fname)11: 即可。假设一个文件名为f,其扩展名随意,若想将其扩展名改为ext,可
14、以使用下面的代码:newfile = os.path.splitext(f)0 + ext 下面是一个具体的示例: f = /some/path/case2.data_source moviefile = os.path.basename(os.path.splitext(f)0 + .mpg) moviefile case2.mpg八、目录的创建和移动Os 模块中的函数mkdir 可以用来创建目录,而chdir 函数则可以移动目录,如下:origdir = os.getcwd() # 将当前位置记下来newdir = os.path.join(os.pardir, mynewdir)if n
15、ot os.path.isdir(newdir): os.mkdir(newdir) # 或者 os.mkdir(newdir,0755)os.chdir(newdir) os.chdir(origdir) # 返回原目录名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 6 页 - - - - - - - - - os.chdir(os.environHOME) # 移到主目录假设我们想要在自己的主目录下创建一个新目录py/src/test1,但是目前py、src 和 te
16、st1都不存在。 如果使用mkdir 命令来创建的话,需要使用三次才能建好这个嵌套的目录,但是使用 Python 语言提供的os.makedirs 命令的话,则无需这样麻烦了,该命令可以一次建好整个目录:os.makedirs(os.path.join(os.environHOME, py, src , test1 )九、遍历目录树下面的函数调用os.path.walk(root, myfunc, arg) 将遍历 root 目录树 ;然后,对每个目录名dirname 分别调用myfunc(arg, dirname, files) 即可, 这里参数files 是 dir 中的文件名列表(可通过
17、调用os.listdir(dirname) 来获得 );arg 是用户从调用代码中传递来的参数。对于UNIX操作系统用户来说, Python 语言中 跨平台的os.path.walk 相当于 Unix 命令 find。在解释 os.path.walk 的用法的时候,人们常使用写出主目录中所有子目录内的文件的名称为例进行说明。当然,我们也可以在一个交互式的Python 命令行中使用下列代码段来体会 os.path.walk 的使用:def ls(arg, dirname, files): print dirname , has the files, filesos.path.walk(os.en
18、vironHOME, ls, None)本例中,参数arg 并非必需,所以在os.path.walk 调用中让其取值为None 即可。为了列出主目录中所有大于1Mb 的文件,可以使用下面的代码:def checksize1(arg, dirname, files): for file in files: filepath = os.path.join(dirname, file) if os.path.isfile(filepath): size = os.path.getsize(filepath) if size 1000000: size_in_Mb = size/1000000.0 a
19、rg.append(size_in_Mb, filename) bigfiles = root = os.environHOMEos.path.walk(root, checksize1, bigfiles) for size, name in bigfiles: print name, 大小为 , size, Mb 现在,我们使用arg 来建立一个数据结构,这里是一个2 元组构成的列表,其中每个2元组存放文件的尺寸(以 MB 为单位 )和完整的文件路径。如果用于所有目录的函数调用中都要更改 arg 的话,那么arg 必须是一个可变的数据结构,即允许适当地进行修改。参数 dirname 是当前
20、正在访问的目录的绝对路径,而参数files 内的文件名则是相对于dirname 的相对路径。在此期间,当前工作目录并没有改变,那就是说该脚本仍然呆在脚本启动时刻所在的目录中。这就是为什么我们需要把filepath 弄成带有dirname 和 file 的绝对路径的原因。若要改变当前工作目录为dirname,只要在针对每个目录调用os.path.walk 的函数中调用一下os.chdir(dirname) ,然后在该函数的末尾重新调用os.chdir(dirname) 将当前工作目录改回原值即可,如下所示:def somefunc(arg, dirname, files): 名师资料总结 - -
21、 -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 6 页 - - - - - - - - - origdir = os.getcwd(); os.chdir(dirname) os.chdir(origdir) os.path.walk(root, somefunc, arg) 当然,如果您愿意也可以编写具有类似功能的代码来替代os.path.walk。下面的代码,将针对每个文件而非每个目录来调用的自定义函数,如下所示:def find(func, rootdir, arg=None): #
22、对 rootdir 目录中的每个文件调用func files = os.listdir(rootdir) # 获取 rootdir 目录中的所有文件files.sort(lambda a, b: cmp(a.lower(), b.lower() for file in files: fullpath = os.path.join(rootdir, file) if os.path.islink(fullpath): pass elif os.path.isdir(fullpath): find(func, fullpath, arg) elif os.path.isfile(fullpath)
23、: func(fullpath, arg) else: print find: cannot treat , fullpath上面的函数find 可以从 scitools 模块中获取。 与内置函数os.path.walk 相反,我们的 find函数以大小写敏感的字母顺序来访问文件和目录。我们可以使用find 函数来列出所有大于1Mb 的文件:def checksize2(fullpath, bigfiles): size = os.path.getsize(fullpath) if size 1000000: bigfiles.append(%.2fMb %s % (size/1000000.
24、0, fullpath)bigfiles = root = os.environHOMEfind(checksize2, root, bigfiles) for fileinfo in bigfiles: print fileinfo 参数 arg 带来了巨大的灵活性。 我们可以使用它来同时存放输入数据和生成的数据结构。下一个范例将收集所有大于一定尺寸的带有规定扩展名的文件的文件名和大小。输出的结果按照文件大小排列。bigfiles = filelist: , # 文件名和大小列表extensions : ( .*ps , .tiff, .bmp),size_limit: 1000000, #
25、 1 Mb find(checksize3, os.environHOME, bigfiles)def checksize3(fullpath, arg): treat_file = False ext = os.path.splitext(fullpath)1 import fnmatch # Unix的 shell 风格的通配符匹配名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 6 页 - - - - - - - - - for s in argextensions
26、:if fnmatch.fnmatch(ext, s): treat_file = True # fullpath带有正确的扩展名size = os.path.getsize(fullpath) if tr eat_file and size argsize_limit:size = %.2fMb % (size/1000000.0) # 打印arg filelist.append( size : size, name : fullpath)# 按照大小排列文件def filesort(a, b): return cmp(float(asize :-2), float(bsize :-2) b
27、igfilesfilelist.sort(filesort)bigfilesfilelist.reverse()for fileinfo in bigfilesfilelist:print fileinfoname , fileinfosize 注意为列表排序的函数,bigfilesfilelist函数中的每个元素就是一个字典,键 size 保存着一个字符串,不过在进行比较之前我们必须将单位Mb( 最后两个字符)去掉,并将其转换为浮点数名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 6 页 - - - - - - - - -